Apache POI 3.7 OutOfMemoryError:写入大量没有行到xlsx文件时的Java堆空间

Hun*_*mer 6 java apache-poi

我需要在xlsx文件中写一个超过65000行的结果集.所以我想尝试使用Apache POI 3.7.但我收到OutOfMemoryError的错误:Java堆空间.除了增加似乎无法解决问题的JVM内存之外,我该如何解决这个问题.请帮忙.

简单示例代码:

public static void main(String[] args) throws IOException {
        Workbook wb = new XSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        Sheet sheet = wb.createSheet("new sheet");

        // Create a row and put some cells in it. Rows are 0 based.
        for (int i=0;i<65000;i++){
            Row row = sheet.createRow((int) i);
        // Create a cell and put a value in it.
        Cell cell = row.createCell(0);
        cell.setCellValue(1);

        // Or do it on one line.
        row.createCell(1).setCellValue(1.2);
        row.createCell(2).setCellValue(
                createHelper.createRichTextString("This is a string"));
        row.createCell(3).setCellValue(true);
        }


        // Write the output to a file
        FileOutputStream fileOut = new FileOutputStream("test1.xls");
        fileOut.flush();
        wb.write(fileOut);
        fileOut.close();
    }
Run Code Online (Sandbox Code Playgroud)

Tur*_*smo 11

您可能想要查看最近使用SXSSF API对POI项目执行的操作.还有的一个部分操作方法.
对于您提供的示例代码,这将非常适合您创建数据然后在创建后忘记它.使用SXSSF扩展,您可以立即开始将数据写入文件.这样可以减少内存占用.

请注意,此功能在Apache POI 3.7中不存在,但在Apache POI 3.8 beta 3中添加.
最终版本3.8目前正在投票中.因此,如果您必须使用最终版本,那么在发布之前不应该太久.