使用.withTemplate(file)
将临时数据文件和真实数据文件合并的方式,在生产环境大批量数据下,完全不可取,有很高的内存溢出风险
伪代码
java
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);
}
}
开发过程验证时,产生内存溢出
内存正常的用法
java
// 方法1 如果写到同一个sheet
String 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();