質問: \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, "Xlsx"); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment; filename="file.xlsx"'); // ダウンロードファイル名 $writer->save("php://output"); // PHPのoutputストリーム } ``` ### 試したこと * 出力ファイルを「xls」にすると、破損しませんでした。 * テンプレートの読込み方がいけないのか、出力ファイルの形式指定が足りないのか。。 * 画像ファイルは、普通にExcelで挿入、保存した場合は破損になりません。=画像は悪くない。 ### 補足情報(FW/ツールのバージョンなど) Windows7 Laravel5.7 Laravel Excel 3.1 phpspreadsheet 1.6 Excel Office365 もし何か、ご助言いただければありがたいです(。。
回答: 以前仕事で、同じ症状に、頭を悩ませたことがあります。 その時は、色々と試みた経緯で、たまたま上手く行く方法が見つかったため(VBAマクロ付きのExcelだったので、それらも利用して解決した)、 時間もなかったこともあり、詳しい調査はさておいたまま、とりあえず解決としてしまったのですが、 同じような現象に困っているのこの質問を見つけ、そういえば私も結局原因とか分かってないな・・と思い、 改めて、色々と試してみました。 私の検証した限りの話になりますが、どうやら、きっかけはExcelのシートそのものにあるようで。。。 ■「新規シート追加 → シート内を編集 → 保存(1回目)」 ここまでの状態のシートであれば、画像貼り付けで、破損エラーが表示されないのですが、 ■「保存(1回目) → シート内を編集 → 保存(2回目以降)」 これだと、破損エラーが表示されるようです。 シート内の編集は、こういう変更すべてです。 ・セルへの文字追加・削除 ・セルの書式設定 ・ページ設定 ・印刷範囲 これらを、一度保存済みのシートに対して変更→保存し、そのシートに画像を貼りつけると、破損エラー表示に繋がるようです。 もしかすると、シートがこっそり持っている「編集履歴のような情報」が、SpreadSheetから貼り付けた画像に、なんらかの影響を及ぼして、破損メッセージに繋がっているのかもしれません。 「xlsで保存する破損エラーが表示されない」のは、この「編集履歴のような情報」が破棄されるからかも・・・(xlsxとxlsでは、シートの列・行の上限が大きく異なるので、xlsでは持っていられない情報になり得るため、こういった情報が破棄されること自体は不思議ではないと思います) ということで、PhpSpreadsheet側の問題だとは思いますが、だからといって「破損メッセージがでるのは仕方ないです」とは言えないのが現実なので。 手間だとは思いますが、テンプレートファイルの「シート」を、まるっと新しく作り直してみて下さい。 それで、この現象自体は解決するはず、です(多分 ^^;) 作り直しは、新規シート追加で元のシートを全コピペするような方法でお試しください。(シートの複製ではダメ) また、新規シートは調整が完全に終了するまで、絶対に保存しないよう気を付けてくださいね・・!