Easyexcel多sheet导出数据延迟为空

【记录踩过的坑】~~~~~~~~~

需求是,一批数据多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);
                
            }


              

下面是源码:

在使用 EasyExcel 进行多 sheet 导出时,需要进行以下步骤: 1. 创建 Workbook 对象,通过 `Workbook.createSheet()` 方法创建多个 sheet。 2. 定义表头,通过 `Sheet.writeRow()` 方法将表头写入到每个 sheet 中。 3. 写入数据,通过 `Sheet.write()` 方法将数据写入到对应的 sheet 中。 4. 导出文件,通过 `Workbook.writeFile()` 方法将 Workbook 对象写入到文件中。 下面是一个示例代码,用于导出多个 sheet: ``` // 创建 Workbook 对象 Workbook workbook = new Workbook(); // 创建多个 sheet Sheet sheet1 = workbook.createSheet("Sheet1", 0); Sheet sheet2 = workbook.createSheet("Sheet2", 1); // 定义表头 String[] headers = {"姓名", "年龄", "性别"}; Row headerRow = sheet1.createRow(0); for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); } // 写入数据 List<User> userList = getUserList(); for (User user : userList) { Row row = sheet1.createRow(sheet1.getLastRowNum() + 1); row.createCell(0).setCellValue(user.getName()); row.createCell(1).setCellValue(user.getAge()); row.createCell(2).setCellValue(user.getGender()); } // 定义表头 String[] headers2 = {"学科", "成绩"}; Row headerRow2 = sheet2.createRow(0); for (int i = 0; i < headers2.length; i++) { Cell cell = headerRow2.createCell(i); cell.setCellValue(headers2[i]); } // 写入数据 List<Score> scoreList = getScoreList(); for (Score score : scoreList) { Row row = sheet2.createRow(sheet2.getLastRowNum() + 1); row.createCell(0).setCellValue(score.getSubject()); row.createCell(1).setCellValue(score.getScore()); } // 导出文件 workbook.writeFile("output.xlsx"); ``` 这个示例代码可以导出两个 sheet,第一个 sheet 包含用户信息,第二个 sheet 包含成绩信息。你只需要按照自己的需求修改表头和数据即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值