| @@ -44,9 +44,40 @@ public class CssParseServer { | |||||
| parseFontAttr(mapStyle); | parseFontAttr(mapStyle); | ||||
| getBackground(mapStyle); | |||||
| return mapToCellStyleEntity(mapStyle); | return mapToCellStyleEntity(mapStyle); | ||||
| } | } | ||||
| private CellStyleEntity mapToCellStyleEntity(Map<String, String> mapStyle) { | |||||
| CellStyleEntity entity = new CellStyleEntity(); | |||||
| entity.setAlign(mapStyle.get(TEXT_ALIGN)); | |||||
| entity.setVetical(mapStyle.get(VETICAL_ALIGN)); | |||||
| entity.setBackground(getBackground(mapStyle)); | |||||
| entity.setHeight(mapStyle.get(HEIGHT)); | |||||
| entity.setWidth(mapStyle.get(WIDTH)); | |||||
| entity.setFont(getCssStyleFontEnity(mapStyle)); | |||||
| entity.setBackground(mapStyle.get(BACKGROUND_COLOR)); | |||||
| // TODO 这里较为复杂,后期处理 | |||||
| /*CellStyleBorderEntity border = new CellStyleBorderEntity(); | |||||
| entity.setBorder(border); | |||||
| border.setBorderBottom(borderBottom);*/ | |||||
| return entity; | |||||
| } | |||||
| private CssStyleFontEnity getCssStyleFontEnity(Map<String, String> style) { | |||||
| CssStyleFontEnity font = new CssStyleFontEnity(); | |||||
| font.setStyle(style.get(FONT_STYLE)); | |||||
| int fontSize = PoiCssUtils.getInt(style.get(FONT_SIZE)); | |||||
| if (fontSize > 0) { | |||||
| font.setSize(fontSize); | |||||
| } | |||||
| font.setWeight(style.get(FONT_WEIGHT)); | |||||
| font.setFamily(style.get(FONT_FAMILY)); | |||||
| font.setDecoration(style.get(TEXT_DECORATION)); | |||||
| font.setColor(style.get(COLOR)); | |||||
| return font; | |||||
| } | |||||
| private void parseFontAttr(Map<String, String> mapRtn) { | private void parseFontAttr(Map<String, String> mapRtn) { | ||||
| log.debug("Parse Font Style."); | log.debug("Parse Font Style."); | ||||
| @@ -152,56 +183,26 @@ public class CssParseServer { | |||||
| } | } | ||||
| } | } | ||||
| private CellStyleEntity mapToCellStyleEntity(Map<String, String> mapStyle) { | |||||
| CellStyleEntity entity = new CellStyleEntity(); | |||||
| entity.setAlign(mapStyle.get(TEXT_ALIGN)); | |||||
| entity.setVetical(mapStyle.get(VETICAL_ALIGN)); | |||||
| entity.setBackground(getBackground(mapStyle)); | |||||
| entity.setHeight(mapStyle.get(HEIGHT)); | |||||
| entity.setWidth(mapStyle.get(WIDTH)); | |||||
| entity.setFont(getCssStyleFontEnity(mapStyle)); | |||||
| // TODO 这里较为复杂,后期处理 | |||||
| /*CellStyleBorderEntity border = new CellStyleBorderEntity(); | |||||
| entity.setBorder(border); | |||||
| border.setBorderBottom(borderBottom);*/ | |||||
| return entity; | |||||
| } | |||||
| private CssStyleFontEnity getCssStyleFontEnity(Map<String, String> style) { | |||||
| CssStyleFontEnity font = new CssStyleFontEnity(); | |||||
| font.setStyle(style.get(FONT_STYLE)); | |||||
| int fontSize = PoiCssUtils.getInt(style.get(FONT_SIZE)); | |||||
| if (fontSize > 0) { | |||||
| font.setSize(fontSize); | |||||
| } | |||||
| font.setWeight(style.get(FONT_WEIGHT)); | |||||
| font.setFamily(style.get(FONT_FAMILY)); | |||||
| font.setDecoration(style.get(TEXT_DECORATION)); | |||||
| font.setColor(PoiCssUtils.parseColor(style.get(COLOR))); | |||||
| return font; | |||||
| } | |||||
| private String getBackground(Map<String, String> style) { | private String getBackground(Map<String, String> style) { | ||||
| Map<String, String> mapRtn = new HashMap<String, String>(); | |||||
| String bg = style.get(BACKGROUND); | String bg = style.get(BACKGROUND); | ||||
| String bgColor = null; | String bgColor = null; | ||||
| if (StringUtils.isNotBlank(bg)) { | if (StringUtils.isNotBlank(bg)) { | ||||
| for (String bgAttr : bg.split("(?<=\\)|\\w|%)\\s+(?=\\w)")) { | for (String bgAttr : bg.split("(?<=\\)|\\w|%)\\s+(?=\\w)")) { | ||||
| if ((bgColor = PoiCssUtils.processColor(bgAttr)) != null) { | if ((bgColor = PoiCssUtils.processColor(bgAttr)) != null) { | ||||
| mapRtn.put(BACKGROUND_COLOR, bgColor); | |||||
| style.put(BACKGROUND_COLOR, bgColor); | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| bg = style.get(BACKGROUND_COLOR); | bg = style.get(BACKGROUND_COLOR); | ||||
| if (StringUtils.isNotBlank(bg) && (bgColor = PoiCssUtils.processColor(bg)) != null) { | if (StringUtils.isNotBlank(bg) && (bgColor = PoiCssUtils.processColor(bg)) != null) { | ||||
| mapRtn.put(BACKGROUND_COLOR, bgColor); | |||||
| style.put(BACKGROUND_COLOR, bgColor); | |||||
| } | } | ||||
| if (bgColor != null) { | if (bgColor != null) { | ||||
| bgColor = mapRtn.get(BACKGROUND_COLOR); | |||||
| if (!"#ffffff".equals(bgColor)) { | |||||
| return mapRtn.get(BACKGROUND_COLOR); | |||||
| bgColor = style.get(BACKGROUND_COLOR); | |||||
| if ("#ffffff".equals(bgColor)) { | |||||
| style.remove(BACKGROUND_COLOR); | |||||
| } | } | ||||
| } | } | ||||
| return null; | return null; | ||||
| @@ -1,23 +1,39 @@ | |||||
| package org.jeecgframework.poi.excel.html.css.impl; | package org.jeecgframework.poi.excel.html.css.impl; | ||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.apache.poi.hssf.usermodel.HSSFCell; | |||||
| import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||||
| import org.apache.poi.ss.usermodel.Cell; | import org.apache.poi.ss.usermodel.Cell; | ||||
| import org.apache.poi.ss.usermodel.CellStyle; | import org.apache.poi.ss.usermodel.CellStyle; | ||||
| import org.apache.poi.xssf.usermodel.XSSFCell; | |||||
| import org.apache.poi.xssf.usermodel.XSSFCellStyle; | |||||
| import org.jeecgframework.poi.excel.html.css.ICssConvertToExcel; | import org.jeecgframework.poi.excel.html.css.ICssConvertToExcel; | ||||
| import org.jeecgframework.poi.excel.html.css.ICssConvertToHtml; | import org.jeecgframework.poi.excel.html.css.ICssConvertToHtml; | ||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | ||||
| import org.jeecgframework.poi.util.PoiCssUtils; | |||||
| public class BackgroundCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | public class BackgroundCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | ||||
| @Override | @Override | ||||
| public String convertToHtml(Cell cell, CellStyle cellStyle, CellStyleEntity style) { | public String convertToHtml(Cell cell, CellStyle cellStyle, CellStyleEntity style) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void convertToExcel(Cell cell, CellStyle cellStyle, CellStyleEntity style) { | public void convertToExcel(Cell cell, CellStyle cellStyle, CellStyleEntity style) { | ||||
| if (StringUtils.isEmpty(style.getBackground())) { | |||||
| return; | |||||
| } | |||||
| cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); // 填充图案 | |||||
| if (cell instanceof XSSFCell) { | |||||
| ((XSSFCellStyle) cellStyle) | |||||
| .setFillForegroundColor(PoiCssUtils.parseColor(style.getBackground())); | |||||
| } else if (cell instanceof HSSFCell) { | |||||
| cellStyle.setFillForegroundColor( | |||||
| PoiCssUtils.parseColor((HSSFWorkbook) cell.getRow().getSheet().getWorkbook(), | |||||
| style.getBackground()).getIndex()); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -10,9 +10,13 @@ import org.apache.poi.hssf.util.HSSFColor.BLACK; | |||||
| import org.apache.poi.ss.usermodel.Cell; | import org.apache.poi.ss.usermodel.Cell; | ||||
| import org.apache.poi.ss.usermodel.CellStyle; | import org.apache.poi.ss.usermodel.CellStyle; | ||||
| import org.apache.poi.ss.usermodel.Font; | import org.apache.poi.ss.usermodel.Font; | ||||
| import org.apache.poi.ss.usermodel.Workbook; | |||||
| import org.apache.poi.xssf.usermodel.XSSFColor; | |||||
| import org.apache.poi.xssf.usermodel.XSSFFont; | |||||
| import org.jeecgframework.poi.excel.html.css.ICssConvertToExcel; | import org.jeecgframework.poi.excel.html.css.ICssConvertToExcel; | ||||
| import org.jeecgframework.poi.excel.html.css.ICssConvertToHtml; | import org.jeecgframework.poi.excel.html.css.ICssConvertToHtml; | ||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | ||||
| import org.jeecgframework.poi.util.PoiCssUtils; | |||||
| public class TextCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | public class TextCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | ||||
| @@ -42,9 +46,13 @@ public class TextCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml | |||||
| if (StringUtils.isNotBlank(fontFamily)) { | if (StringUtils.isNotBlank(fontFamily)) { | ||||
| font.setFontName(fontFamily); | font.setFontName(fontFamily); | ||||
| } | } | ||||
| int color = style.getFont().getColor(); | |||||
| if (color != 0 && color != BLACK.index) { | |||||
| font.setColor((short) color); | |||||
| String color = style.getFont().getColor(); | |||||
| if (StringUtils.isNoneEmpty(color)) { | |||||
| if (font instanceof HSSFFont) { | |||||
| setFoutForHSSF(font, cell.getSheet().getWorkbook(), color); | |||||
| } else if (font instanceof XSSFFont) { | |||||
| setFoutForXSSF(font, color); | |||||
| } | |||||
| } | } | ||||
| if (UNDERLINE.equals(style.getFont().getDecoration())) { | if (UNDERLINE.equals(style.getFont().getDecoration())) { | ||||
| font.setUnderline(Font.U_SINGLE); | font.setUnderline(Font.U_SINGLE); | ||||
| @@ -52,4 +60,18 @@ public class TextCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml | |||||
| cellStyle.setFont(font); | cellStyle.setFont(font); | ||||
| } | } | ||||
| private void setFoutForXSSF(Font font, String colorStr) { | |||||
| XSSFColor color = PoiCssUtils.parseColor(colorStr); | |||||
| ((XSSFFont)font).setColor(color); | |||||
| } | |||||
| private void setFoutForHSSF(Font font, Workbook workbook, String colorStr) { | |||||
| HSSFColor color = PoiCssUtils.parseColor((HSSFWorkbook) workbook, colorStr); | |||||
| if (color != null) { | |||||
| if (color.getIndex() != BLACK.index) { | |||||
| font.setColor(color.getIndex()); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -35,7 +35,7 @@ public class CssStyleFontEnity { | |||||
| private int size; | private int size; | ||||
| private String family; | private String family; | ||||
| private String decoration; | private String decoration; | ||||
| private int color; | |||||
| private String color; | |||||
| public String getStyle() { | public String getStyle() { | ||||
| return style; | return style; | ||||
| @@ -69,11 +69,11 @@ public class CssStyleFontEnity { | |||||
| this.family = family; | this.family = family; | ||||
| } | } | ||||
| public int getColor() { | |||||
| public String getColor() { | |||||
| return color; | return color; | ||||
| } | } | ||||
| public void setColor(int color) { | |||||
| public void setColor(String color) { | |||||
| this.color = color; | this.color = color; | ||||
| } | } | ||||
| @@ -8,6 +8,7 @@ import java.util.regex.Pattern; | |||||
| import java.util.regex.Matcher; | import java.util.regex.Matcher; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.apache.poi.hssf.util.HSSFColor; | import org.apache.poi.hssf.util.HSSFColor; | ||||
| import org.apache.poi.xssf.usermodel.XSSFColor; | |||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.apache.poi.hssf.usermodel.HSSFPalette; | import org.apache.poi.hssf.usermodel.HSSFPalette; | ||||
| import org.apache.poi.hssf.usermodel.HSSFWorkbook; | import org.apache.poi.hssf.usermodel.HSSFWorkbook; | ||||
| @@ -132,17 +133,37 @@ public class PoiCssUtils { | |||||
| /** | /** | ||||
| * parse color | * parse color | ||||
| * @param workBook work book | |||||
| * @param color string color | * @param color string color | ||||
| * @return int | |||||
| * @return HSSFColor | |||||
| */ | */ | ||||
| public static int parseColor(String color) { | |||||
| public static HSSFColor parseColor(HSSFWorkbook workBook, String color) { | |||||
| HSSFColor poiColor = null; | |||||
| if (StringUtils.isNotBlank(color)) { | if (StringUtils.isNotBlank(color)) { | ||||
| Color awtColor = Color.decode(color); | Color awtColor = Color.decode(color); | ||||
| if (awtColor != null) { | if (awtColor != null) { | ||||
| return awtColor.getRGB(); | |||||
| int r = awtColor.getRed(); | |||||
| int g = awtColor.getGreen(); | |||||
| int b = awtColor.getBlue(); | |||||
| HSSFPalette palette = workBook.getCustomPalette(); | |||||
| poiColor = palette.findColor((byte) r, (byte) g, (byte) b); | |||||
| if (poiColor == null) { | |||||
| poiColor = palette.findSimilarColor(r, g, b); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| return 0; | |||||
| return poiColor; | |||||
| } | |||||
| public static XSSFColor parseColor(String color) { | |||||
| XSSFColor poiColor = null; | |||||
| if (StringUtils.isNotBlank(color)) { | |||||
| Color awtColor = Color.decode(color); | |||||
| if (awtColor != null) { | |||||
| poiColor = new XSSFColor(awtColor); | |||||
| } | |||||
| } | |||||
| return poiColor; | |||||
| } | } | ||||
| // -- | // -- | ||||
| @@ -156,7 +177,7 @@ public class PoiCssUtils { | |||||
| return String.format("#%02x%02x%02x", r, g, b); | return String.format("#%02x%02x%02x", r, g, b); | ||||
| } | } | ||||
| private static int calcColorValue(String color) { | |||||
| public static int calcColorValue(String color) { | |||||
| int rtn = 0; | int rtn = 0; | ||||
| // matches 64 or 64% | // matches 64 or 64% | ||||
| Matcher m = Pattern.compile("^(\\d*\\.?\\d+)\\s*(%)?$").matcher(color); | Matcher m = Pattern.compile("^(\\d*\\.?\\d+)\\s*(%)?$").matcher(color); | ||||
| @@ -170,4 +191,5 @@ public class PoiCssUtils { | |||||
| } | } | ||||
| return rtn; | return rtn; | ||||
| } | } | ||||
| } | } | ||||