diff --git a/src/main/java/org/ddr/poi/html/HtmlConstants.java b/src/main/java/org/ddr/poi/html/HtmlConstants.java index 5146a88..e627077 100644 --- a/src/main/java/org/ddr/poi/html/HtmlConstants.java +++ b/src/main/java/org/ddr/poi/html/HtmlConstants.java @@ -92,6 +92,7 @@ public interface HtmlConstants { String ATTR_SRC = "src"; String ATTR_WIDTH = "width"; String ATTR_HEIGHT = "height"; + String ATTR_SPAN = "span"; String ATTR_ROWSPAN = "rowspan"; String ATTR_COLSPAN = "colspan"; String ATTR_HREF = "href"; diff --git a/src/main/java/org/ddr/poi/html/tag/TableRenderer.java b/src/main/java/org/ddr/poi/html/tag/TableRenderer.java index 274d3bb..3678e13 100644 --- a/src/main/java/org/ddr/poi/html/tag/TableRenderer.java +++ b/src/main/java/org/ddr/poi/html/tag/TableRenderer.java @@ -17,6 +17,7 @@ package org.ddr.poi.html.tag; import com.steadystate.css.dom.CSSStyleDeclarationImpl; +import com.steadystate.css.dom.Property; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.util.Units; import org.apache.poi.xwpf.usermodel.XWPFTable; @@ -46,8 +47,11 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth; import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -84,9 +88,18 @@ public boolean renderStart(Element element, HtmlRenderContext context) { // Element caption = JsoupUtils.firstChild(element, HtmlConstants.TAG_CAPTION); Element colgroup = JsoupUtils.firstChild(element, HtmlConstants.TAG_COLGROUP); + List<CSSStyleDeclarationImpl> columnStyles = Collections.emptyList(); if (colgroup != null) { Elements cols = colgroup.select(HtmlConstants.TAG_COL); - // FIXME col可以拥有style + columnStyles = new ArrayList<>(); + for (Element col : cols) { + String style = col.attr(HtmlConstants.ATTR_STYLE); + CSSStyleDeclarationImpl cssStyleDeclaration = CSSStyleUtils.parse(style); + int span = NumberUtils.toInt(col.attr(HtmlConstants.ATTR_SPAN), 1); + for (int i = 0; i < span; i++) { + columnStyles.add(cssStyleDeclaration); + } + } colgroup.remove(); } Elements trs = JsoupUtils.childRows(element); @@ -151,6 +164,15 @@ public boolean renderStart(Element element, HtmlRenderContext context) { ctTcPr.addNewGridSpan().setVal(BigInteger.valueOf(colspan)); } + // 列定义的样式与单元格的样式合并 + if (!columnStyles.isEmpty() && columnIndex < columnStyles.size()) { + List<Property> properties = columnStyles.get(columnIndex).getProperties(); + if (!properties.isEmpty()) { + tdStyleDeclaration.getProperties().addAll(0, properties); + td.attr(HtmlConstants.ATTR_STYLE, tdStyleDeclaration.getCssText()); + } + } + columnIndex += colspan; } diff --git a/src/test/resources/2.html b/src/test/resources/2.html index 79de05a..4f6eba7 100644 --- a/src/test/resources/2.html +++ b/src/test/resources/2.html @@ -414,6 +414,12 @@ <h1><big><u><em><strong>威风威风文 <big><u><em><strong><big><u> <h1 class="ui header">java生成word的几种方案</h1> <table cellspacing="0" class="Table" style="border-collapse:collapse; border:none; font-family:"Times New Roman"; font-size:13px"> + <colgroup> + <col/> + <col/> + <col span="2" style="background-color: red"/> + <col span="2" style="font-weight: bolder; background-color: yellow"/> + </colgroup> <tbody> <tr> <td rowspan="2"