创建XSSFWorkbook实例以读取XSLX文件时出现OutOfMemory问题

时间:2015-07-02 13:17:00

标签: out-of-memory apache-poi xlsx xssf

根据业务功能,我们需要在多线程环境中的不同位置读取多个excel文件(.xls和.xlsx格式)。每个线程负责读取文件。为了测试性能,我们创建了两个.xls和.xlsx格式的文件集。一个文件集只有20行数据,而其他文件集包含300,000行数据。我们能够成功读取.xls格式的两个文件并将数据加载到表中。即使对于20行数据.xlsx文件,我们的源代码也能正常工作。 但是当执行流程开始读取.xlsx文件时,应用程序服务器会突然终止。当我开始追查这个问题时,我一直都是 在创建 XSSFWorkbook 实例时遇到一个奇怪的问题。请参阅下面的代码段:

OPCPackage opcPackage = OPCPackage.open(FILE);
System.out.println("Created OPCPackage instance.");
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
System.out.println("Created XSSFWorkbook instance.");
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook, 1000);
System.out.println("Created SXSSFWorkbook instance.");[/code]

输出

Process XLSX file EXCEL_300K.xlsx start.
Process XLSX file EXCEL.xlsx start.
Created OPCPackage instance.
Created OPCPackage instance.
Created XSSFWorkbook instance.
Created SXSSFWorkbook instance.
Process XLSX file EXCEL.xlsx end.

对于较大的文件集,执行挂起      XSSFWorkbook工作簿=新的XSSFWorkbook(opcPackage); 导致堆空间问题。请帮我解决这个问题。

提前致谢。

谢谢,

桑卡尔。

1 个答案:

答案 0 :(得分:0)

在尝试了很多解决方案后,我发现处理XLSX文件需要大量内存。但使用POI 3.12库有很多优点。

  1. 更快地处理excel文件。
  2. 有更多API来处理excel文件,例如关闭工作簿,使用File实例打开excel文件等。