diff --git a/CHANGELOG.md b/CHANGELOG.md index e94076896..b67dbbce0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * 【core 】 ExcelWriter增加setCurrentRowToEnd方法(issue#I24A2R@Gitee) * 【extra 】 增加表达式引擎封装(ExpressionUtil)(pr#1203@Github) * 【core 】 增加enum转数字支持(issue#I24QZY@Gitee) +* 【core 】 NumberUtil.toBigDecimal空白符转换为0(issue#I24MRP@Gitee) ### Bug修复 * 【core 】 修复DateUtil.current使用System.nanoTime的问题(issue#1198@Github) @@ -26,6 +27,7 @@ * 【http 】 修复HttpUtil.isHttp判断问题(pr#1208@Github) * 【http 】 修复Snowflake时间回拨导致ID重复的bug(issue#1206@Github) * 【core 】 修复StrUtil.lastIndexOf查找位于首位的字符串找不到的bug(issue#I24RSV@Gitee) +* 【poi 】 修复BigExcelWriter的autoSizeColumnAll问题(pr#1221@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index c5e11acb6..5c7781f4b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1283,7 +1283,7 @@ public class NumberUtil { * @param begin 最小数字(包含该数) * @param end 最大数字(不包含该数) * @param size 指定产生随机数的个数 - * @param seed 种子,用于取随机数的int池 + * @param seed 种子,用于取随机数的int池 * @return 随机int数组 * @since 5.4.5 */ @@ -1976,8 +1976,8 @@ public class NumberUtil { Assert.notNull(number, "Number is null !"); // BigDecimal单独处理,使用非科学计数法 - if(number instanceof BigDecimal){ - return toStr((BigDecimal)number); + if (number instanceof BigDecimal) { + return toStr((BigDecimal) number); } Assert.isTrue(isValidNumber(number), "Number is non-finite!"); @@ -2008,7 +2008,9 @@ public class NumberUtil { } /** - * 数字转{@link BigDecimal} + * 数字转{@link BigDecimal}
+ * Float、Double等有精度问题,转换为字符串后再转换
+ * null转换为0 * * @param number 数字 * @return {@link BigDecimal} @@ -2019,7 +2021,7 @@ public class NumberUtil { return BigDecimal.ZERO; } - if(number instanceof BigDecimal){ + if (number instanceof BigDecimal) { return (BigDecimal) number; } else if (number instanceof Long) { return new BigDecimal((Long) number); @@ -2029,22 +2031,25 @@ public class NumberUtil { return new BigDecimal((BigInteger) number); } + // Float、Double等有精度问题,转换为字符串后再转换 return toBigDecimal(number.toString()); } /** - * 数字转{@link BigDecimal} + * 数字转{@link BigDecimal}
+ * null或""或空白符转换为0 * - * @param number 数字 + * @param number 数字字符串 * @return {@link BigDecimal} * @since 4.0.9 */ public static BigDecimal toBigDecimal(String number) { - return (null == number) ? BigDecimal.ZERO : new BigDecimal(number); + return StrUtil.isBlank(number) ? BigDecimal.ZERO : new BigDecimal(number); } /** - * 数字转{@link BigInteger} + * 数字转{@link BigInteger}
+ * null转换为0 * * @param number 数字 * @return {@link BigInteger} @@ -2055,7 +2060,7 @@ public class NumberUtil { return BigInteger.ZERO; } - if(number instanceof BigInteger){ + if (number instanceof BigInteger) { return (BigInteger) number; } else if (number instanceof Long) { return BigInteger.valueOf((Long) number); @@ -2065,14 +2070,15 @@ public class NumberUtil { } /** - * 数字转{@link BigInteger} + * 数字转{@link BigInteger}
+ * null或""或空白符转换为0 * - * @param number 数字 + * @param number 数字字符串 * @return {@link BigInteger} * @since 5.4.5 */ public static BigInteger toBigInteger(String number) { - return (null == number) ? BigInteger.ZERO : new BigInteger(number); + return StrUtil.isBlank(number) ? BigInteger.ZERO : new BigInteger(number); } /** @@ -2512,7 +2518,7 @@ public class NumberUtil { */ private static String removeNumberFlag(String number) { // 去掉千位分隔符 - if(StrUtil.contains(number, CharUtil.COMMA)){ + if (StrUtil.contains(number, CharUtil.COMMA)) { number = StrUtil.removeAll(number, CharUtil.COMMA); } // 去掉类型标识的结尾 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java index 28a5e101c..8804aea1c 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java @@ -3,6 +3,7 @@ package cn.hutool.poi.excel; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import java.io.File; @@ -122,6 +123,24 @@ public class BigExcelWriter extends ExcelWriter { // -------------------------------------------------------------------------- Constructor end + @Override + public BigExcelWriter autoSizeColumn(int columnIndex) { + final SXSSFSheet sheet = (SXSSFSheet)this.sheet; + sheet.trackColumnForAutoSizing(columnIndex); + super.autoSizeColumn(columnIndex); + sheet.untrackColumnForAutoSizing(columnIndex); + return this; + } + + @Override + public BigExcelWriter autoSizeColumnAll() { + final SXSSFSheet sheet = (SXSSFSheet)this.sheet; + sheet.trackAllColumnsForAutoSizing(); + super.autoSizeColumnAll(); + sheet.untrackAllColumnsForAutoSizing(); + return this; + } + @Override public ExcelWriter flush(OutputStream out, boolean isCloseOut) throws IORuntimeException { if(false == isFlushed){ diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/test/BigExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/test/BigExcelWriteTest.java index addcd618d..6cf85898d 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/test/BigExcelWriteTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/test/BigExcelWriteTest.java @@ -18,6 +18,7 @@ import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -217,4 +218,35 @@ public class BigExcelWriteTest { writer.write(data).flush(); } } + + @Test + @Ignore + public void issue1210() { + // 通过工具类创建writer + String path = "d:/test/issue1210.xlsx"; + FileUtil.del(path); + BigExcelWriter writer = ExcelUtil.getBigWriter(path); + writer.addHeaderAlias("id", "SN"); + writer.addHeaderAlias("userName", "User Name"); + + List> list = new ArrayList<>(); + list.add(new HashMap() { + private static final long serialVersionUID = 1L; + + { + put("id", 1); + put("userName", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + }}); + + list.add(new HashMap() { + private static final long serialVersionUID = 1L; + + { + put("id", 2); + put("userName", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); + }}); + writer.write(list, true); + writer.autoSizeColumnAll(); + writer.close(); + } }