内存 – 如何使用Apache POI懒惰地阅读大型Excel 2007文件

我想用Apache POI阅读一个大的Excel 2007文件.
Quick start guide声明应该使用File来节省内存.

When opening a workbook, either a .xls HSSFWorkbook, or a .xlsx
XSSFWorkbook, the Workbook can be loaded from either a File or an
InputStream. Using a File object allows for lower memory consumption,
while an InputStream requires more memory as it has to buffer the
whole file.

因此我写了大约这个:

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());
}

但是,这会导致java.lang.OutOfMemoryError:具有超过大约10000行的工作表的Java堆空间.

我希望迭代只是懒惰地加载那些要读取的行,就像流一样.

如何解决大型Excel文件的内存问题?我可以懒散地阅读Apache POI吗?

最佳答案 POI提供了一个应该处理延迟加载的eventmodel API.更多细节可以在
POI documentation pages about eventmodel
other streaming options找到.

点赞