diff --git a/README.md b/README.md index 58018547..a9ac8647 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都 com.alibaba easyexcel - 3.1.2 + 3.1.3 ``` diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java index f4514e43..83e92df3 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java @@ -4,6 +4,7 @@ import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; import com.alibaba.excel.cache.ReadCache; +import com.alibaba.excel.constant.ExcelXmlConstants; /** * Sax read sharedStringsTable.xml @@ -11,12 +12,6 @@ import com.alibaba.excel.cache.ReadCache; * @author Jiaju Zhuang */ public class SharedStringsTableHandler extends DefaultHandler { - private static final String T_TAG = "t"; - private static final String SI_TAG = "si"; - /** - * Mac 2016 2017 will have this extra field to ignore - */ - private static final String RPH_TAG = "rPh"; /** * The final piece of data @@ -43,34 +38,58 @@ public class SharedStringsTableHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String name, Attributes attributes) { - if (T_TAG.equals(name)) { - currentElementData = null; - isTagt = true; - } else if (SI_TAG.equals(name)) { - currentData = null; - } else if (RPH_TAG.equals(name)) { - ignoreTagt = true; + if (name == null) { + return; + } + switch (name) { + case ExcelXmlConstants.SHAREDSTRINGS_T_TAG: + case ExcelXmlConstants.SHAREDSTRINGS_X_T_TAG: + currentElementData = null; + isTagt = true; + break; + case ExcelXmlConstants.SHAREDSTRINGS_SI_TAG: + case ExcelXmlConstants.SHAREDSTRINGS_X_SI_TAG: + currentData = null; + break; + case ExcelXmlConstants.SHAREDSTRINGS_RPH_TAG: + case ExcelXmlConstants.SHAREDSTRINGS_X_RPH_TAG: + ignoreTagt = true; + break; + default: + // ignore } } @Override public void endElement(String uri, String localName, String name) { - if (T_TAG.equals(name)) { - if (currentElementData != null) { + if (name == null) { + return; + } + switch (name) { + case ExcelXmlConstants.SHAREDSTRINGS_T_TAG: + case ExcelXmlConstants.SHAREDSTRINGS_X_T_TAG: + if (currentElementData != null) { + if (currentData == null) { + currentData = new StringBuilder(); + } + currentData.append(currentElementData); + } + isTagt = false; + break; + case ExcelXmlConstants.SHAREDSTRINGS_SI_TAG: + case ExcelXmlConstants.SHAREDSTRINGS_X_SI_TAG: if (currentData == null) { - currentData = new StringBuilder(); + readCache.put(null); + } else { + readCache.put(currentData.toString()); } - currentData.append(currentElementData); - } - isTagt = false; - } else if (SI_TAG.equals(name)) { - if (currentData == null) { - readCache.put(null); - } else { - readCache.put(currentData.toString()); - } - } else if (RPH_TAG.equals(name)) { - ignoreTagt = false; + break; + case ExcelXmlConstants.SHAREDSTRINGS_RPH_TAG: + case ExcelXmlConstants.SHAREDSTRINGS_X_RPH_TAG: + ignoreTagt = false; + break; + default: + // ignore } } diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java b/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java index bfd319a2..4f5c64dc 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java @@ -59,4 +59,28 @@ public class ExcelXmlConstants { */ public static final String CELL_RANGE_SPLIT = ":"; + // The following is a constant read the `SharedStrings.xml` + + /** + * text + * https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet + * .text?redirectedfrom=MSDN&view=openxml-2.8.1 + */ + public static final String SHAREDSTRINGS_T_TAG = "t"; + public static final String SHAREDSTRINGS_X_T_TAG = "x:t"; + + /** + * SharedStringItem + * https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet + * .sharedstringitem?redirectedfrom=MSDN&view=openxml-2.8.1 + */ + public static final String SHAREDSTRINGS_SI_TAG = "si"; + public static final String SHAREDSTRINGS_X_SI_TAG = "x:si"; + + /** + * Mac 2016 2017 will have this extra field to ignore + */ + public static final String SHAREDSTRINGS_RPH_TAG = "rPh"; + public static final String SHAREDSTRINGS_X_RPH_TAG = "x:rPh"; + } diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityTest.java index 027aa54f..3844978f 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityTest.java @@ -5,6 +5,7 @@ import java.util.Map; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; @@ -30,4 +31,15 @@ public class CompatibilityTest { Map row1 = list.get(1); Assert.assertEquals("Q235(碳钢)", row1.get(0)); } + + @Test + public void t02() { + // Exist in `sharedStrings.xml` `x:t` start tag, need to be compatible + List> list = EasyExcel.read(TestFileUtil.getPath() + "compatibility/t02.xlsx").sheet() + .headRowNumber(0).doReadSync(); + log.info("data:{}", JSON.toJSONString(list)); + Assert.assertEquals(3, list.size()); + Map row2 = list.get(2); + Assert.assertEquals("1,2-戊二醇", row2.get(2)); + } } diff --git a/easyexcel-test/src/test/resources/compatibility/t02.xlsx b/easyexcel-test/src/test/resources/compatibility/t02.xlsx new file mode 100644 index 00000000..b8d755de Binary files /dev/null and b/easyexcel-test/src/test/resources/compatibility/t02.xlsx differ diff --git a/pom.xml b/pom.xml index 319a85e0..39ca4669 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ - 3.1.2 + 3.1.3 UTF-8 1.8 true