PHPSpreadsheetで画像を挿入したらExcelファイルが破損したケース
タイトルの通り。
PHPSpreadsheet で
PhpOffice\PhpSpreadsheet\Worksheet\Drawing
を利用して画像を挿入するプログラムを実装
なんとなく test.jpg みたいなのは上手くいったのに、
運用していくとダメなケースが...
ググっても同様のケースは出てこなかったので、記録として残す。
- 画像のファイル名がマルチバイト(日本語)だった
- Excel UI でやるときはよしなにしてくれるから気にしなかったけど、Drawing で指定する場合は半角英数じゃないとダメみたい。リネームして対応。
- setWidth, setHeight の指定が小数だった
- px 幅指定で枠に収めるようとしてたけど、計算結果をそのまま入れてたせい。px に小数点はダメですね。四捨五入して対応。
上記、なんとなくダメそうなのは分かるけど、
残念ながらエラーにならず、破損メッセージ見るだけでは詳細が分からなくてハマりました。
画像貼り付ける仕組みはこんな感じ
$draw = new Drawing();
$draw->setDescription('Paid');
$draw->setPath($path); // 画像のパス
$draw->setCoordinates($セル); // ここで指定したセル番地が画像の一番左上になる
$draw->setOffsetX(0);
$draw->setRotation(0); // 回転させる場合のオプション
$draw->getShadow()->setVisible(false); // ドロップシャドウ
// $draw->getShadow()->setDirection(45);
$draw->setWidth($width); // 画像の幅を何pxで出力するか
$draw->setHeight($height); // 画像の高さを何pxで出力するか
$draw->setResizeProportional(false); // 比率を自分で求めたのでこの設定は不要かも。
Drawing クラスを new して setWorksheet するっていう、少し分かりにくい書き方で動作するようです
誰かの役に立てば。