一 :背景
大数据量导出,需要做sheet切分,每个sheet页支持80w以内数据写入。在执行代码过程中发现sheetNo值设置+1无法生效
版本:easyexcel-1.1.2-beta4.jar
二:代码
1.问题代码
private static boolean writeRecordExcelList(String param, ExcelWriter writer) {
Sheet sheet = new Sheet(1, 0, User.class);
int count = 0;
int sheetNo = sheet.getSheetNo();
for (int i = 0; i < 10000; i++) {
//模拟查询
List list =new ArrayList();
if (count > 300) {
sheetNo += 1;
sheet.setClazz(SpmiCompositeFeeExportExcelVO.class);
sheet.setSheetNo(sheetNo );
sheet.setSheetName("明细详情" + sheetNo);
count = 0;
}
count += list.stream().count();
writer.write(list, sheet);
}
return true;
}
2.修复代码
private static boolean writeRecordExcelList(String param, ExcelWriter writer) {
Sheet sheet = new Sheet(1, 0, User.class);
int count = 0;
int sheetNo = sheet.getSheetNo();
for (int i = 0; i < 10000; i++) {
//模拟查询
List list =new ArrayList();
if (count > 300) {
sheetNo += 1;
sheet.setClazz(SpmiCompositeFeeExportExcelVO.class);
sheet.setSheetNo(sheetNo );
sheet.setSheetName("明细详情" + sheetNo);
count = 0;
}
count += list.stream().count();
//修复逻辑
Sheet tempSheet= new Sheet(sheet.getSheetNo(),1,User.class);
tempSheet.setSheetName(sheet.getSheetName());
writer.write(list, tempSheet);
}
return true;
}
三:原因
ExcelWriter.write方法 currentSheetParam 对象和入参 sheet对象指向通一块内存地址,当sheetNo变化,对应的currentSheetParam 对应也会发生变化。因此修复代码 需要临时new 一个 sheet对象
/**
* @param sheet
*/
public void currentSheet(com.alibaba.excel.metadata.Sheet sheet) {
if (null == currentSheetParam || currentSheetParam.getSheetNo() != sheet.getSheetNo()) {
cleanCurrentSheet();
//内存指向 sheet 对象,当sheet对象发生变化 currentSheetParam 也会一起变化
currentSheetParam = sheet;
try {
this.currentSheet = workbook.getSheetAt(sheet.getSheetNo() - 1);
} catch (Exception e) {
this.currentSheet = WorkBookUtil.createSheet(workbook, sheet);
}
buildSheetStyle(currentSheet, sheet.getColumnWidthMap());
/** **/
this.initCurrentSheet(sheet);
}
}