1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHPSpreadSheetで1万行強書こうとして死んだ話となんとかした話

Last updated at Posted at 2020-08-23

記憶を頼りに。
帳票出力で1万行を超えるExcelをPHPSpreadSheetで書こうとした。
プロジェクトにはすでにPHPSpreadSheetのヘルパーライブラリがあってそれ使えみたいな空気感。
で、パフォーマンスが悪くて死んだ。
2000行超えたあたりから1行書くのに3秒とかかかる様になって詰んでた。

パフォーマンス問題

問題は記憶が確かならこの関数

$spreadsheet->getActiveSheet()->insertNewRowBefore(7, 2);

insertNewRowBefore。この関数、前の行の様式や書式を引き継いでしてくれるので楽なんですけどパフォーマンスで死ぬ。
PHPSpreadSheet、全体的にパフォーマンス問題抱えているようでGithubとかも死屍累々、Stackoverflowでは別のライブラリ使えって言われるので全体的に負け戦。でもなんとかしなきゃいけない

対応方法

ともかくからのExcelに行番号を保持してインクリメントしながら書き倒して、様式書式全部設定していけば速度もメモリも許容範囲に収まった。
楽な道はパフォーマンスが悪い、という典型でした。

ダメだった対応

  • 適当な大きさのExcelを用意してそこに書く

5万行とかのExcelテンプレート用意したらメモリ使用量が1GBとかいってダメだった。

結果

所要時間

360分(予測)→ 12分
まぁまぁ、劇的な結果。
1時間たっても1/6しか進んでなくてプロセス殺したので死んでたときの経過時間は予測。
実際はどんどん一行書くのに時間がかかっていくようになっていたので360分では終わらなかったと思う。

以上です。

1
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?