@@ -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; | ||||
} | } | ||||
} | } |