2

xdebug を使用して Excel 生成コードをプロファイリングし、グラインド ファイルを確認しました。どうやら私の実行時間の大部分は次のことに費やされています。

setFormatCode(...)

ここに画像の説明を入力

問題のコードは次のとおりです。

protected function formatRow($line)
{
    // /*
    foreach ($this->getIntegerColumns() as $column) {
        $style = $this->worksheet->getStyle($column . $line);
        $style->getNumberFormat()->setFormatCode('#,##0');
    }
    foreach ($this->getFloatColumns() as $column) {
        $style = $this->worksheet->getStyle($column . $line);
        $style->getNumberFormat()->setFormatCode('#,##0.00');
    }
    foreach ($this->getPercentageColumns() as $column) {
        $style = $this->worksheet->getStyle($column . $line);
        $style->getNumberFormat()->setFormatCode('0.00%');
    }
    foreach ($this->getDateColumns() as $column) {
        $style = $this->worksheet->getStyle($column . $line);
        $style->getNumberFormat()->setFormatCode('mm/dd/yyyy');
    }
    // */
    return $this;
}

私のレポートは通常次のようになります。

getSummaryData: Elapsed time: 4
getInteractionData: Elapsed time: 10
getVideoData: Elapsed time: 2
new CampaignDetailReport: Elapsed time: 0
new CampaignDetailReportWriter: Elapsed time: 0
new write(): Elapsed time: 125

~ 140 seconds

しかし、formatRow() 関数の内容をコメント アウトすると、次のようになります。

getSummaryData: Elapsed time: 4
getInteractionData: Elapsed time: 9
getVideoData: Elapsed time: 2
new CampaignDetailReport: Elapsed time: 0
new CampaignDetailReportWriter: Elapsed time: 0
new write(): Elapsed time: 32

~ 50 seconds

これはまだ長いですが、大幅な改善 (ほぼ 50% 高速化) です。

ここで答えを確認しました: PHPExcel が非常に遅い - 改善する方法はありますか? 、しかし、修正を実装する方法がわかりません。理想的には、セルごとではなく、列全体にスタイルを適用することが 1 つの解決策になると思います。列が「コスト」のようなものである場合、すべての列の値が浮動小数点数になることがわかっているので、すべてのセルに数値形式を適用してもおそらく安全です。実際にそれを行う方法を確認してください。

アップデート:

Mark Ba​​kers の回答に応えて、次のことを行いました。

foreach($this->getIntegerColumns() as $column) {
        $this->worksheet->getStyle(sprintf("%s%s:%s%s", $column, 5, $column, $this->line))
             ->getNumberFormat()
             ->setFormatCode('#,##0');
    }

列内のすべてのセルの整数型のすべての列をスタイルします。すべてのレポート メトリックは 5 から始まり、内部カウンターである this-> 行に移動します。これは今のところうまくいっています。1 つのシートを完全にスタイルするのにさらに約 4 秒かかりました (レポートには 3 つのシートがあります)。したがって、そのレートでは、すべてのシートのスタイルを設定でき、追加の実行時間は最大 12 秒で、最大 65 対 125 になります !!!

4

1 に答える 1

4

流暢なインターフェースを活用してください。

可能であれば、フォーマットをセルの範囲に適用します。

$this->worksheet->getStyle('A1:A21')
    ->getNumberFormat()
    ->setFormatCode('0.00%');

複数のスタイル設定を 1 つのセル (またはセル範囲) に一度に適用する場合は、スタイルの applyFromArray() を使用します。

これらのテクニックはすべて、速度の向上に役立ちます。

于 2013-03-07T21:05:20.010 に答える