Apache POI公式的单元格复制非常慢

我使用Apache POI 3.8生成了一个excel文件,并且需要复制一些现有的n°次。

这是因为我有一些复杂的公式,我使用它作为模板来创build新行,用正则expression式replace单元格索引。

问题是,性能是可怕的,需要2小时生成4000行。

我已经指出问题不在正则expression式部分,正如我最初的想法,而是在公式单元格的重复中。

我实际上使用它来复制公式单元格:

case Cell.CELL_TYPE_FORMULA: newCell.setCellType(oldCell.getCellType()); newCell.setCellFormula(oldCell.getCellFormula()); break; 

如果我将这个公式复制为这样的文本:

 case Cell.CELL_TYPE_FORMULA: newCell.setCellType(Cell.CELL_TYPE_STRING); newCell.setCellValue("="+oldCell.getCellFormula()); break; 

这是相当快,即使我的正则expression式。

无论如何,这是一个不完美的解决scheme,因为公式有英文关键字(即IF()),当我需要以意大利语格式写。

更多的是,像这样插入公式的单元格需要在excel中强制重新评估,例如“replace all =>'='='”。

由于HSSFFormulaParser.parse(),问题似乎依赖于setCellFormula()。

奇怪的是,parsing时间似乎成指数增长:

 100 rows -> 6785ms 200 rows -> 23933ms 300 rows -> 51388ms 400 rows -> 88586ms 

看来,每次我复制公式时,POI库都会重新评估或重新parsing或重新整理所有前面的行。

有谁知道如何解决这个问题? 提前致谢。

噢我的…我想我find了…

原来是:

 // If the row exist in destination, push down all rows by 1 else create a new row if (newRow != null) { worksheet.shiftRows(destinationRowNum, worksheet.getLastRowNum(), 1); } else { newRow = worksheet.createRow(destinationRowNum); } 

我已经评论了一切只剩下

 newRow = worksheet.createRow(destinationRowNum); 

而现在我已经下降到60秒来处理所有的行!

也许,我的模板里有一些污点,导致POI在每次迭代时都会改变一切。