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

时间:2017-07-13 23:00:39

标签: java excel garbage-collection apache-poi large-data

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

在我看来,来自 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());
    }
}

1 个答案:

答案 0 :(得分:3)

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

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

上面链接的页面包含此图片,显示POI的电子表格API功能摘要:
Spreadsheet API Feature Summary