我想用Apache POI阅读一个大的Excel 2007文件 . Quick start guide指出应该使用 File
来节省内存 .
打开工作簿(.xls HSSFWorkbook或.xlsx XSSFWorkbook)时,可以从File或InputStream加载工作簿 . 使用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());
}
但是,对于超过大约10000行的工作表,会产生 java.lang.OutOfMemoryError: Java heap space
.
我希望迭代只是懒惰地加载那些要读取的行,就像流一样 .
如何解决大型Excel文件的内存问题?我可以懒散地阅读Apache POI吗?
1 回答
POI提供了一个应该处理延迟加载的eventmodel API . 更多细节可以在POI documentation pages about eventmodel和other streaming options找到 .