写入复杂的Excel文件时,GC Overhead限制超出错误

时间:2015-12-08 13:18:13

标签: java jvm apache-poi

在Java中我正在尝试编写包含27张的Excel工作簿,并且每张工作表附近有大约500到600列,但是当我运行程序时,它给了我GC Overhead错误。

这是我得到的例外。

XMIResource.OPTION_LAX_WILDCARD_PROCESSING

1 个答案:

答案 0 :(得分:1)

您应该使用SXSSFWorkbook。 SXSSF通过限制对滑动窗口内行的访问来实现其低内存占用,而XSSF允许访问文档中的所有行。不再在窗口中的旧行变得无法访问,因为它们被写入磁盘。

public static void main(String[] args) throws Throwable {
    SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
    Sheet sh = wb.createSheet();
    for(int rownum = 0; rownum < 1000; rownum++){
        Row row = sh.createRow(rownum);
        for(int cellnum = 0; cellnum < 10; cellnum++){
            Cell cell = row.createCell(cellnum);
            String address = new CellReference(cell).formatAsString();
            cell.setCellValue(address);
        }

    }

    // Rows with rownum < 900 are flushed and not accessible
    for(int rownum = 0; rownum < 900; rownum++){
      Assert.assertNull(sh.getRow(rownum));
    }

    // ther last 100 rows are still in memory
    for(int rownum = 900; rownum < 1000; rownum++){
        Assert.assertNotNull(sh.getRow(rownum));
    }

    FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
    wb.write(out);
    out.close();

    // dispose of temporary files backing this workbook on disk
    wb.dispose();
}

示例:https://poi.apache.org/spreadsheet/how-to.html#sxssf