如何使用 Apache POI 延迟读取大 Excel 2007 文件

ipa*_*lic 5 memory lazy-evaluation apache-poi

我想使用 Apache POI 读取一个大的 Excel 2007 文件。快速入门指南指出File应该使用 a 来节省内存。

打开工作簿(.xls HSSFWorkbook 或 .xlsx XSSFWorkbook)时,可以从文件或输入流加载工作簿。使用 File 对象可以降低内存消耗,而 InputStream 需要更多内存,因为它必须缓冲整个文件。

因此我写了这样的内容:

opcPackage = OPCPackage.open(file);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
XSSFSheet sheet = workbook.getSheetAt(0);
rows = sheet.rowIterator();
if (rows.hasNext()) {
Row row = rows.next();
    System.out.println(row.getCell(1).getStringCellValue());
}
Run Code Online (Sandbox Code Playgroud)

然而,这会导致java.lang.OutOfMemoryError: Java heap space工作表的行数超过大约 10000 行。

我希望迭代仅延迟加载那些要读取的行,就像流一样。

如何解决大型 Excel 文件的内存问题?我可以使用 Apache POI 进行懒惰阅读吗?

ipa*_*lic 2

POI 提供了一个事件模型 API 来处理延迟加载。有关 eventmodel其他流选项的更多详细信息,请参阅POI 文档页面。