コントローラクラスメソッド内で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;