| @@ -32,8 +32,9 @@ import org.jeecgframework.poi.excel.html.css.impl.BorderCssConverImpl; | |||||
| import org.jeecgframework.poi.excel.html.css.impl.HeightCssConverImpl; | import org.jeecgframework.poi.excel.html.css.impl.HeightCssConverImpl; | ||||
| import org.jeecgframework.poi.excel.html.css.impl.TextCssConvertImpl; | import org.jeecgframework.poi.excel.html.css.impl.TextCssConvertImpl; | ||||
| import org.jeecgframework.poi.excel.html.css.impl.WidthCssConverImpl; | import org.jeecgframework.poi.excel.html.css.impl.WidthCssConverImpl; | ||||
| import org.jeecgframework.poi.excel.html.entity.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.ExcelCssConstant; | |||||
| import org.jeecgframework.poi.excel.html.entity.HtmlCssConstant; | import org.jeecgframework.poi.excel.html.entity.HtmlCssConstant; | ||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| /** | /** | ||||
| * 读取Table数据生成Excel | * 读取Table数据生成Excel | ||||
| @@ -130,7 +131,7 @@ public class HtmlToExcelServer { | |||||
| Map<String, Sheet> sheets = new HashMap<String, Sheet>(); | Map<String, Sheet> sheets = new HashMap<String, Sheet>(); | ||||
| Map<String, Integer> maxrowMap = new HashMap<String, Integer>(); | Map<String, Integer> maxrowMap = new HashMap<String, Integer>(); | ||||
| for (Element table : els) { | for (Element table : els) { | ||||
| String sheetName = table.attr("sheet"); | |||||
| String sheetName = table.attr(ExcelCssConstant.SHEET_NAME); | |||||
| if (StringUtils.isBlank(sheetName)) { | if (StringUtils.isBlank(sheetName)) { | ||||
| LOGGER.error("table必须存在name属性!"); | LOGGER.error("table必须存在name属性!"); | ||||
| @@ -1,13 +1,19 @@ | |||||
| package org.jeecgframework.poi.excel.html.css; | package org.jeecgframework.poi.excel.html.css; | ||||
| import static org.jeecgframework.poi.excel.html.entity.HtmlCssConstant.*; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| 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.CellStyleBorderEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.HtmlCssConstant; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CssStyleFontEnity; | |||||
| import org.jeecgframework.poi.util.PoiCssUtils; | import org.jeecgframework.poi.util.PoiCssUtils; | ||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| /** | /** | ||||
| * 把Css样式解析成对应的Model | * 把Css样式解析成对应的Model | ||||
| @@ -16,6 +22,8 @@ import org.jeecgframework.poi.util.PoiCssUtils; | |||||
| */ | */ | ||||
| public class CssParseServer { | public class CssParseServer { | ||||
| private static final Logger log = LoggerFactory.getLogger(CssParseServer.class); | |||||
| 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>(); | ||||
| for (String s : style.split("\\s*;\\s*")) { | for (String s : style.split("\\s*;\\s*")) { | ||||
| @@ -26,8 +34,7 @@ public class CssParseServer { | |||||
| String attrName = ss[0].toLowerCase(); | String attrName = ss[0].toLowerCase(); | ||||
| String attrValue = ss[1]; | String attrValue = ss[1]; | ||||
| // do not change font name | // do not change font name | ||||
| if (!HtmlCssConstant.FONT.equals(attrName) | |||||
| && !HtmlCssConstant.FONT_FAMILY.equals(attrName)) { | |||||
| if (!FONT.equals(attrName) && !FONT_FAMILY.equals(attrName)) { | |||||
| attrValue = attrValue.toLowerCase(); | attrValue = attrValue.toLowerCase(); | ||||
| } | } | ||||
| mapStyle.put(attrName, attrValue); | mapStyle.put(attrName, attrValue); | ||||
| @@ -35,16 +42,124 @@ public class CssParseServer { | |||||
| } | } | ||||
| } | } | ||||
| parseFontAttr(mapStyle); | |||||
| return mapToCellStyleEntity(mapStyle); | return mapToCellStyleEntity(mapStyle); | ||||
| } | } | ||||
| private void parseFontAttr(Map<String, String> mapRtn) { | |||||
| log.debug("Parse Font Style."); | |||||
| // color | |||||
| String color = PoiCssUtils.processColor(mapRtn.get(COLOR)); | |||||
| if (StringUtils.isNotBlank(color)) { | |||||
| log.debug("Text Color [{}] Found.", color); | |||||
| mapRtn.put(COLOR, color); | |||||
| } | |||||
| // font | |||||
| String font = mapRtn.get(FONT); | |||||
| if (StringUtils.isNotBlank(font) | |||||
| && !ArrayUtils.contains(new String[] { "small-caps", "caption", "icon", "menu", | |||||
| "message-box", "small-caption", "status-bar" }, | |||||
| font)) { | |||||
| log.debug("Parse Font Attr [{}].", font); | |||||
| String[] ignoreStyles = new String[] { "normal", | |||||
| // font weight normal | |||||
| "[1-3]00" }; | |||||
| StringBuffer sbFont = new StringBuffer( | |||||
| font.replaceAll("^|\\s*" + StringUtils.join(ignoreStyles, "|") + "\\s+|$", " ")); | |||||
| log.debug("Font Attr [{}] After Process Ingore.", sbFont); | |||||
| // style | |||||
| Matcher m = Pattern.compile("(?:^|\\s+)(italic|oblique)(?:\\s+|$)") | |||||
| .matcher(sbFont.toString()); | |||||
| if (m.find()) { | |||||
| sbFont.setLength(0); | |||||
| if (log.isDebugEnabled()) { | |||||
| log.debug("Font Style [{}] Found.", m.group(1)); | |||||
| } | |||||
| mapRtn.put(FONT_STYLE, ITALIC); | |||||
| m.appendReplacement(sbFont, " "); | |||||
| m.appendTail(sbFont); | |||||
| } | |||||
| // weight | |||||
| m = Pattern.compile("(?:^|\\s+)(bold(?:er)?|[7-9]00)(?:\\s+|$)") | |||||
| .matcher(sbFont.toString()); | |||||
| if (m.find()) { | |||||
| sbFont.setLength(0); | |||||
| if (log.isDebugEnabled()) { | |||||
| log.debug("Font Weight [{}](bold) Found.", m.group(1)); | |||||
| } | |||||
| mapRtn.put(FONT_WEIGHT, BOLD); | |||||
| m.appendReplacement(sbFont, " "); | |||||
| m.appendTail(sbFont); | |||||
| } | |||||
| // size xx-small | x-small | small | medium | large | x-large | xx-large | 18px [/2] | |||||
| m = Pattern.compile( | |||||
| // before blank or start | |||||
| new StringBuilder("(?:^|\\s+)") | |||||
| // font size | |||||
| .append("(xx-small|x-small|small|medium|large|x-large|xx-large|").append("(?:") | |||||
| .append(PATTERN_LENGTH).append("))") | |||||
| // line height | |||||
| .append("(?:\\s*\\/\\s*(").append(PATTERN_LENGTH).append("))?") | |||||
| // after blank or end | |||||
| .append("(?:\\s+|$)").toString()) | |||||
| .matcher(sbFont.toString()); | |||||
| if (m.find()) { | |||||
| sbFont.setLength(0); | |||||
| log.debug("Font Size[/line-height] [{}] Found.", m.group()); | |||||
| String fontSize = m.group(1); | |||||
| if (StringUtils.isNotBlank(fontSize)) { | |||||
| fontSize = StringUtils.deleteWhitespace(fontSize); | |||||
| log.debug("Font Size [{}].", fontSize); | |||||
| if (fontSize.matches(PATTERN_LENGTH)) { | |||||
| mapRtn.put(FONT_SIZE, fontSize); | |||||
| } else { | |||||
| log.info("Font Size [{}] Not Supported, Ignore.", fontSize); | |||||
| } | |||||
| } | |||||
| String lineHeight = m.group(2); | |||||
| if (StringUtils.isNotBlank(lineHeight)) { | |||||
| log.info("Line Height [{}] Not Supported, Ignore.", lineHeight); | |||||
| } | |||||
| m.appendReplacement(sbFont, " "); | |||||
| m.appendTail(sbFont); | |||||
| } | |||||
| // font family | |||||
| if (sbFont.length() > 0) { | |||||
| log.debug("Font Families [{}].", sbFont); | |||||
| // trim & remove '" | |||||
| String fontFamily = sbFont.toString().split("\\s*,\\s*")[0].trim() | |||||
| .replaceAll("'|\"", ""); | |||||
| log.debug("Use First Font Family [{}].", fontFamily); | |||||
| mapRtn.put(FONT_FAMILY, fontFamily); | |||||
| } | |||||
| } | |||||
| font = mapRtn.get(FONT_STYLE); | |||||
| if (ArrayUtils.contains(new String[] { ITALIC, "oblique" }, font)) { | |||||
| log.debug("Font Italic [{}] Found.", font); | |||||
| mapRtn.put(FONT_STYLE, ITALIC); | |||||
| } | |||||
| font = mapRtn.get(FONT_WEIGHT); | |||||
| if (StringUtils.isNotBlank(font) && Pattern.matches("^bold(?:er)?|[7-9]00$", font)) { | |||||
| log.debug("Font Weight [{}](bold) Found.", font); | |||||
| mapRtn.put(FONT_WEIGHT, BOLD); | |||||
| } | |||||
| font = mapRtn.get(FONT_SIZE); | |||||
| if (!PoiCssUtils.isNum(font)) { | |||||
| log.debug("Font Size [{}] Error.", font); | |||||
| mapRtn.remove(FONT_SIZE); | |||||
| } | |||||
| } | |||||
| private CellStyleEntity mapToCellStyleEntity(Map<String, String> mapStyle) { | private CellStyleEntity mapToCellStyleEntity(Map<String, String> mapStyle) { | ||||
| CellStyleEntity entity = new CellStyleEntity(); | CellStyleEntity entity = new CellStyleEntity(); | ||||
| entity.setAlign(mapStyle.get(HtmlCssConstant.TEXT_ALIGN)); | |||||
| entity.setVetical(mapStyle.get(HtmlCssConstant.VETICAL_ALIGN)); | |||||
| entity.setAlign(mapStyle.get(TEXT_ALIGN)); | |||||
| entity.setVetical(mapStyle.get(VETICAL_ALIGN)); | |||||
| entity.setBackground(getBackground(mapStyle)); | entity.setBackground(getBackground(mapStyle)); | ||||
| entity.setHeight(mapStyle.get(HtmlCssConstant.HEIGHT)); | |||||
| entity.setWidth(mapStyle.get(HtmlCssConstant.WIDTH)); | |||||
| entity.setHeight(mapStyle.get(HEIGHT)); | |||||
| entity.setWidth(mapStyle.get(WIDTH)); | |||||
| entity.setFont(getCssStyleFontEnity(mapStyle)); | |||||
| // TODO 这里较为复杂,后期处理 | // TODO 这里较为复杂,后期处理 | ||||
| /*CellStyleBorderEntity border = new CellStyleBorderEntity(); | /*CellStyleBorderEntity border = new CellStyleBorderEntity(); | ||||
| entity.setBorder(border); | entity.setBorder(border); | ||||
| @@ -52,27 +167,41 @@ public class CssParseServer { | |||||
| return entity; | 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>(); | Map<String, String> mapRtn = new HashMap<String, String>(); | ||||
| String bg = style.get(HtmlCssConstant.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(HtmlCssConstant.BACKGROUND_COLOR, bgColor); | |||||
| mapRtn.put(BACKGROUND_COLOR, bgColor); | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| bg = style.get(HtmlCssConstant.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(HtmlCssConstant.BACKGROUND_COLOR, bgColor); | |||||
| mapRtn.put(BACKGROUND_COLOR, bgColor); | |||||
| } | } | ||||
| if (bgColor != null) { | if (bgColor != null) { | ||||
| bgColor = mapRtn.get(HtmlCssConstant.BACKGROUND_COLOR); | |||||
| bgColor = mapRtn.get(BACKGROUND_COLOR); | |||||
| if (!"#ffffff".equals(bgColor)) { | if (!"#ffffff".equals(bgColor)) { | ||||
| return mapRtn.get(HtmlCssConstant.BACKGROUND_COLOR); | |||||
| return mapRtn.get(BACKGROUND_COLOR); | |||||
| } | } | ||||
| } | } | ||||
| return null; | return null; | ||||
| @@ -17,7 +17,7 @@ package org.jeecgframework.poi.excel.html.css; | |||||
| 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.jeecgframework.poi.excel.html.entity.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| /** | /** | ||||
| * CSS Cell Style 转换类 | * CSS Cell Style 转换类 | ||||
| @@ -17,7 +17,7 @@ package org.jeecgframework.poi.excel.html.css; | |||||
| 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.jeecgframework.poi.excel.html.entity.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| /** | /** | ||||
| * CSS Cell Style 转换类 | * CSS Cell Style 转换类 | ||||
| @@ -4,20 +4,39 @@ import org.apache.poi.ss.usermodel.Cell; | |||||
| import org.apache.poi.ss.usermodel.CellStyle; | import org.apache.poi.ss.usermodel.CellStyle; | ||||
| 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.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.HtmlCssConstant; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| public class AlignCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | public class AlignCssConvertImpl 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) { | ||||
| // align | |||||
| if (HtmlCssConstant.RIGHT.equals(style.getAlign())) { | |||||
| cellStyle.setAlignment(CellStyle.ALIGN_RIGHT); | |||||
| } else if (HtmlCssConstant.CENTER.equals(style.getAlign())) { | |||||
| cellStyle.setAlignment(CellStyle.ALIGN_CENTER); | |||||
| } else if (HtmlCssConstant.LEFT.equals(style.getAlign())) { | |||||
| cellStyle.setAlignment(CellStyle.ALIGN_LEFT); | |||||
| } else if (HtmlCssConstant.JUSTIFY.equals(style.getAlign())) { | |||||
| cellStyle.setAlignment(CellStyle.ALIGN_JUSTIFY); | |||||
| } | |||||
| // vertical align | |||||
| if (HtmlCssConstant.TOP.equals(style.getVetical())) { | |||||
| cellStyle.setVerticalAlignment(CellStyle.VERTICAL_TOP); | |||||
| } else if (HtmlCssConstant.CENTER.equals(style.getAlign())) { | |||||
| cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); | |||||
| } else if (HtmlCssConstant.BOTTOM.equals(style.getAlign())) { | |||||
| cellStyle.setVerticalAlignment(CellStyle.VERTICAL_BOTTOM); | |||||
| } else if (HtmlCssConstant.JUSTIFY.equals(style.getAlign())) { | |||||
| cellStyle.setVerticalAlignment(CellStyle.VERTICAL_JUSTIFY); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -4,7 +4,7 @@ import org.apache.poi.ss.usermodel.Cell; | |||||
| import org.apache.poi.ss.usermodel.CellStyle; | import org.apache.poi.ss.usermodel.CellStyle; | ||||
| 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.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| public class BackgroundCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | public class BackgroundCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | ||||
| @@ -19,8 +19,8 @@ import org.apache.poi.ss.usermodel.Cell; | |||||
| import org.apache.poi.ss.usermodel.CellStyle; | import org.apache.poi.ss.usermodel.CellStyle; | ||||
| 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.CellStyleBorderEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleBorderEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| /** | /** | ||||
| * 边框转换实现类 | * 边框转换实现类 | ||||
| @@ -21,7 +21,7 @@ import org.apache.poi.ss.usermodel.CellStyle; | |||||
| import org.apache.poi.ss.usermodel.Row; | import org.apache.poi.ss.usermodel.Row; | ||||
| 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.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| import org.jeecgframework.poi.util.PoiCssUtils; | import org.jeecgframework.poi.util.PoiCssUtils; | ||||
| @@ -1,23 +1,55 @@ | |||||
| 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.StringUtils; | |||||
| import org.apache.poi.hssf.usermodel.HSSFFont; | |||||
| import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||||
| import org.apache.poi.hssf.util.HSSFColor; | |||||
| 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.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.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| public class TextCssConvertImpl implements ICssConvertToExcel, ICssConvertToHtml { | public class TextCssConvertImpl 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 (style == null || style.getFont() == null) { | |||||
| return; | |||||
| } | |||||
| Font font = cell.getSheet().getWorkbook().createFont(); | |||||
| if (ITALIC.equals(style.getFont().getStyle())) { | |||||
| font.setItalic(true); | |||||
| } | |||||
| int fontSize = style.getFont().getSize(); | |||||
| if (fontSize > 0) { | |||||
| font.setFontHeightInPoints((short) fontSize); | |||||
| } | |||||
| if (BOLD.equals(style.getFont().getWeight())) { | |||||
| font.setBoldweight(Font.BOLDWEIGHT_BOLD); | |||||
| } | |||||
| String fontFamily = style.getFont().getFamily(); | |||||
| if (StringUtils.isNotBlank(fontFamily)) { | |||||
| font.setFontName(fontFamily); | |||||
| } | |||||
| int color = style.getFont().getColor(); | |||||
| if (color != 0 && color != BLACK.index) { | |||||
| font.setColor((short) color); | |||||
| } | |||||
| if (UNDERLINE.equals(style.getFont().getDecoration())) { | |||||
| font.setUnderline(Font.U_SINGLE); | |||||
| } | |||||
| cellStyle.setFont(font); | |||||
| } | } | ||||
| } | } | ||||
| @@ -21,7 +21,7 @@ import org.apache.poi.ss.usermodel.CellStyle; | |||||
| import org.apache.poi.ss.usermodel.Sheet; | import org.apache.poi.ss.usermodel.Sheet; | ||||
| 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.CellStyleEntity; | |||||
| import org.jeecgframework.poi.excel.html.entity.style.CellStyleEntity; | |||||
| import org.jeecgframework.poi.util.PoiCssUtils; | import org.jeecgframework.poi.util.PoiCssUtils; | ||||
| /** | /** | ||||
| @@ -0,0 +1,27 @@ | |||||
| /** | |||||
| * Copyright 2013-2017 JueYue (qrb.jueyue@gmail.com) | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| package org.jeecgframework.poi.excel.html.entity; | |||||
| /** | |||||
| * Excel 自定义处理的自定义Html标签 | |||||
| * @author JueYue | |||||
| * 2017年3月26日 | |||||
| */ | |||||
| public interface ExcelCssConstant { | |||||
| public final String SHEET_NAME = "sheetName"; | |||||
| } | |||||
| @@ -1,5 +1,5 @@ | |||||
| /** | /** | ||||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||||
| * Copyright 2013-2017 JueYue (qrb.jueyue@gmail.com) | |||||
| * | * | ||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| * you may not use this file except in compliance with the License. | * you may not use this file except in compliance with the License. | ||||
| @@ -37,6 +37,8 @@ public interface HtmlCssConstant { | |||||
| public final String FONT_WEIGHT = "font-weight"; | public final String FONT_WEIGHT = "font-weight"; | ||||
| public final String FONT_SIZE = "font-size"; | public final String FONT_SIZE = "font-size"; | ||||
| public final String FONT_FAMILY = "font-family"; | public final String FONT_FAMILY = "font-family"; | ||||
| public final String TEXT_DECORATION = "text-decoration"; | |||||
| public final String UNDERLINE = "underline"; | |||||
| public final String ITALIC = "italic"; | public final String ITALIC = "italic"; | ||||
| public final String BOLD = "bold"; | public final String BOLD = "bold"; | ||||
| public final String NORMAL = "normal"; | public final String NORMAL = "normal"; | ||||
| @@ -13,9 +13,7 @@ | |||||
| * See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | ||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| package org.jeecgframework.poi.excel.html.entity; | |||||
| import org.apache.commons.lang3.builder.ReflectionToStringBuilder; | |||||
| package org.jeecgframework.poi.excel.html.entity.style; | |||||
| /** | /** | ||||
| * 边框样式 | * 边框样式 | ||||
| @@ -13,9 +13,7 @@ | |||||
| * See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | ||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| package org.jeecgframework.poi.excel.html.entity; | |||||
| import org.apache.commons.lang3.builder.ReflectionToStringBuilder; | |||||
| package org.jeecgframework.poi.excel.html.entity.style; | |||||
| /** | /** | ||||
| * Cell 具有的样式 | * Cell 具有的样式 | ||||
| @@ -47,6 +45,10 @@ public class CellStyleEntity { | |||||
| * 垂直位置 | * 垂直位置 | ||||
| */ | */ | ||||
| private String vetical; | private String vetical; | ||||
| /** | |||||
| * 字体设置 | |||||
| */ | |||||
| private CssStyleFontEnity font; | |||||
| public String getWidth() { | public String getWidth() { | ||||
| return width; | return width; | ||||
| @@ -96,10 +98,18 @@ public class CellStyleEntity { | |||||
| this.vetical = vetical; | this.vetical = vetical; | ||||
| } | } | ||||
| public CssStyleFontEnity getFont() { | |||||
| return font; | |||||
| } | |||||
| public void setFont(CssStyleFontEnity font) { | |||||
| this.font = font; | |||||
| } | |||||
| @Override | @Override | ||||
| public String toString() { | public String toString() { | ||||
| return new StringBuilder().append(align).append(background).append(border).append(height) | return new StringBuilder().append(align).append(background).append(border).append(height) | ||||
| .append(vetical).append(width).toString(); | |||||
| .append(vetical).append(width).append(font).toString(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,93 @@ | |||||
| /** | |||||
| * Copyright 2013-2017 JueYue (qrb.jueyue@gmail.com) | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| package org.jeecgframework.poi.excel.html.entity.style; | |||||
| /** | |||||
| * 字体样式 | |||||
| * @author JueYue | |||||
| * 2017年3月26日 | |||||
| */ | |||||
| public class CssStyleFontEnity { | |||||
| /** | |||||
| * italic 浏览器会显示一个斜体的字体样式。 | |||||
| */ | |||||
| private String style; | |||||
| /** | |||||
| * bold 定义粗体字符 | |||||
| */ | |||||
| private String weight; | |||||
| /** | |||||
| * 仅支持**px获取不带px的数字大小 | |||||
| */ | |||||
| private int size; | |||||
| private String family; | |||||
| private String decoration; | |||||
| private int color; | |||||
| public String getStyle() { | |||||
| return style; | |||||
| } | |||||
| public void setStyle(String style) { | |||||
| this.style = style; | |||||
| } | |||||
| public String getWeight() { | |||||
| return weight; | |||||
| } | |||||
| public void setWeight(String weight) { | |||||
| this.weight = weight; | |||||
| } | |||||
| public int getSize() { | |||||
| return size; | |||||
| } | |||||
| public void setSize(int size) { | |||||
| this.size = size; | |||||
| } | |||||
| public String getFamily() { | |||||
| return family; | |||||
| } | |||||
| public void setFamily(String family) { | |||||
| this.family = family; | |||||
| } | |||||
| public int getColor() { | |||||
| return color; | |||||
| } | |||||
| public void setColor(int color) { | |||||
| this.color = color; | |||||
| } | |||||
| public String getDecoration() { | |||||
| return decoration; | |||||
| } | |||||
| public void setDecoration(String decoration) { | |||||
| this.decoration = decoration; | |||||
| } | |||||
| @Override | |||||
| public String toString() { | |||||
| return new StringBuilder().append(style).append(decoration).append(color).append(family) | |||||
| .append(size).append(weight).toString(); | |||||
| } | |||||
| } | |||||
| @@ -132,26 +132,17 @@ public class PoiCssUtils { | |||||
| /** | /** | ||||
| * parse color | * parse color | ||||
| * @param workBook work book | |||||
| * @param color string color | * @param color string color | ||||
| * @return HSSFColor | |||||
| * @return int | |||||
| */ | */ | ||||
| public static HSSFColor parseColor(HSSFWorkbook workBook, String color) { | |||||
| HSSFColor poiColor = null; | |||||
| public static int parseColor(String color) { | |||||
| if (StringUtils.isNotBlank(color)) { | if (StringUtils.isNotBlank(color)) { | ||||
| Color awtColor = Color.decode(color); | Color awtColor = Color.decode(color); | ||||
| if (awtColor != null) { | if (awtColor != null) { | ||||
| 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 awtColor.getRGB(); | |||||
| } | } | ||||
| } | } | ||||
| return poiColor; | |||||
| return 0; | |||||
| } | } | ||||
| // -- | // -- | ||||