PhpSpreadsheet で画像オブジェクトが全部ぶっ壊れた話

この記事は Aizu Advent Calendar 2021 の3日目の記事です

 

なんとなく存在は知ってはいたけど、アドベントカレンダーっていう文化があるみたいですね

これを書いてる段階では3日目が空白になっていたので埋めてみます

どうも ここ2,3年は PHP の仕事をよくやってます、ねLです

 

さて、IT 業界で切っても切れない有名なアプリケーションがありますよね

MicroSoft 社の緑のアイコンでお馴染み

そう、Excel です

https://4.bp.blogspot.com/-8lhXh19XMiE/WxvJ9HHFBSI/AAAAAAABMls/DS8-5N9VOv4Mj-jfbC_lo5ezTHF8Ic2mgCLcBGAs/s800/file_icon_text_xls.png

 

その Excel の読み書きを PHP でやってしまおう!というライブラリの1つが

タイトルにもある PhpSpreadsheet です。

phpspreadsheet.readthedocs.io

 

前身である PhpExcel という、そのまんまネーミングのライブラリから改修を重ね、

良い感じ使えそうなやつではあるのですが ...

前回の記事 同様、今回も画像関連の罠を踏んだので共有しておきます

 

Excel に画像を貼り付ける」

よく見かける光景です

歴史ある Excel ともなれば、画像の貼り付け方も1つではありません

今回見かけた貼り方の1つが「EMBED 関数」での貼り付けです

ご存知の通り、Excel 関数なので「=EMBED("", "")」みたいに使います

 

が、なんとこの関数

(おそらく)日本語環境の Excel である操作で貼り付けすると

関数に日本語名のエイリアスが適用され「=埋め込み("", "")」と記述されます!

され...る......のか?ともかく、そんな記述で動作している Excel ファイルが存在しました

 

さて、前回の記事を先に読んだ方はお察しの通り、

マルチバイト文字を含んだ関数を処理することにより

PhpSpreadsheet はシート内全ての画像オブジェクトを破壊し、

全ての画像が無かったようになる、という挙動をしました。

驚きの白さ。

 

皆様、PhpSpreadsheet を利用する際は

マルチバイトには気をつけましょう。