ソースを参照

fix Big writer bug

Looly 5 年 前
コミット
cf19fe3003

+ 2 - 1
CHANGELOG.md

@@ -16,7 +16,8 @@
 * 【json   】     修复append方法导致的JSONConfig传递失效问题(issue#906@Github)
 * 【core   】     修复CollUtil.subtractToList判断错误(pr#915@Github)
 * 【poi    】     修复WordWriter写表格问题(pr#914@Github)
-* 【core   】     修复IoUtil.readBytes缓存数组长度问题(issue#I1KIUE@Github)
+* 【core   】     修复IoUtil.readBytes缓存数组长度问题(issue#I1KIUE@Gitee)
+* 【core   】     修复BigExcelWriter多次flush导致的问题(issue#920@Github)
 
 -------------------------------------------------------------------------------------------------------------
 

+ 21 - 4
hutool-poi/src/main/java/cn/hutool/poi/excel/BigExcelWriter.java

@@ -1,11 +1,12 @@
 package cn.hutool.poi.excel;
 
-import java.io.File;
-
+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.SXSSFWorkbook;
 
-import cn.hutool.core.io.FileUtil;
+import java.io.File;
+import java.io.OutputStream;
 
 /**
  * 大数据量Excel写出
@@ -17,6 +18,11 @@ public class BigExcelWriter extends ExcelWriter {
 
 	public static final int DEFAULT_WINDOW_SIZE = SXSSFWorkbook.DEFAULT_WINDOW_SIZE;
 
+	/**
+	 * BigExcelWriter只能flush一次,因此调用后不再重复写出
+	 */
+	private boolean isFlushed;
+
 	// -------------------------------------------------------------------------- Constructor start
 	/**
 	 * 构造,默认生成xls格式的Excel文件<br>
@@ -117,10 +123,21 @@ public class BigExcelWriter extends ExcelWriter {
 	// -------------------------------------------------------------------------- Constructor end
 
 	@Override
+	public ExcelWriter flush(OutputStream out, boolean isCloseOut) throws IORuntimeException {
+		if(false == isFlushed){
+			isFlushed = true;
+			return super.flush(out, isCloseOut);
+		}
+		return this;
+	}
+
+	@Override
 	public void close() {
-		if (null != this.destFile) {
+		if (null != this.destFile && false == isFlushed) {
 			flush();
 		}
+
+		// 清理临时文件
 		((SXSSFWorkbook) this.workbook).dispose();
 		super.closeWithoutFlush();
 	}

+ 27 - 13
hutool-poi/src/test/java/cn/hutool/poi/excel/test/BigExcelWriteTest.java

@@ -1,17 +1,5 @@
 package cn.hutool.poi.excel.test;
 
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.IndexedColors;
-import org.junit.Ignore;
-import org.junit.Test;
-
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
@@ -19,7 +7,20 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.poi.excel.BigExcelWriter;
 import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
 import cn.hutool.poi.excel.style.StyleUtil;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 写出Excel单元测试
@@ -197,10 +198,23 @@ public class BigExcelWriteTest {
 	@Test
 	@Ignore
 	public void writeCellValueTest() {
-		String path = "e:/cellValueTest.xlsx";
+		String path = "d:/test/cellValueTest.xlsx";
 		FileUtil.del(path);
 		BigExcelWriter writer = new BigExcelWriter(path);
 		writer.writeCellValue(3, 5, "aaa");
 		writer.close();
 	}
+
+	@Test
+	@Ignore
+	public void closeTest() {
+		final Map<String, ?> map1 = MapUtil.of("id", "123456");
+		final Map<String, ?> map2 = MapUtil.of("id", "123457");
+		final List<?> data = Arrays.asList(map1, map2);
+		final String destFilePath = "d:/test/closeTest.xlsx";//略
+		FileUtil.del(destFilePath);
+		try (ExcelWriter writer = ExcelUtil.getBigWriter(destFilePath)) {
+			writer.write(data).flush();
+		}
+	}
 }