我注意到使用 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/