【PHPOffice/PhpSpreadsheet】でサイズが大きいエクセルファイルを読み込むとメモリーエラーになっていまう場合の対処法
こんにちは。
ニシザワです。
今まで、エクセルで管理していたデータをシステム化する場合にデータ移行にPHPOffice/PhpSpreadsheetを使っている方は多いのではないでしょうか。
複数のエクセルファイルを読み込ませたりすると、下記のようにエラーが出てしまいます。
ですので、必要なくなった読み込みデータも保持してしまい、上記エラーが吐き出されてしまう場合もあります。
今回はこちらの対処法をご説明します。
下記のコードがあるとしましょう。
ですので、
これで、メモリ節約になりますね。
ちなみにシートが複数ある場合は、sheetの開放も可能です。
メモリ不足でエラーに出会ってしまった場合は一度試してみてください。
ニシザワです。
今まで、エクセルで管理していたデータをシステム化する場合にデータ移行にPHPOffice/PhpSpreadsheetを使っている方は多いのではないでしょうか。
複数のエクセルファイルを読み込ませたりすると、下記のようにエラーが出てしまいます。
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 147456 bytes) in /vagrant/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php on line 400
メモリを増やしてあげるのも一つの手ですが、PhpSpreadsheetは高速に処理ができるように実はデータをキャッシュさせて保持する機能があります。ですので、必要なくなった読み込みデータも保持してしまい、上記エラーが吐き出されてしまう場合もあります。
今回はこちらの対処法をご説明します。
下記のコードがあるとしましょう。
$file = "./hoge.xlsx";
$reader = IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load($file);
$sheet = $spreadsheet->getActiveSheet();
$attributes = $sheet->rangeToArray('A1:AA100');
foreach($attributes as $attribute){
//何かしらの処理
}
$spreadsheet->disconnectWorksheets();
上記のコードはhoge.xlsxをただ読み込ませて処理をするコードですが、これを複数ファイル読み込ませて同じ処理をしようとすると上記のエラーになってしまいます。ですので、
$spreadsheet->disconnectWorksheets();
をいれて上げることで、読み込んだデータのキャッシュを一度リセットしてくれます。これで、メモリ節約になりますね。
ちなみにシートが複数ある場合は、sheetの開放も可能です。
$sheet->disconnectCells();
シートを取得して、そのシートの処理が終われば解放後、また次のシートへ移るという流れです。メモリ不足でエラーに出会ってしまった場合は一度試してみてください。