Browse Source

fix big excel writer bug

Looly 5 years ago
parent
commit
36e599f70b

+ 2 - 0
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)
 
 -------------------------------------------------------------------------------------------------------------
 

+ 20 - 14
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}<br>
+	 * Float、Double等有精度问题,转换为字符串后再转换<br>
+	 * 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}<br>
+	 * 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}<br>
+	 * 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}<br>
+	 * 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);
 		}
 		// 去掉类型标识的结尾

+ 19 - 0
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;
@@ -123,6 +124,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){
 			isFlushed = true;

+ 32 - 0
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<Map<String, Object>> list = new ArrayList<>();
+		list.add(new HashMap<String, Object>() {
+			private static final long serialVersionUID = 1L;
+
+			{
+			put("id", 1);
+			put("userName", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+		}});
+
+		list.add(new HashMap<String, Object>() {
+			private static final long serialVersionUID = 1L;
+
+			{
+			put("id", 2);
+			put("userName", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
+		}});
+		writer.write(list, true);
+		writer.autoSizeColumnAll();
+		writer.close();
+	}
 }