アラキタウン

黒歴史や生き恥を切り売り

PhpSpreadSheetで出力エクセルが壊れている時はdieで終了させると壊れない。

以下のような形で、PhpSpreadSheetでテンプレートを読み込み、出力としていたのですが、

 

$file = 'テンプレート.xlsx';
$obj = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$book = $obj->load($file);

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filenm .'.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($book, 'Xlsx');
$objWriter->save('php://output');

 

ダウンロードされたエクセルを開くと、以下のメッセージがでるようになってしまいました。

 

xlsxの一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい]をクリックしてください。

f:id:alakialaca:20210706184513p:plain

のエラーメッセージが。

 


対処法は以下のstack overflowに書かれており、保存後すぐにdie;を入れると壊れなくなります。

 

 

$objWriter->save('php://output');
die;

 
最初に英語でまで調べなかったせいで、dieで解決できることに気づきませんでした。
英語力大事・・・
 
日本語でエラーを調べても、以下のような記事しか見当たらず、テンプレートを2回保存しないように修正して対応した。

早く気づいていれば。
 
というかPhpSpreadSheetさん。早く直して・・・