java - Apache POI Excel 工作簿创建需要很长时间

标签 java apache-poi

我注意到使用 Apache POI v3.10 的 xlsx 文件的工作簿创建语句,例如`

Workbook wb = WorkbookFactory.create(inputStream) 

Workbook wb = new XSSFWorkbook(inputStream)

...需要很长时间(约 30 秒)并且文件只有 72 行 10 列 (365KB)。

问题不大,就是有点过分了。我想知道我是做错了什么还是没有做我应该做的事情。具有相同数据(但只有 25KB)的 xls 文件的实例化只需要 1 或 2 秒。如果这是正常的,那么谁能告诉我。

编辑:

这是我正在使用的工作簿创建代码:

LOG.info("Loading Excel Workbook...");
Workbook workbook;
try {
    workbook = WorkbookFactory.create(dataStream);
} catch (InvalidFormatException e) {
    throw new IOException("Invalid file format ==> " + e.getMessage());
}
LOG.info("Workbook loaded.");

需要说明的是,dataStream 是一个InputStream。 30 秒的延迟发生在第一个和第二个日志语句之间。正如我之前所说,我已尝试用 new XSSFWorkbook(dataStream) 替换工厂,但延迟仍然存在。

Edit-2:

我运行了一个独立测试,除了使用 1) File 和 2) InputStream 进行工作簿初始化外,它什么都不做,其中源是 xlsx 文件一直有麻烦。他们都在大约 2 秒内完成。

我应该早点添加一些背景。我正在使用 Google App Engine。我提供给 POI 的输入流是从上传到服务器的文件中检索的。 App Engine 不支持 Servlet 3.0(用于处理文件上传),因此我必须使用 Apache Commons FileUpload 库来检索文件数据。最终,我得到的数据是从 FileItemStream#openStream() 检索到的 InputStream .这是我提供给 POI 的。

因此,我不知道这是否是 App Engine 的问题,或者 POI 是否不喜欢 FileItemStream 返回的 InputStream 的风格。顺便说一句,我无法尝试使用 File 而不是 InputStream 进行初始化,因为 App Engine 不允许写入文件系统。

最佳答案

我会使用可用的分析工具之一进行一些分析,例如JVisualVM、Dynatrace、JProfiler、..

只有这样你才能确定时间花在了你的代码中,毕竟它可能是一些意想不到的地方,你会在这里追错了马。

即您可能会从其他地方收到 InputStream,它实际上可能是通过 Internet 从某些外部内容下载的,而且线路可能很慢,因此所有的阅读都需要很长时间。或者可能是磁盘设置或内存不足导致大量 GC 正在运行,因为您已接近极限,...

另一种选择是提取可重现此代码的尽可能小的代码片段,然后您可以看到还需要删除哪些内容以使其运行得更快。

关于java - Apache POI Excel 工作簿创建需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23330156/

相关文章:

java - 使用 apache POI 读取 ms excel 时不保留前导零

java - 需要在一个 git 存储库中调用两个分支

java - Logback JMSAppender 不清理与 ActiveMQ 的连接

java - 像素变化监听器java

java.lang.ClassNotFoundException : org. apache.xmlbeans.XmlException 异常

java - 使用 POI api 将页脚添加到 ms word

java - 如何将 Typesafe Akka 与 Node.js 结合使用

Java:如何将默认值设置为另一个注释作为其属性的注释?

apache-poi - 编辑/写入工作簿,无需以不同名称保存

java - POI - null 后文件意外结束