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在每次迭代时都会改变一切。
- 从java,如何在Excel电子表格closures的情况下给出一个实例中的多个电子表格
- 使用apache POI在java中将数据写入xls,xlsx,csv文件
- org.apache.poi.POIXMLException:使用Libre Office更新.xls文件后POI API中的java.lang.reflect.InvocationTargetException
- 错误:types不匹配:无法从HSSFWorkbook转换为工作簿
- 在Excel中使用命名范围作为系列值
- Java和Excel:值被读取错误
- 将Apache POI Jarreplace为最新版本
- 图像插入错误的Excel表单中?
- 如何知道apache POI阅读excel所有数据使用gwt java