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(); + } + } }