【问题标题】:Apache Poi Performance issues opening a spreadsheet that is packaged inside a jarApache Poi 性能问题打开包装在 jar 中的电子表格
【发布时间】:2016-05-24 01:19:55
【问题描述】:

我正在尝试使用 Apache Poi 3.14 打开一个非常小的电子表格。 电子表格是 XLSX,有 4 个工作表,仅包含带边框的阴影列标题 (15kB)

我正在使用以下内容访问位于我的 java 项目内的文件夹中的电子表格(导​​出时打包在 jar 中)。

     OPCPackage p = OPCPackage.open(getClass().getResourceAsStream(EXPORT_TEMPLATE));
     XSSFWorkbook wb =  new XSSFWorkbook(p);

当我直接从 Eclipse IDE 运行它时,工作簿几乎会立即打开,但是当我导出应用程序并运行 jar 时,需要 15 秒才能打开工作簿。

在添加代码以从头开始创建工作表之前,我试图弄清楚如何提高这种性能。

【问题讨论】:

  • 经过进一步测试,我发现即使从头开始创建工作簿也需要很长时间,所以我不确定我做错了什么
  • 您是否仅限于使用 Apache POI 3.14?如果不是,我之前写了一个小程序,既读写xlsx文件,但它使用POI 3.15。 stackoverflow.com/questions/37366599/… 这是链接。我将完成阅读和编写工作簿的时间平均为 6 秒(不复制格式)。也许这会有所帮助。
  • 我应该注意,我的测试工作簿有 5000 行,100 列。不过只有一个标签。
  • 我尝试了 3.15,但问题仍然存在。我不明白它如何在开发环境中运行得如此之快,但在它之外却如此之慢。也许在创建 jar 的过程中出了点问题,但我无法想象是什么。这只是使用 Workbook wb = new XSSFWorkbook(); 创建一个空白工作簿;
  • 我尝试创建一个 HSSFWorkbook 并且效果很好,但我确实需要使用 XLSX 电子表格

标签: java performance apache-poi


【解决方案1】:

企业反恶意软件应用程序正在影响工作簿创建过程!

【讨论】:

    【解决方案2】:

    听起来在 IDE 内部和您的应用程序中有不同的 Classloader 实现在工作,而在 Eclipse 之外随机访问会减慢很多。

    我会通过将资源完全从 jar 文件中提取到一个字节 [] 中来测试这一点,例如通过 Commons-IO,然后才构造它:

    byte[] bytes = IOUtils.toByteArray(getClass().getResourceAsStream(EXPORT_TEMPLATE))
    XSSFWorkbook wb =  new XSSFWorkbook(new ByteArrayInputStream(bytes));
    

    【讨论】:

    • 我尝试了您的建议,但得到了相同的结果。当我在内存中实例化一个空工作簿时,我遇到了同样的问题。我确定这是我们的反恶意软件应用程序的问题。创建工作簿时,我可以在任务管理器中看到它正在消耗 cpu 时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多