1

我已经看到开发人员从几年前就遇到了这个问题。我研究了很多论坛和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 分钟(如果应用程序没有耗尽内存)来处理一个简单且相当小的电子表格.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 也说了同样的话..!

4

1 回答 1

1

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

用户运行我所指的过程,按下两个按钮。第一个清洁,第二个做剩下的。第一个进程使用 Runtime.getruntime.exec 触发并创建一个空文本文件,除非测试文件存在,否则第二个进程不会运行。

于 2015-03-16T00:40:44.370 回答