在 Apache POI Java 中将大数据转换为 excel

Converting a large data into excel in Apachi POI Java

我正在处理一个大型 CSV (~200 MB 的文本文件),我想将其转换为 excel sheet 但是工作簿变得如此消耗内存,以至于在进程中间,Java 抛出“GC 开销限制超出 ”! 如果我正在生成虚拟引用,我已经检查了代码,但我认为 none 存在。

在我看来,来自 Apachi - POI 的那些库调用可能会生成一些使垃圾收集器如此忙碌的引用。

我的问题是,我是否可以像文本文件一样将工作簿逐块写入文件,就像附加到文本文件而不将其放入内存一样。是否有任何解决方案,或者我在这里遗漏了什么?

GC在以下代码中抛出异常:

    private void updateExcelWorkbook(String input, String fileName, Workbook workbook) {
    try {
        Sheet sheet = workbook.createSheet(fileName);

        // Create a new font and alter it.
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 11);
        font.setBold(true);


        // Fonts are set into a style so create a new one to use.
        CellStyle style = workbook.createCellStyle();
        style.setFont(font);
        Row row;
        Cell cell;
        String[] columns;
        String[] lines = input.split("\n");
        int colIndex;
        int rowIndex = 1;

        for (String line : lines) {
            row = sheet.createRow(rowIndex++);
            columns = line.split("\t");
            colIndex = 0;

            for (String column: columns) {
                cell = row.createCell(colIndex++);
                if (rowIndex == 1)
                    cell.setCellStyle(style);
                cell.setCellValue(column);
            }
        }
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
}

似乎您使用的是 POI 用户模型,它占用的内存非常多,因为它将整个工作表保存在内存中,类似于 DOM 将整个 XML 文档保存在内存中。

您需要使用流媒体API。使用 POI,您可以使用 SXSSF 缓冲流 API 创建 .xlsx 文件,如此处所述:https://poi.apache.org/spreadsheet/index.html#SXSSF+(Since+POI+3.8+beta3)

上面链接的页面有这张图片,显示电子表格 API POI 的功能摘要:

(来源:apache.org