前提・実現したいこと
- Laravel で xlsxファイルを出力します。
- 処理内で、xlsx内に画像ファイル(png)を貼り付けして出力。
- そのxlsxファイルを開くと、破損メッセージが表示されます。(問題点)
- 「はい」をクリックすると、ファイルは画像含めて、正しく表示されます。
★破損メッセージを出ないようにしたいです。★
発生している問題・エラーメッセージ
xlsxの一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい]をクリックしてください。
該当のソースコード
use Maatwebsite\Excel\Facades\Excel; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Reader\Xlsx as ReaderXlsx; use PhpOffice\PhpSpreadsheet\Writer\Xlsx as WriterXlsx; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; public function excel() { // テンプレートファイル定義 $excel_file = storage_path('excel/template.xlsx'); // テンプレートファイル取得 $reader = new ReaderXlsx(); $spreadsheet = $reader->load($excel_file); // アクティブシートの取得 $sheet = $spreadsheet->getActiveSheet(); // 画像設定 $imagePath = 'name.png'; (new Drawing()) ->setPath($imagePath) ->setWorksheet($sheet) ->setResizeProportional(false) ->setCoordinates(Coordinate::stringFromColumnIndex(4) . 1); //セルD1に設定 // ダウンロード // Xlsxにした場合、画像をPHPで設定したファイルを開くと、破損する // Xlsにした場合、画像をPHPで設定したファイルを開くと、破損しない $writer = \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
もし何か、ご助言いただければありがたいです(。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/28 08:03 編集
2020/01/27 10:48