导出大数据量excel,在构建表格时缓慢,有哪些优化方案?

img

我使用的是SXSSFWorkbook,经过排查在构建表格这一块时非常缓慢,我有尝试过使用new ThreadPoolExecutor线程池,但还是很慢,友友们有好的优化方案嘛?

对于SXSSFWorkbook构建表格缓慢的问题,可以考虑以下几个优化方案:

使用SXSSFRow和SXSSFCell:SXSSFWorkbook是基于XSSFWorkbook的,但是SXSSFWorkbook使用了一些优化技术,例如使用SXSSFRow和SXSSFCell代替XSSFRow和XSSFCell,从而提高了构建表格的效率。

使用SXSSFDataValidationHelper:SXSSFWorkbook中提供了SXSSFDataValidationHelper,可以用于构建数据校验规则,从而提高了构建表格的效率。

使用SXSSFSheet.setAutoFilter:SXSSFWorkbook中提供了SXSSFSheet.setAutoFilter,可以用于设置自动筛选,从而提高了构建表格的效率。

使用SXSSFWorkbook.setCompressTempFiles:SXSSFWorkbook中提供了SXSSFWorkbook.setCompressTempFiles,可以用于设置是否压缩临时文件,从而提高了构建表格的效率。

需要根据实际情况进行选择和优化,综合考虑效率、稳定性、可维护性等因素。

以下是使用SXSSFWorkbook构建Excel的Java示例代码:


import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelWriter {
    public static void main(String[] args) throws IOException {
        // 创建SXSSFWorkbook对象
        SXSSFWorkbook wb = new SXSSFWorkbook(100);

        // 创建Sheet对象
        XSSFSheet sheet = wb.createSheet("Sheet1");

        // 写入数据
        for (int rownum = 0; rownum < 1000000; rownum++) {
            org.apache.poi.ss.usermodel.Row row = sheet.createRow(rownum);
            for (int cellnum = 0; cellnum < 10; cellnum++) {
                org.apache.poi.ss.usermodel.Cell cell = row.createCell(cellnum);
                cell.setCellValue("value" + cellnum);
            }
        }

        // 输出Excel文件
        FileOutputStream out = new FileOutputStream("example.xlsx");
        wb.write(out);
        out.close();

        // 关闭SXSSFWorkbook对象
        wb.dispose();
    }
}

以上代码使用Apache POI库构建了一个包含1000000行、10列的Excel文件,可以作为SXSSFWorkbook构建Excel的参考。需要注意的是,SXSSFWorkbook需要占用大量的内存,需要根据实际情况进行调整和优化。
参考于:Cursor 应用

我自己解决了,就是将Y循环代码块进行优化,优化前需要6分钟优化后只需要2分钟,其它代码能力有限实在不知道咋优化了,反正就是优化处理数据的代码块,而且我这个是做的代码维护,之前导出excel使用的XSSFWorkbook导致大数据量会直接内存溢出,我这里是先替换成SXSSFWorkbook解决了内存溢出再进行的性能优化