读取xlsx文件时,缓慢的XSSFWorkbook和WorkbookFactory

时间:2014-02-26 19:51:28

标签: performance apache-poi xlsx xssf

我见过几年前开发人员遇到过这个问题。我研究了许多论坛和官方POI文件。尽管如此,我还没有找到答案。 所以问题是..我尝试了以下两个片段:

Workbook wb = WorkbookFactory.create(new File("spreadsheet.xlsx"));

File file = new File("C:\\spreadsheet.xlsx");
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

并且任何一种方法大约需要5-6分钟(如果应用程序没有内存不足)来处理一个简单且相当小的spreadsheet.xlsx文件(200KB)。

我需要做些什么来解决这个问题? (我正在使用Apache POI 3.9)

/*****************************/

该过程在以下位置需要很长时间:

public class XSSFSheet extends POIXMLDocumentPart implements Sheet{
...
protected void read(InputStream is) throws IOException {
    try {
      -->>> worksheet = WorksheetDocument.Factory.parse(is).getWorksheet();
    } catch (XmlException e){
        throw new POIXMLException(e);
    }
}
...

我无法进一步调试。 VisualVM也说同样的事情......!

1 个答案:

答案 0 :(得分:1)

可能导致加载时间的一个因素是数据已粘贴到工作表中,以便使用的范围包括每一行,即当您使用sheet.usedrange行计数时,它返回> 1,000,000行..不知道这是怎么发生的但是我发现我需要执行一个中间步骤,其中在加载工作簿之前我通过使用一些vba脚本“清理”它。该工作簿有大约20张,每行大约5000行,每个都由业务的不同部分填写,加载需要相当长的时间(可能是4分钟),但在这种情况下这是可以接受的。在我添加清洁阶段之前,它运行了超过30分钟,这是不可接受的....

用户运行我所指的过程,按两个按钮。第一个清理,第二个清理其余部分。使用Runtime.getruntime.exec触发第一个进程,并创建一个空文本文件,除非测试文件在那里,否则第二个进程将不会运行。