POI 性能

2022-09-02 03:09:14

我正在 J2EE Web 应用程序中使用 POI 来生成工作簿。但是,我发现POI需要大约3分钟才能创建一个具有25K行(每行约15列)的工作簿。这是POI性能问题,还是花费那么多时间是合理的?是否有其他已知具有更好性能的 API?


答案 1

如果您使用“流式”POI API 而不是标准 POI API,则使用 POI 写入大型文件的性能可能会大大降低。实际上,默认情况下,POI会将所有数据保留在内存中,然后在最后一次性写入所有数据。对于大文件,这种内存占用可能大得离谱。您可以使用流式处理 API 来控制内存的使用方式以及数据逐步写入磁盘的方式。

要创建流式处理工作簿,请使用类似下面的内容:

  SXSSFWorkbook book = new SXSSFWorkbook(); 
  book.setCompressTempFiles(true);

  SXSSFSheet sheet = (SXSSFSheet) book.createSheet();
  sheet.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk
  // ...

答案 2

如果看到POI花费这么多时间来生成这样的文件,我会感到非常惊讶。我刚刚在大约18秒内生成了一个包含30000行x 10个单元格的工作表(公平地说,没有格式)。原因可能是以下原因之一:

  • POI 日志记录可能已打开,如此所述
  • 您正在从交换内存运行
  • VM 可用堆可能非常低

推荐