【记录踩过的坑】~~~~~~~~~
需求是,一批数据多sheet导出,因为不确定数据大小,无法让前端用流接,只能上传至oss,给前端返回地址下载;
ExcelWriter excelWriter = EasyExcel.write(out, EncodingExcelVO.class).build();
//单个sheet数量5000,超出则分多个sheet
if (lists.size() > Constant.EXCEL_SHEET_MAX_ROWS) {
List<List<EncodingExcelVO>> split1 = CollUtil.split(lists, Constant.EXCEL_SHEET_MAX_ROWS);
for (int i = 0; i < split1.size(); i++) {
WriteSheet writeSheet = EasyExcel.writerSheet("模板" + i).build();
excelWriter.write(split1.get(i), writeSheet);
}
} else {
EasyExcel.write(out, EncodingExcelVO.class).sheet("模板").doWrite(lists);
}
单次如果大于5000(根据自己需求设置)我是分个sheet导出的,但是发现一个问题,5000以下直接导出没有问题,数据能正常显示,一但超过5000,本地文件就显示为空,得过一会儿才能显示数据。但是这个时间是不确定得。就导致上传到oss是个空文件。
原因:一批数据导出到同一个sheet,会自己等流完成后关闭,但是多个sheet不会自己去flush(),最好手动去刷新,问题解决。
解决办法:
ExcelWriter excelWriter = EasyExcel.write(out, EncodingExcelVO.class).build();
//单个sheet数量5000,超出则分多个sheet
if (lists.size() > Constant.EXCEL_SHEET_MAX_ROWS) {
List<List<EncodingExcelVO>> split1 = CollUtil.split(lists, Constant.EXCEL_SHEET_MAX_ROWS);
for (int i = 0; i < split1.size(); i++) {
WriteSheet writeSheet = EasyExcel.writerSheet("模板" + i).build();
excelWriter.write(split1.get(i), writeSheet);
}
//此处多个sheet单独去写,write()方法不会自己finish(),需要手动处理
excelWriter.finish();
} else {
//一次性写出,dowrite(),会自己finish();
EasyExcel.write(out, EncodingExcelVO.class).sheet("模板").doWrite(lists);
}
下面是源码: