2012-02-25 146 views
3

我使用Apache POI 3.8生成了一個excel文件,並且需要複製某些現有的n°時間行。Apache POI公式單元格重複很慢

這是因爲我有一些複雜的公式,我用它作爲模板來創建新行,用正則表達式替換單元格索引。

問題是性能很糟糕,需要2小時才能生成4000行。

我已經指出問題不在正則表達式部分,正如我最初的想法,但在公式單元格的重複中。如果我複製公式爲文本這樣

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中強制重新評估,例如「用'='替換全部'=''。

由於HSSFFormulaParser.parse(),問題似乎依賴於setCellFormula()。

有什麼奇怪的是,解析時間似乎成倍增長:

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

似乎什麼,就是每次我複製一個公式,POI庫重新評估或重新解析或重新東西所有前面的行。

有誰知道如何解決這個問題? 在此先感謝。

+1

您是否在代碼中的任何位置使用FormulaEvaluator?如果是這樣,它有可能會在循環內部,而不是在它應該在哪裏結束? – Gagravarr 2012-02-25 15:20:21

+0

沒有運氣。我的代碼中沒有提及FormulaEvaluator。 原因似乎是 newCell.setCellFormula() 是否有任何替代方法複製單元格上的公式? – 2012-02-27 08:28:44

回答

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在每次迭代時都會改變一切。

+0

所以問題是你的代碼不是POI? – 2012-02-27 18:27:29

+0

似乎如此。對不起,我把手指指向圖書館。 – 2012-02-27 19:38:56