POI表现

The*_*ine 19 java excel apache-poi

我在J2EE Web应用程序中使用POI来生成工作簿.但是,我发现POI大约需要3分钟来创建一个25K行的工作簿(每行大约15列).这是POI性能问题,还是花费大量时间是合理的?是否有其他API可以提高性能?

Eri*_*las 14

如果您使用"流式"POI API而不是标准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
  // ...
Run Code Online (Sandbox Code Playgroud)

  • 这对我的用例产生了巨大的影响。我有一个相对简单的工作表,有 45,000 行和 20 列,没有公式或花哨的格式。在我的生产虚拟机上运行,​​最初只需要不到 2 分钟即可生成。切换到流式工作簿后,时间缩短至 6 秒。哇。 (2认同)

Tom*_*vic 12

看到POI花了那么多时间来生成这样的文件,我会感到非常惊讶.我刚刚在大约18s内生成了一张30000行×10个单元格的纸张(没有格式化,公平).原因可能是以下之一:

  • POI记录可能被打开,如所描述这里
  • 你是从交换内存运行
  • 您的VM可用堆可能非常低

  • 根据我的经验,POI有点慢,如果POI需要作为内存的***负载或需要关闭日志,那么它绝对是**POI问题.我们使用POI生成报告,一旦生成多个电子表格,它就变得非常慢.此外,对于每秒进行数十亿次循环的CPU来说,30000行×10个单元实际上是一个非常微小的数据量.所以,是的,POI是一个相当缓慢的API. (3认同)
  • @Gugussee:我想说将30k行的持久性与CPU时钟进行比较有点误导.如果有效地使用大型电子表格很容易,那么两个旗舰办公室生产力套件就不需要那么多工程师/年来打破64k行限制边界. (2认同)