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

时间:2014-04-27 23:08:48

标签: 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.");

为了清楚起见,dataStreamInputStream。在第一和第二日志语句之间发生30秒延迟。正如我之前所说,我已尝试用new XSSFWorkbook(dataStream)替换工厂,但延迟仍然存在。

修改-2

我运行了一个独立测试,除了工作簿初始化之外什么都不做,使用1)File,还有2)InputStream,其中源是我遇到问题的xlsx文件。它们都在~2秒内完成。

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

所以,我不知道这是App Engine的问题,还是POI不喜欢FileItemStream正在返回的InputStream的味道。顺便说一句,我无法使用File而不是InputStream尝试初始化,因为App Engine不允许写入文件系统。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

请改用csv格式。我们使用POI库时遇到了同样的问题,现在我们正在下载csv文件而不是excel文件,这个文件很轻,可以快速下载。