使用.withTemplate(file)
将临时数据文件和真实数据文件合并的方式,在生产环境大批量数据下,完全不可取,有很高的内存溢出风险
伪代码
public static void writeAppend(String fileName) {String filePath = "tempDir".concat(File.separator).concat(fileName);File file = new File(filePath);File tempFile = new File(filePath.concat(".tmp"));if (file.exists()){// 第二次按照原有格式,不需要表头,追加写入EasyExcel.write(file, TestData.class).needHead(false)// 这里有重大问题(拿中转的数据去做模板).withTemplate(file) .file(tempFile).sheet().doWrite(getDataList());} else {if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}// 第一次写入需要表头EasyExcel.write(file,TestData.class).sheet().doWrite(getDataList());}if (tempFile.exists()){file.delete();tempFile.renameTo(file);}}
开发过程验证时,产生内存溢出
内存正常的用法
EasyExcel重复多次写入
// 方法1 如果写到同一个sheetString fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";// 这里 需要指定写用哪个class去写ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();// 这里注意 如果同一个sheet只要创建一次WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来for (int i = 0; i < 5; i++) {// 分页去数据库或者其他服务查询数据,推荐主键范围加limit查询List<DemoData> dataList = getDataList();excelWriter.write(data, writeSheet);dataList = null;}// 千万别忘记finish 会帮忙关闭流excelWriter.finish();