コントローラクラスメソッド内でPhpSpreadsheetを使う際の注意点
Slimのコントローラクラスメソッド内で、PhpSpreadsheetを使ってエクセルファイルを生成し、それをダウンロードさせるコードの場合、注意が必要だ。通常、コントローラクラスメソッドでは、ResponseInterfaceオブジェクトをリターンする必要がある。そのつもりで、次のようなコードを書いたとする。
: header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header("Content-Disposition: attachment;filename=\"".$filename."\""); header("Cache-Control: max-age=0"); $writer = IOFactory::createWriter($spreadsheet, "Xlsx"); $writer->save("php://output"); return $response;
これで、ダウンロードされたエクセルファイルを開こうとすると、ファイルが壊れているという警告ダイアログが表示されて、開いたとしても、実際に壊れていることになる。
これを解決するためには、 $writer->save()
の次にスクリプトそのものを終了する必要がある。そこで、次のように、 リターンの代わりにexit;
を記述する。
: header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header("Content-Disposition: attachment;filename=\"".$filename."\""); header("Cache-Control: max-age=0"); $writer = IOFactory::createWriter($spreadsheet, "Xlsx"); $writer->save("php://output"); exit;