Apache POI公式细胞复制非常慢

时间:2012-02-25 13:27:25

标签: java excel apache-poi

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

这是因为我有一些复杂的公式,我用它作为模板来创建新行,用regexp替换单元格索引。

问题是性能很糟糕,生成大约4000行需要2小时。

正如我最初想的那样,我已经确定问题不在正则表达式部分中,而是在公式单元格的重复中。

我实际上用它来复制公式细胞:

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;

反而非常快,即使我的正则表达式已经到位。

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

更多,插入公式的单元格需要在excel中强行重新评估,例如“替换所有 - >'='和'='”。

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

奇怪的是,解析时间似乎呈指数级增长:

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

看起来,每次复制公式时,POI库都会重新评估或重新解析或重新解释所有前面的行。

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

1 个答案:

答案 0 :(得分:3)

哦,我的......我想我找到了......

原文是:

// 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在每次迭代时移动所有内容。