我在J2EE Web应用程序中使用POI来生成工作簿.但是,我发现POI大约需要3分钟来创建一个25K行的工作簿(每行大约15列).这是POI性能问题,还是花费大量时间是合理的?是否有其他API可以提高性能?
如果您使用"流式"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 // ...
看到POI花了那么多时间来生成这样的文件,我会感到非常惊讶.我刚刚在大约18s内生成了一张30000行×10个单元格的纸张(没有格式化,公平).原因可能是以下之一:
POI记录可能被打开,如所描述这里
你是从交换内存运行
您的VM可用堆可能非常低