gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:00 26 4
gpt4 key购买 nike

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

这是因为我有一些复杂的公式,我将其用作创建新行的模板,用正则表达式替换单元格索引。

问题是性能很糟糕,生成大约 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 库都会重新评估或重新解析或重新处理所有前面的行。

谁知道怎么解决这个问题?提前致谢。

最佳答案

天哪...我想我找到了...

原文是:

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

关于java - Apache POI 公式单元格复制非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9444400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com