(Java)关于EasyExcel根据数据条数导出多个sheet

问题场景:

将查询出来一个数据量很大的集合,导出到Excel中多个sheet,每个sheet的数据为5000条。

     下面举个例子:

        我们将查询出来的学生的姓名和成绩,导出为Excel,每个sheet只有五条数据。如果我们查询出来的数据有17条,那么,第一个和第二个sheet只有五条数据,第三个sheet就是两条数据。

第一个sheet第二个sheet第三个sheet
姓名成绩姓名成绩姓名成绩
善傲旋89水仲舒95庆洁玉95
厚雨双92应子菡99线雅娴97
表俊哲98勤漫95
葛家99隋睿诚96
崔语林100鹿芷荷100

解决问题:

导出的实体类:

@Data
public class dataVO {
 
    @Schema(description = "姓名")
    @ExcelProperty("姓名")
    private String name;
 
    @Schema(description = "成绩")
    @ExcelProperty("成绩")
    private String score;
}

完整导出代码:

public void export(dataDTO dto, HttpServletRequest request, HttpServletResponse response) {
        List<dataVO> voList = repairOrderErrMapper.selectCustomerVinExport(dto);

        Integer pageSize = 5000;

        //这里做了数据非空和数据量过多的处理,防止sheet页过多
        if (!CollectionUtils.isEmpty(voList) && voList.size() > 100 * 5000) {
            throw new Exception("common.error.export100.out.memory");
        }

        //数据分组处理:将数据分割开来,一个sheet所包含的数据,用map的 key 和 value 封装起来
        Map<String, List<dataVO>> dataMap = new HashMap<>();
        List<dataVO> dataList = new ArrayList<>();
        int number = 1;
        int sheet = 1;
        for (int i = 0; i < voList.size(); i++) {
            dataVOvo = voList.get(i);
            dataList.add(vo);
            number ++;
            if (number % pageSize == 0) {
                dataMap.put("Sheet"+sheet, dataList);
                sheet++;
                dataList = new ArrayList<>();
            }
        }
        //不足pageSize 的数据
        if(!CollectionUtils.isEmpty(dataList)){
            dataMap.put("Sheet"+sheet, dataList);
        }

        FrameHttpUtil.setExportFileName(request, response, "信息导出.xlsx");
        OutputStream out = null;
        ExcelWriter excelWriter = null;
        try {
            out = response.getOutputStream();
            excelWriter = EasyExcel.write(out, dataVO.class).
                    registerWriteHandler(ExcelCellStyleStrategy.horizontalCellStyleStrategyBuilder()).
                    build();
            int i = 0;
            //定义一个循环去写入Excel
            for (Map.Entry<String, List<dataVO>>map : dataMap.entrySet()) {
                WriteSheet writeSheet = EasyExcel.writerSheet(i).head(createHeadString()).build();//这里表头重新定义了
                writeSheet.setSheetName(map.getKey());
                excelWriter.write(map.getValue(), writeSheet);
                i++;
            }
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            if (excelWriter != null) {
                excelWriter.finish();
            }
            IOUtils.closeStream(out);
        }
    }


    //重新定义表头
    private List<List<String>> createHeadString() {
        List<List<String>> headList = new ArrayList<>();
        headList.add(Arrays.asList("姓名", "姓名"));
        headList.add(Arrays.asList("成绩", "成绩"));
        return headList;
    }

参考文档:写Excel | Easy Excel

欢迎指出问题、评论

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值