EasyExcel多sheet页写入,sheetNo不起作用问题

一 :背景

大数据量导出,需要做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);
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值