【发布时间】:2014-06-13 08:30:03
【问题描述】:
我注意到使用 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 秒内完成。
我应该早点添加一些背景。我正在使用谷歌应用引擎。我提供给 POI 的输入流是从上传到服务器的文件中检索的。 App Engine 不支持 Servlet 3.0(用于处理文件上传),因此我必须使用 Apache Commons FileUpload lib 来检索文件数据。最终,我得到的数据是从FileItemStream#openStream() 检索到的InputStream。这是我提供给 POI 的。
所以,我不知道这是否是 App Engine 的问题,或者 POI 是否不喜欢 FileItemStream 返回的 InputStream 的风格。顺便说一句,我无法尝试使用 File 而不是 InputStream 进行初始化,因为 App Engine 不允许写入文件系统。
【问题讨论】:
-
您是否尝试过在构造函数中使用创建新工作簿并调用它
workbook.write而不是WorkbookFactory.create()?它会影响您的执行时间吗?您使用的是什么 POI 版本,在 3.9 版本中引入了一些性能改进:stackoverflow.com/questions/18957278/… -
我正在使用 v3.10,我发现延迟仅发生在 xlsx 文件中(特别是我在问题中提到的 15-20 秒初始化延迟发生在 365KB xslx 文件中) .使用 25KB xls 文件(数据相同),延迟只有 1-2 秒。我不确定您所说的
workbook.write是什么意思。可以举个小例子吗? -
嗯,延迟好像很奇怪,能否请您添加您用于创建 XLSX 的代码?
-
您使用 InputStream 有什么原因吗?只有docs make it pretty clear那个文件会更快,内存更低...
标签: java apache-poi