@@ -3,12 +3,15 @@ package org.jeecgframework.poi.excel.html.css; | |||||
import static org.jeecgframework.poi.excel.html.entity.HtmlCssConstant.*; | import static org.jeecgframework.poi.excel.html.entity.HtmlCssConstant.*; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.HashSet; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Set; | |||||
import java.util.regex.Matcher; | import java.util.regex.Matcher; | ||||
import java.util.regex.Pattern; | import java.util.regex.Pattern; | ||||
import org.apache.commons.lang3.ArrayUtils; | import org.apache.commons.lang3.ArrayUtils; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.jeecgframework.poi.excel.html.entity.style.CellStyleBorderEntity; | |||||
import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | ||||
import org.jeecgframework.poi.excel.html.entity.style.CssStyleFontEnity; | import org.jeecgframework.poi.excel.html.entity.style.CssStyleFontEnity; | ||||
import org.jeecgframework.poi.util.PoiCssUtils; | import org.jeecgframework.poi.util.PoiCssUtils; | ||||
@@ -22,7 +25,25 @@ import org.slf4j.LoggerFactory; | |||||
*/ | */ | ||||
public class CssParseServer { | public class CssParseServer { | ||||
private static final Logger log = LoggerFactory.getLogger(CssParseServer.class); | |||||
private static final Logger log = LoggerFactory.getLogger(CssParseServer.class); | |||||
@SuppressWarnings("serial") | |||||
private final static Set<String> BORDER_STYLES = new HashSet<String>() { | |||||
{ | |||||
// Specifies no border | |||||
add(NONE); | |||||
// The same as "none", except in border conflict resolution for table elements | |||||
add(HIDDEN); | |||||
// Specifies a dotted border | |||||
add(DOTTED); | |||||
// Specifies a dashed border | |||||
add(DASHED); | |||||
// Specifies a solid border | |||||
add(SOLID); | |||||
// Specifies a double border | |||||
add(DOUBLE); | |||||
} | |||||
}; | |||||
public CellStyleEntity parseStyle(String style) { | public CellStyleEntity parseStyle(String style) { | ||||
Map<String, String> mapStyle = new HashMap<String, String>(); | Map<String, String> mapStyle = new HashMap<String, String>(); | ||||
@@ -44,7 +65,10 @@ public class CssParseServer { | |||||
parseFontAttr(mapStyle); | parseFontAttr(mapStyle); | ||||
getBackground(mapStyle); | |||||
parseBackground(mapStyle); | |||||
parseBorder(mapStyle); | |||||
return mapToCellStyleEntity(mapStyle); | return mapToCellStyleEntity(mapStyle); | ||||
} | } | ||||
@@ -52,18 +76,34 @@ public class CssParseServer { | |||||
CellStyleEntity entity = new CellStyleEntity(); | CellStyleEntity entity = new CellStyleEntity(); | ||||
entity.setAlign(mapStyle.get(TEXT_ALIGN)); | entity.setAlign(mapStyle.get(TEXT_ALIGN)); | ||||
entity.setVetical(mapStyle.get(VETICAL_ALIGN)); | entity.setVetical(mapStyle.get(VETICAL_ALIGN)); | ||||
entity.setBackground(getBackground(mapStyle)); | |||||
entity.setBackground(parseBackground(mapStyle)); | |||||
entity.setHeight(mapStyle.get(HEIGHT)); | entity.setHeight(mapStyle.get(HEIGHT)); | ||||
entity.setWidth(mapStyle.get(WIDTH)); | entity.setWidth(mapStyle.get(WIDTH)); | ||||
entity.setFont(getCssStyleFontEnity(mapStyle)); | entity.setFont(getCssStyleFontEnity(mapStyle)); | ||||
entity.setBackground(mapStyle.get(BACKGROUND_COLOR)); | entity.setBackground(mapStyle.get(BACKGROUND_COLOR)); | ||||
// TODO 这里较为复杂,后期处理 | |||||
/*CellStyleBorderEntity border = new CellStyleBorderEntity(); | |||||
entity.setBorder(border); | |||||
border.setBorderBottom(borderBottom);*/ | |||||
entity.setBorder(getCssStyleBorderEntity(mapStyle)); | |||||
return entity; | return entity; | ||||
} | } | ||||
private CellStyleBorderEntity getCssStyleBorderEntity(Map<String, String> mapStyle) { | |||||
CellStyleBorderEntity border = new CellStyleBorderEntity(); | |||||
border.setBorderTopColor(mapStyle.get(BORDER + "-" + TOP + "-" + COLOR)); | |||||
border.setBorderBottomColor(mapStyle.get(BORDER + "-" + BOTTOM + "-" + COLOR)); | |||||
border.setBorderLeftColor(mapStyle.get(BORDER + "-" + LEFT + "-" + COLOR)); | |||||
border.setBorderRightColor(mapStyle.get(BORDER + "-" + RIGHT + "-" + COLOR)); | |||||
border.setBorderTopWidth(mapStyle.get(BORDER + "-" + TOP + "-" + WIDTH)); | |||||
border.setBorderBottomWidth(mapStyle.get(BORDER + "-" + BOTTOM + "-" + WIDTH)); | |||||
border.setBorderLeftWidth(mapStyle.get(BORDER + "-" + LEFT + "-" + WIDTH)); | |||||
border.setBorderRightWidth(mapStyle.get(BORDER + "-" + RIGHT + "-" + WIDTH)); | |||||
border.setBorderTopStyle(mapStyle.get(BORDER + "-" + TOP + "-" + STYLE)); | |||||
border.setBorderBottomStyle(mapStyle.get(BORDER + "-" + BOTTOM + "-" + STYLE)); | |||||
border.setBorderLeftStyle(mapStyle.get(BORDER + "-" + LEFT + "-" + STYLE)); | |||||
border.setBorderRightStyle(mapStyle.get(BORDER + "-" + RIGHT + "-" + STYLE)); | |||||
return border; | |||||
} | |||||
private CssStyleFontEnity getCssStyleFontEnity(Map<String, String> style) { | private CssStyleFontEnity getCssStyleFontEnity(Map<String, String> style) { | ||||
CssStyleFontEnity font = new CssStyleFontEnity(); | CssStyleFontEnity font = new CssStyleFontEnity(); | ||||
font.setStyle(style.get(FONT_STYLE)); | font.setStyle(style.get(FONT_STYLE)); | ||||
@@ -78,6 +118,57 @@ public class CssParseServer { | |||||
return font; | return font; | ||||
} | } | ||||
public void parseBorder(Map<String, String> style) { | |||||
for (String pos : new String[] { null, TOP, RIGHT, BOTTOM, LEFT }) { | |||||
// border[-attr] | |||||
if (pos == null) { | |||||
setBorderAttr(style, pos, style.get(BORDER)); | |||||
setBorderAttr(style, pos, style.get(BORDER + "-" + COLOR)); | |||||
setBorderAttr(style, pos, style.get(BORDER + "-" + WIDTH)); | |||||
setBorderAttr(style, pos, style.get(BORDER + "-" + STYLE)); | |||||
} | |||||
// border-pos[-attr] | |||||
else { | |||||
setBorderAttr(style, pos, style.get(BORDER + "-" + pos)); | |||||
for (String attr : new String[] { COLOR, WIDTH, STYLE }) { | |||||
String attrName = BORDER + "-" + pos + "-" + attr; | |||||
String attrValue = style.get(attrName); | |||||
if (StringUtils.isNotBlank(attrValue)) { | |||||
style.put(attrName, attrValue); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
private void setBorderAttr(Map<String, String> mapBorder, String pos, String value) { | |||||
if (StringUtils.isNotBlank(value)) { | |||||
String borderColor = null; | |||||
for (String borderAttr : value.split("\\s+")) { | |||||
if ((borderColor = PoiCssUtils.processColor(borderAttr)) != null) { | |||||
setBorderAttr(mapBorder, pos, COLOR, borderColor); | |||||
} else if (PoiCssUtils.isNum(borderAttr)) { | |||||
setBorderAttr(mapBorder, pos, WIDTH, borderAttr); | |||||
} else if (BORDER_STYLES.contains(borderAttr)) { | |||||
setBorderAttr(mapBorder, pos, STYLE, borderAttr); | |||||
} else { | |||||
log.info("Border Attr [{}] Is Not Suppoted.", borderAttr); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
private void setBorderAttr(Map<String, String> mapBorder, String pos, String attr, | |||||
String value) { | |||||
if (StringUtils.isNotBlank(pos)) { | |||||
mapBorder.put(BORDER + "-" + pos + "-" + attr, value); | |||||
} else { | |||||
for (String name : new String[] { TOP, RIGHT, BOTTOM, LEFT }) { | |||||
mapBorder.put(BORDER + "-" + name + "-" + attr, value); | |||||
} | |||||
} | |||||
} | |||||
private void parseFontAttr(Map<String, String> mapRtn) { | private void parseFontAttr(Map<String, String> mapRtn) { | ||||
log.debug("Parse Font Style."); | log.debug("Parse Font Style."); | ||||
@@ -183,7 +274,7 @@ public class CssParseServer { | |||||
} | } | ||||
} | } | ||||
private String getBackground(Map<String, String> style) { | |||||
private String parseBackground(Map<String, String> style) { | |||||
String bg = style.get(BACKGROUND); | String bg = style.get(BACKGROUND); | ||||
String bgColor = null; | String bgColor = null; | ||||
if (StringUtils.isNotBlank(bg)) { | if (StringUtils.isNotBlank(bg)) { | ||||
@@ -15,12 +15,25 @@ | |||||
*/ | */ | ||||
package org.jeecgframework.poi.excel.html.css.impl; | package org.jeecgframework.poi.excel.html.css.impl; | ||||
import static org.jeecgframework.poi.excel.html.entity.HtmlCssConstant.*; | |||||
import org.apache.commons.lang3.ArrayUtils; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.apache.commons.lang3.reflect.MethodUtils; | |||||
import org.apache.poi.hssf.usermodel.HSSFCell; | |||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||||
import org.apache.poi.hssf.util.HSSFColor; | |||||
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.XSSFColor; | |||||
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.CellStyleBorderEntity; | import org.jeecgframework.poi.excel.html.entity.style.CellStyleBorderEntity; | ||||
import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | ||||
import org.jeecgframework.poi.util.PoiCssUtils; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
/** | /** | ||||
* 边框转换实现类 | * 边框转换实现类 | ||||
@@ -29,23 +42,104 @@ import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
*/ | */ | ||||
public class BorderCssConverImpl implements ICssConvertToExcel, ICssConvertToHtml { | public class BorderCssConverImpl implements ICssConvertToExcel, ICssConvertToHtml { | ||||
private static Logger log = LoggerFactory.getLogger(BorderCssConverImpl.class); | |||||
@Override | @Override | ||||
public String convertToHtml(Cell cell, CellStyle cellStyle, CellStyleEntity style) { | public String convertToHtml(Cell cell, CellStyle cellStyle, CellStyleEntity style) { | ||||
CellStyleBorderEntity border = new CellStyleBorderEntity(); | |||||
border.setBorderBottom(cellStyle.getBorderBottom()); | |||||
border.setBorderBottomColor(cellStyle.getBottomBorderColor()); | |||||
border.setBorderLeft(cellStyle.getBorderLeft()); | |||||
border.setBorderLeftColor(cellStyle.getLeftBorderColor()); | |||||
border.setBorderRight(cellStyle.getBorderRight()); | |||||
border.setBorderRightColor(cellStyle.getRightBorderColor()); | |||||
border.setBorderTop(cellStyle.getBorderTop()); | |||||
border.setBorderTopColor(cellStyle.getTopBorderColor()); | |||||
style.setBorder(border); | |||||
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 (style == null || style.getBorder() == null) { | |||||
return; | |||||
} | |||||
CellStyleBorderEntity border = style.getBorder(); | |||||
for (String pos : new String[] { TOP, RIGHT, BOTTOM, LEFT }) { | |||||
String posName = StringUtils.capitalize(pos.toLowerCase()); | |||||
// color | |||||
String colorAttr = null; | |||||
try { | |||||
colorAttr = (String) MethodUtils.invokeMethod(border, | |||||
"getBorder" + posName + "Color"); | |||||
} catch (Exception e) { | |||||
log.error("Set Border Style Error Caused.", e); | |||||
} | |||||
if (StringUtils.isNotEmpty(colorAttr)) { | |||||
if (cell instanceof HSSFCell) { | |||||
HSSFColor poiColor = PoiCssUtils | |||||
.parseColor((HSSFWorkbook) cell.getSheet().getWorkbook(), colorAttr); | |||||
if (poiColor != null) { | |||||
try { | |||||
MethodUtils.invokeMethod(cellStyle, "set" + posName + "BorderColor", | |||||
poiColor.getIndex()); | |||||
} catch (Exception e) { | |||||
log.error("Set Border Color Error Caused.", e); | |||||
} | |||||
} | |||||
} | |||||
if (cell instanceof XSSFCell) { | |||||
XSSFColor poiColor = PoiCssUtils.parseColor(colorAttr); | |||||
if (poiColor != null) { | |||||
try { | |||||
MethodUtils.invokeMethod(cellStyle, "set" + posName + "BorderColor", | |||||
poiColor); | |||||
} catch (Exception e) { | |||||
log.error("Set Border Color Error Caused.", e); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
// width | |||||
int width = 0; | |||||
try { | |||||
String widthStr = (String) MethodUtils.invokeMethod(border, | |||||
"getBorder" + posName + "Width"); | |||||
if (PoiCssUtils.isNum(widthStr)) { | |||||
width = Integer.parseInt(widthStr); | |||||
} | |||||
} catch (Exception e) { | |||||
log.error("Set Border Style Error Caused.", e); | |||||
} | |||||
String styleValue = null; | |||||
try { | |||||
styleValue = (String) MethodUtils.invokeMethod(border, | |||||
"getBorder" + posName + "Style"); | |||||
} catch (Exception e) { | |||||
log.error("Set Border Style Error Caused.", e); | |||||
} | |||||
short shortValue = -1; | |||||
// empty or solid | |||||
if (StringUtils.isBlank(styleValue) || "solid".equals(styleValue)) { | |||||
if (width > 2) { | |||||
shortValue = CellStyle.BORDER_THICK; | |||||
} else if (width > 1) { | |||||
shortValue = CellStyle.BORDER_MEDIUM; | |||||
} else { | |||||
shortValue = CellStyle.BORDER_THIN; | |||||
} | |||||
} else if (ArrayUtils.contains(new String[] { NONE, HIDDEN }, styleValue)) { | |||||
shortValue = CellStyle.BORDER_NONE; | |||||
} else if (DOUBLE.equals(styleValue)) { | |||||
shortValue = CellStyle.BORDER_DOUBLE; | |||||
} else if (DOTTED.equals(styleValue)) { | |||||
shortValue = CellStyle.BORDER_DOTTED; | |||||
} else if (DASHED.equals(styleValue)) { | |||||
if (width > 1) { | |||||
shortValue = CellStyle.BORDER_MEDIUM_DASHED; | |||||
} else { | |||||
shortValue = CellStyle.BORDER_DASHED; | |||||
} | |||||
} | |||||
// border style | |||||
if (shortValue != -1) { | |||||
try { | |||||
MethodUtils.invokeMethod(cellStyle, "setBorder" + posName, shortValue); | |||||
} catch (Exception e) { | |||||
log.error("Set Border Style Error Caused.", e); | |||||
} | |||||
} | |||||
} | |||||
} | } | ||||
} | } |
@@ -46,5 +46,11 @@ public interface HtmlCssConstant { | |||||
public final String VETICAL_ALIGN = "vertical-align"; | public final String VETICAL_ALIGN = "vertical-align"; | ||||
public final String BACKGROUND = "background"; | public final String BACKGROUND = "background"; | ||||
public final String BACKGROUND_COLOR = "background-color"; | public final String BACKGROUND_COLOR = "background-color"; | ||||
public final String NONE = "none"; | |||||
public final String HIDDEN = "hidden"; | |||||
public final String SOLID = "solid"; | |||||
public final String DOUBLE = "double"; | |||||
public final String DOTTED = "dotted"; | |||||
public final String DASHED = "dashed"; | |||||
} | } |
@@ -22,91 +22,133 @@ package org.jeecgframework.poi.excel.html.entity.style; | |||||
*/ | */ | ||||
public class CellStyleBorderEntity { | public class CellStyleBorderEntity { | ||||
private short borderLeft; | |||||
private String borderLeftColor; | |||||
private short borderRight; | |||||
private String borderRightColor; | |||||
private short borderTop; | |||||
private String borderTopColor; | |||||
private short borderBottom; | |||||
private String borderBottomColor; | |||||
private short borderLeftColor; | |||||
private String borderLeftStyle; | |||||
private short borderRightColor; | |||||
private String borderRightStyle; | |||||
private short borderTopColor; | |||||
private String borderTopStyle; | |||||
private short borderBottomColor; | |||||
private String borderBottomStyle; | |||||
public short getBorderLeft() { | |||||
return borderLeft; | |||||
private String borderLeftWidth; | |||||
private String borderRightWidth; | |||||
private String borderTopWidth; | |||||
private String borderBottomWidth; | |||||
public String getBorderLeftColor() { | |||||
return borderLeftColor; | |||||
} | } | ||||
public void setBorderLeft(short borderLeft) { | |||||
this.borderLeft = borderLeft; | |||||
public void setBorderLeftColor(String borderLeftColor) { | |||||
this.borderLeftColor = borderLeftColor; | |||||
} | } | ||||
public short getBorderRight() { | |||||
return borderRight; | |||||
public String getBorderRightColor() { | |||||
return borderRightColor; | |||||
} | } | ||||
public void setBorderRight(short borderRight) { | |||||
this.borderRight = borderRight; | |||||
public void setBorderRightColor(String borderRightColor) { | |||||
this.borderRightColor = borderRightColor; | |||||
} | } | ||||
public short getBorderTop() { | |||||
return borderTop; | |||||
public String getBorderTopColor() { | |||||
return borderTopColor; | |||||
} | } | ||||
public void setBorderTop(short borderTop) { | |||||
this.borderTop = borderTop; | |||||
public void setBorderTopColor(String borderTopColor) { | |||||
this.borderTopColor = borderTopColor; | |||||
} | } | ||||
public short getBorderBottom() { | |||||
return borderBottom; | |||||
public String getBorderBottomColor() { | |||||
return borderBottomColor; | |||||
} | } | ||||
public void setBorderBottom(short borderBottom) { | |||||
this.borderBottom = borderBottom; | |||||
public void setBorderBottomColor(String borderBottomColor) { | |||||
this.borderBottomColor = borderBottomColor; | |||||
} | } | ||||
public short getBorderLeftColor() { | |||||
return borderLeftColor; | |||||
public String getBorderLeftStyle() { | |||||
return borderLeftStyle; | |||||
} | } | ||||
public void setBorderLeftColor(short borderLeftColor) { | |||||
this.borderLeftColor = borderLeftColor; | |||||
public void setBorderLeftStyle(String borderLeftStyle) { | |||||
this.borderLeftStyle = borderLeftStyle; | |||||
} | } | ||||
public short getBorderRightColor() { | |||||
return borderRightColor; | |||||
public String getBorderRightStyle() { | |||||
return borderRightStyle; | |||||
} | } | ||||
public void setBorderRightColor(short borderRightColor) { | |||||
this.borderRightColor = borderRightColor; | |||||
public void setBorderRightStyle(String borderRightStyle) { | |||||
this.borderRightStyle = borderRightStyle; | |||||
} | } | ||||
public short getBorderTopColor() { | |||||
return borderTopColor; | |||||
public String getBorderTopStyle() { | |||||
return borderTopStyle; | |||||
} | } | ||||
public void setBorderTopColor(short borderTopColor) { | |||||
this.borderTopColor = borderTopColor; | |||||
public void setBorderTopStyle(String borderTopStyle) { | |||||
this.borderTopStyle = borderTopStyle; | |||||
} | } | ||||
public short getBorderBottomColor() { | |||||
return borderBottomColor; | |||||
public String getBorderBottomStyle() { | |||||
return borderBottomStyle; | |||||
} | } | ||||
public void setBorderBottomColor(short borderBottomColor) { | |||||
this.borderBottomColor = borderBottomColor; | |||||
public void setBorderBottomStyle(String borderBottomStyle) { | |||||
this.borderBottomStyle = borderBottomStyle; | |||||
} | |||||
public String getBorderLeftWidth() { | |||||
return borderLeftWidth; | |||||
} | |||||
public void setBorderLeftWidth(String borderLeftWidth) { | |||||
this.borderLeftWidth = borderLeftWidth; | |||||
} | |||||
public String getBorderRightWidth() { | |||||
return borderRightWidth; | |||||
} | |||||
public void setBorderRightWidth(String borderRightWidth) { | |||||
this.borderRightWidth = borderRightWidth; | |||||
} | |||||
public String getBorderTopWidth() { | |||||
return borderTopWidth; | |||||
} | |||||
public void setBorderTopWidth(String borderTopWidth) { | |||||
this.borderTopWidth = borderTopWidth; | |||||
} | |||||
public String getBorderBottomWidth() { | |||||
return borderBottomWidth; | |||||
} | |||||
public void setBorderBottomWidth(String borderBottomWidth) { | |||||
this.borderBottomWidth = borderBottomWidth; | |||||
} | } | ||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
return new StringBuilder().append(borderBottom).append(borderBottomColor).append(borderLeft) | |||||
.append(borderLeftColor).append(borderRight).append(borderRightColor).append(borderTop) | |||||
.append(borderTopColor).toString(); | |||||
return new StringBuilder().append(borderLeftColor).append(borderRightColor) | |||||
.append(borderTopColor).append(borderBottomColor).append(borderLeftStyle) | |||||
.append(borderRightStyle).append(borderTopStyle).append(borderBottomStyle) | |||||
.append(borderLeftWidth).append(borderRightWidth).append(borderTopWidth) | |||||
.append(borderBottomWidth).toString(); | |||||
} | } | ||||