diff --git a/CHANGELOG.md b/CHANGELOG.md index a1dfb24f3..f60d2e604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.5.0 (2020-11-08) +# 5.5.0 (2020-11-09) ### 新特性 * 【core 】 NumberUtil.parseInt等支持123,2.00这类数字(issue#I23ORQ@Gitee) @@ -20,6 +20,7 @@ * 【core 】 修复ClassUtil.getTypeArgument方法在判断泛型时导致的问题(issue#1207@Github) * 【core 】 修复Ipv4Util分隔符问题(issue#I24A9I@Gitee) * 【core 】 修复Ipv4Util.longToIp的问题 +* 【poi 】 修复Excel07SaxReader读取公式的错误的问题(issue#I23VFL@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrBuilder.java b/hutool-core/src/main/java/cn/hutool/core/text/StrBuilder.java index 91535be4f..dae62696b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrBuilder.java @@ -33,7 +33,7 @@ public class StrBuilder implements CharSequence, Appendable, Serializable { /** * 创建字符串构建器 * - * @return {@link StrBuilder} + * @return this */ public static StrBuilder create() { return new StrBuilder(); @@ -43,7 +43,7 @@ public class StrBuilder implements CharSequence, Appendable, Serializable { * 创建字符串构建器 * * @param initialCapacity 初始容量 - * @return {@link StrBuilder} + * @return this */ public static StrBuilder create(int initialCapacity) { return new StrBuilder(initialCapacity); @@ -53,7 +53,7 @@ public class StrBuilder implements CharSequence, Appendable, Serializable { * 创建字符串构建器 * * @param strs 初始字符串 - * @return {@link StrBuilder} + * @return this * @since 4.0.1 */ public static StrBuilder create(CharSequence... strs) { diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/FormulaCellValue.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/FormulaCellValue.java index 4f6729f2b..28844b054 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/FormulaCellValue.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/FormulaCellValue.java @@ -2,17 +2,39 @@ package cn.hutool.poi.excel.cell; /** * 公式类型的值 - * + * * @author looly * @since 4.0.11 */ public class FormulaCellValue implements CellValue { - /** 公式 */ + /** + * 公式 + */ String formula; + /** + * 结果,使用ExcelWriter时可以不用 + */ + Object result; + /** + * 构造 + * + * @param formula 公式 + */ public FormulaCellValue(String formula) { + this(formula, null); + } + + /** + * 构造 + * + * @param formula 公式 + * @param result 结果 + */ + public FormulaCellValue(String formula, Object result) { this.formula = formula; + this.result = result; } @Override @@ -20,4 +42,16 @@ public class FormulaCellValue implements CellValue { return this.formula; } + /** + * 获取结果 + * @return 结果 + */ + public Object getResult() { + return this.result; + } + + @Override + public String toString() { + return getResult().toString(); + } } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/CellDataType.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/CellDataType.java index 44baadb39..1d5143960 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/CellDataType.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/CellDataType.java @@ -11,15 +11,15 @@ public enum CellDataType { BOOL("b"), /** 类型错误 */ ERROR("e"), - /** 计算结果类型 */ - FORMULA("str"), + /** 计算结果类型,此类型使用f标签辅助判断,而非属性 */ + FORMULA("formula"), /** 富文本类型 */ INLINESTR("inlineStr"), /** 共享字符串索引类型 */ SSTINDEX("s"), /** 数字类型 */ NUMBER(""), - /** 日期类型 */ + /** 日期类型,此类型使用值判断,而非属性 */ DATE("m/d/yy"), /** 空类型 */ NULL(""); diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ElementName.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ElementName.java index 08614fc8e..e1328cfda 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ElementName.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ElementName.java @@ -12,9 +12,17 @@ public enum ElementName { */ row, /** - * 单元格标签名,表示一个单元格 + * Cell单元格标签名,表示一个单元格 */ - c; + c, + /** + * Value单元格值的标签,表示单元格内的值 + */ + v, + /** + * Formula公式,表示一个存放公式的单元格 + */ + f; /** * 给定标签名是否匹配当前标签 @@ -25,4 +33,17 @@ public enum ElementName { public boolean match(String elementName){ return this.name().equals(elementName); } + + /** + * 解析支持的节点名枚举 + * @param elementName 节点名 + * @return 节点名枚举 + */ + public static ElementName of(String elementName){ + try { + return valueOf(elementName); + } catch (Exception ignore){ + } + return null; + } } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java index b51b449ae..67d31b67f 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java @@ -275,10 +275,10 @@ public class Excel03SaxReader implements HSSFListener, ExcelSaxReader rowCellList = new ArrayList<>(); @@ -189,10 +194,20 @@ public class Excel07SaxReader extends DefaultHandler implements ExcelSaxReader rows = new ArrayList<>(); + ExcelUtil.readBySax("data_for_sax_test.xls", -1, (i, i1, list) -> { + if(list.size() > 1){ + rows.add(list.get(1)); + } else{ + rows.add(""); + } + }); + Assert.assertEquals(50L, rows.get(3)); + } + + @Test + public void formulaRead07Test() { + List rows = new ArrayList<>(); + ExcelUtil.readBySax("data_for_sax_test.xlsx", 0, (i, i1, list) -> + rows.add(list.get(1))); + + final FormulaCellValue value = (FormulaCellValue) rows.get(3); + Assert.assertEquals(50L, value.getResult()); + } + + @Test public void dateReadTest() { - ExcelUtil.readBySax("d:/test/date_test.xls", 0, (i, i1, list) -> - Console.log(StrUtil.join(", ", list))); + List rows = new ArrayList<>(); + ExcelUtil.readBySax("data_for_sax_test.xls", 0, (i, i1, list) -> + rows.add(StrUtil.toString(list.get(0)))); + + Assert.assertEquals("2020-10-09 00:00:00", rows.get(1)); + // 非日期格式不做转换 + Assert.assertEquals("112233", rows.get(2)); + Assert.assertEquals("1000", rows.get(3)); } @Test diff --git a/hutool-poi/src/test/resources/data_for_sax_test.xls b/hutool-poi/src/test/resources/data_for_sax_test.xls new file mode 100644 index 000000000..ebebc51bc Binary files /dev/null and b/hutool-poi/src/test/resources/data_for_sax_test.xls differ diff --git a/hutool-poi/src/test/resources/data_for_sax_test.xlsx b/hutool-poi/src/test/resources/data_for_sax_test.xlsx new file mode 100644 index 000000000..8fb64fd8b Binary files /dev/null and b/hutool-poi/src/test/resources/data_for_sax_test.xlsx differ