ExcelBatchExportService.appendData导出的问题

博客内容讲述了在数据量过大时,如何通过分页查询避免内存溢出并使用ExcelBatchExportService进行批量导出。在导出过程中遇到的问题是新sheet页丢失标题和格式。为解决这个问题,作者选择修改ExcelBatchExportService的源码,增加在创建新sheet时复制标题和格式的功能,从而实现新sheet的样式一致性。这种方法简化了重新设置格式的复杂过程。

首先因为导出需要创建多个sheet页,而官方给得方法是将所有查询出来放进集合,然后调用方法,但是由于数据量大,全部查询出来,内存会溢出,所以要分页查询,然后分页。
然后想到使用ExcelBatchExportService,初始化时可以设置每个sheet最大row数量。

ExportParams exportParams = new ExportParams(title,null);
        exportParams.setStyle(MyExcelExportStatisticStyler.class);
        exportParams.setMaxNum(50000);//表示每页最多5W
        ExcelBatchExportService exportService = new ExcelBatchExportService();
        exportService.init(exportParams, cls);

当使用appendData方法添加的数量超过之后,将会新建一个sheet页面存放数据,问题就是这个时候产生的,如果设置了标题和表头,新建的sheet没有标题和表头,并且格式也不会保存下来。
看了半天源码,没有想到其他解决方案,一个个重新设置格式,感觉过于麻烦,然后想到了一个方法,把ExcelBatchExportService的源码拷出来,修改appendData方法。改成如图所示的样子就好

public Workbook appendDataCreateSheet(Collection<?> dataSet) {
		//由此可以看出,这里判断如果超过最大值,就新建一个sheet
        if (this.sheet.getLastRowNum() + dataSet.size() > this.entity.getMaxNum()) {
            this.sheet = this.workbook.createSheet();
            //添加重新生成表格样式方法
            this.insertDataToSheet(this.workbook, entity, excelParams, (Collection)null, this.sheet);
            //index根据不同的情况定,我的表头和标题有2行,设置的2
            this.index = 2;
        }
//下面不需要动
        Iterator its = dataSet.iterator();

        while(its.hasNext()) {
            Object t = its.next();

            try {
                this.index += this.createCells(this.patriarch, this.index, t, this.excelParams, this.sheet, this.workbook, this.rowHeight, 0)[0];
            } catch (Exception var5) {
                LOGGER.error(var5.getMessage(), var5);
                throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, var5);
            }
        }

        return this.workbook;
    }

然后循环查询找里面直接调用就好了,注意这里调用你拷贝修改的类名。

for(){
...
List list = mapper.selectPage();
workbook = exportService.appendData(list);
...
}

`java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0` 错误通常表示在尝试访问一个空数组或空列表的元素时发生了越界访问。在使用 `easypoi-base-4.1.0` 进行 Excel 导出时出现此错误,可能是因为传递给导出方法的数据为空。以下是可能的解决方法: ### 检查数据是否为空 在调用导出方法之前,确保要导出的数据列表不为空。可以添加一个简单的检查来避免空列表的情况: ```java import java.util.List; // 假设 dataList 是要导出的数据列表 List<YourDataClass> dataList = getDataFromSomewhere(); if (dataList == null || dataList.isEmpty()) { // 处理数据为空的情况,例如给出提示信息 System.out.println("No data to export."); return; } // 继续进行导出操作 ``` ### 检查数据来源 确保从数据源获取的数据是正确的。可能是数据源返回了空列表,或者在数据处理过程中出现了问题导致数据丢失。 ### 调试代码 在导出方法中添加调试信息,打印出数据列表的大小和内容,以便确认数据是否正确: ```java import java.util.List; List<YourDataClass> dataList = getDataFromSomewhere(); System.out.println("Data list size: " + (dataList != null ? dataList.size() : 0)); if (dataList != null) { for (YourDataClass data : dataList) { System.out.println(data); } } ``` ### 检查导出方法的参数 确保传递给 `easypoi` 导出方法的参数正确,特别是数据列表的参数。 ### 示例代码 以下是一个简单的使用 `easypoi` 导出 Excel 的示例,包含数据检查: ```java import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import org.apache.poi.ss.usermodel.Workbook; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; class YourDataClass { private String name; public YourDataClass(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class ExcelExportExample { public static void main(String[] args) { List<YourDataClass> dataList = getDataFromSomewhere(); if (dataList == null || dataList.isEmpty()) { System.out.println("No data to export."); return; } ExportParams exportParams = new ExportParams(); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, YourDataClass.class, dataList); try (FileOutputStream fos = new FileOutputStream("exported_excel.xlsx")) { workbook.write(fos); System.out.println("Excel exported successfully."); } catch (IOException e) { e.printStackTrace(); } } private static List<YourDataClass> getDataFromSomewhere() { // 模拟获取数据 List<YourDataClass> dataList = new ArrayList<>(); // 可以在这里添加实际的数据 return dataList; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值