[PHP]PHPExcel が遅い
カテゴリ:IT関連
PHPExcel の処理が恐ろしく遅かったのでそれをいかにして改善したかのメモ。1,000行程度の表を作成するのに80秒もかかっていたのでそれはないだろうと調査。ググったりデバッグしたりするとどうも insertNewRowBefore() や getStyle() あたりがネックになっているらしい。
データを取ってきて foreach で繰り返して各レコード毎に行を追加してスタイリングして値をセットするという処理になっていた。ざっくりこんな感じ。
セルの書式をテンプレートからコピーするのに行の挿入を行い、一部表示形式がうまく反映しなかったので定義し直すという目的。繰り返し処理の中で実行してたのでなんとか外に出せないかと思って修正したのがこんな感じ。
なんと80秒かかっていたのが5秒で実行できるようになった。上記のサンプルコードで1,000行程度を実行すると改善前が5.96秒、改善後が0.38秒。15倍くらい速い。PHPExcel 使うときは気を付けないと。
データを取ってきて foreach で繰り返して各レコード毎に行を追加してスタイリングして値をセットするという処理になっていた。ざっくりこんな感じ。
$row = 3;
foreach ($data as $key => $value) {
$sheet->insertNewRowBefore($row, 1);
$sheet->getStyle("A{$row}")->getNumberFormat()->setFormatCode('"\"#,##0');
$sheet->setCellValue("A{$row}", $value);
$row++;
}
セルの書式をテンプレートからコピーするのに行の挿入を行い、一部表示形式がうまく反映しなかったので定義し直すという目的。繰り返し処理の中で実行してたのでなんとか外に出せないかと思って修正したのがこんな感じ。
$row = 3;
$row_start = $row;
$row_end = $row_start + count($data);
$sheet->insertNewRowBefore($row_start, count($data));
$sheet->getStyle("A{$row_start}:A{$row_end}")->getNumberFormat()->setFormatCode('"\"#,##0');
foreach ($data as $key => $value) {
$sheet->setCellValue("A{$row}", $value);
$row++;
}
なんと80秒かかっていたのが5秒で実行できるようになった。上記のサンプルコードで1,000行程度を実行すると改善前が5.96秒、改善後が0.38秒。15倍くらい速い。PHPExcel 使うときは気を付けないと。