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