PHPSpreadsheetで画像を挿入したらExcelファイルが破損したケース

タイトルの通り。

 

PHPSpreadsheet で 

PhpOffice\PhpSpreadsheet\Worksheet\Drawing

を利用して画像を挿入するプログラムを実装

なんとなく test.jpg みたいなのは上手くいったのに、

運用していくとダメなケースが...

 

ググっても同様のケースは出てこなかったので、記録として残す。

  1. 画像のファイル名がマルチバイト(日本語)だった
    1. Excel UI でやるときはよしなにしてくれるから気にしなかったけど、Drawing で指定する場合は半角英数じゃないとダメみたい。リネームして対応。
  2. setWidth, setHeight の指定が小数だった
    1. px 幅指定で枠に収めるようとしてたけど、計算結果をそのまま入れてたせい。px に小数点はダメですね。四捨五入して対応。

上記、なんとなくダメそうなのは分かるけど、

残念ながらエラーにならず、破損メッセージ見るだけでは詳細が分からなくてハマりました。

 

画像貼り付ける仕組みはこんな感じ

        $draw = new Drawing();
        $draw->setName('hoge');
        $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); // 比率を自分で求めたのでこの設定は不要かも。
        $draw->setWorksheet($シート); // どのExcelシートに画像を出力するか

Drawing クラスを new して setWorksheet するっていう、少し分かりにくい書き方で動作するようです

誰かの役に立てば。