【问题标题】:Apache POI Excel workbook creation taking a long timeApache POI Excel 工作簿创建需要很长时间
【发布时间】: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.");

需要明确的是,dataStreamInputStream。 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


【解决方案1】:

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

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

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

另一种选择是提取最小可能的 sn-p 代码来重现这一点,然后您可以查看需要删除哪些其他内容以使其运行得更快。

【讨论】:

    【解决方案2】:

    改用 csv 格式。我们在使用 POI 库时遇到了同样的问题,我们现在正在下载 csv 文件而不是 excel 文件,它非常轻巧且下载速度很快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多