@@ -3,12 +3,15 @@ package org.jeecgframework.poi.excel.html.css; | |||
import static org.jeecgframework.poi.excel.html.entity.HtmlCssConstant.*; | |||
import java.util.HashMap; | |||
import java.util.HashSet; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import java.util.regex.Matcher; | |||
import java.util.regex.Pattern; | |||
import org.apache.commons.lang3.ArrayUtils; | |||
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.CssStyleFontEnity; | |||
import org.jeecgframework.poi.util.PoiCssUtils; | |||
@@ -22,7 +25,25 @@ import org.slf4j.LoggerFactory; | |||
*/ | |||
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) { | |||
Map<String, String> mapStyle = new HashMap<String, String>(); | |||
@@ -44,7 +65,10 @@ public class CssParseServer { | |||
parseFontAttr(mapStyle); | |||
getBackground(mapStyle); | |||
parseBackground(mapStyle); | |||
parseBorder(mapStyle); | |||
return mapToCellStyleEntity(mapStyle); | |||
} | |||
@@ -52,18 +76,34 @@ public class CssParseServer { | |||
CellStyleEntity entity = new CellStyleEntity(); | |||
entity.setAlign(mapStyle.get(TEXT_ALIGN)); | |||
entity.setVetical(mapStyle.get(VETICAL_ALIGN)); | |||
entity.setBackground(getBackground(mapStyle)); | |||
entity.setBackground(parseBackground(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);*/ | |||
entity.setBorder(getCssStyleBorderEntity(mapStyle)); | |||
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) { | |||
CssStyleFontEnity font = new CssStyleFontEnity(); | |||
font.setStyle(style.get(FONT_STYLE)); | |||
@@ -78,6 +118,57 @@ public class CssParseServer { | |||
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) { | |||
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 bgColor = null; | |||
if (StringUtils.isNotBlank(bg)) { | |||
@@ -15,12 +15,25 @@ | |||
*/ | |||
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.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.ICssConvertToHtml; | |||
import org.jeecgframework.poi.excel.html.entity.style.CellStyleBorderEntity; | |||
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 { | |||
private static Logger log = LoggerFactory.getLogger(BorderCssConverImpl.class); | |||
@Override | |||
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; | |||
} | |||
@Override | |||
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 BACKGROUND = "background"; | |||
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 { | |||
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 | |||
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(); | |||
} | |||