diff --git a/CHANGELOG.md b/CHANGELOG.md
index 01ea749c5..49fb4c0cf 100644
--- a/CHANGELOG.md
+++ b/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)
-------------------------------------------------------------------------------------------------------------
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 f1fbc11ed..28a5e101c 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
@@ -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文件
@@ -116,11 +122,22 @@ 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();
}
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 791c0314f..addcd618d 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
@@ -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 map1 = MapUtil.of("id", "123456");
+ final Map 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();
+ }
+ }
}