2012-02-25 160 views
3

Apache POI 3.8を使用してExcelファイルを生成していますが、既存の行を何回か複製する必要があります。Apache POI式のセルの複製が非常に遅い

これは、セルインデックスを正規表現に置き換える、新しい行を作成するためのテンプレートとして使用する複雑な数式を使用しているためです。

問題はパフォーマンスがひどいことです。約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())があるからです。

さらに、このように挿入された式を持つセルは「replace all - > = = 'with' = '」のようなものでExcelで強制的に再評価する必要があります。

この問題は、HSSFFormulaParser.parse()が原因でsetCellFormula()に依存しているようです。奇妙な何

、時間を解析すると、指数関数的に成長するようだということです、それはそう

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

何たびに、私は式、POIライブラリ再評価または再構文解析または再何かをコピーすることですすべての先行行

どのようにこの問題を解決できるか知っていますか? ありがとうございます。

+1

コードのどこでもFormulaEvaluatorを使用していますか?もしそうなら、もしそれがすべきである終わりの外側ではなく、ループの中にあるとしたらどうですか? – Gagravarr

+0

運がよかったです。私のコードの中のFormulaEvaluatorへの参照はありません。 原因は次のようです newCell.setCellFormula() セルに式をコピーする方法はありますか? –

答えて

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ではありませんでしたか? –

+0

そうです。私の指をライブラリに向けて申し訳ありません。 –