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 を利用する際は

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

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 するっていう、少し分かりにくい書き方で動作するようです

誰かの役に立てば。

ダマスカスナイフ作りを体験してきました

岐阜県関市のクラウドファウンディングで、
ナイフ職人に1日弟子入りして、
ダマスカスのペーパーナイフ製作体験をして来ました
https://www.makuake.com/project/kojosankanbi/

具体的にやったことは、準備された予め大まかにナイフ型になった
ダマスカスの金属棒を加工し、ペーパーナイフとして完成させていきます

工程は大きく以下の通り

回転する荒いヤスリで削る
回転する細かいヤスリで整える
高温の釜で焼き入れ、焼き戻しをする
回転する細かいヤスリで表面を磨く
塩化鉄溶液で模様を浮き上がらせる
回転するヤスリで刃をつける

作業のほとんどは回転するヤスリがけ、他には釜の燃料になる炭をナタで叩き割ったり、ちょっとした作業。
座学のような時間はほぼなく、
見よう見まねでトライ&エラーをしながら加工し、
調整や仕上げではプロの技で助けてもらいながらなんとか完成させました。

実は今回の体験会が第1回目の試行で、段取りも柔軟でした
(持ち手をつける工程は参加者の希望によりスキップされたり)

指導して下さった方も指導は不慣れでしたが、
職人に弟子入りという雰囲気でもあり、とても楽しい体験でした

今後またチャンスがあるかもしれないので、
気になった方は是非チェックしてみてください!

iMovieから直接Youtubeに共有するとき、パスワードエラーが発生する

久しぶりにクロスフェードを作ってYoutubeにアップしようとしたら、
パスワードエラーが出た。
Youtubeに直接ログインできるからパスワードは合ってるし、
二段階認証もオフにしてるからそこも問題ない。

で、調べた結果これが問題だった


Youtube側の設定で「安全性の低いアプリのアクセス」を有効にしたらうまくいった。
iMovieのバージョンが古すぎるのかとも疑ったけどそうじゃなかった。

CentOS7.0ネットワーク設定

CentOS7系から、ネットワーク設定コマンドが nmtui に変更になりました。
さらに、CentOS7.0と7.1以降でネットワーク設定方法が異なるようです。

ここではCentOS7.0へSSH接続できるようにする目的で、
CUIでの設定方法をメモ。

1.デバイス名の確認
# nmcli d

2.デバイスの設定を確認
# nmcli connection show [デバイス名] | grep ipv4
ipv4.method が auto だと DHCPになっている

3.デバイス設定
# nmcli c modify [デバイス名] connection.autoconnect "yes"
# nmcli c modify [デバイス名] ipv4.addresses "[IPアドレス] [ゲートウェイ]"
←IP ゲートウェイ間は半角スペースを空ける
# nmcli c modify [デバイス名] ipv4.method "manual"

4.ネットワーク再起動
# systemctl restart network.service


以上でSSHでアクセスできるようになった。


●参考
CentOS 7 で ネットワーク(IPアドレス、ホスト名、ドメイン名など)の設定を行う
http://server-setting.info/centos/network-config-c7.html

CentOS 7.1.1503ではnmcliでIPアドレスを固定する方法が変更された
http://qiita.com/yunano/items/88a6e46b412d3be1d3ec

C89 戦利品レビュー

冬コミで久しぶりに会ったAdanさんのサークル「Acute Strings」の
旧譜New Seed is Risingと、
新譜Marks in daydreamを頂いていたので
たまには戦利品レビューをば

http://adanch.blogspot.jp/2015/12/blog-post.html

New Seed is Rising

1st Sigle(多分Single)と書いてあるけど、型番的には3枚目?
オリジナル曲のCDとしては1枚目ってことだと推測

曲は一言でまとめると、繰り返しの美学
ループフレーズのイメージが強く展開があまりないので、
後半はちょっと飽き気味になる、かな。BGMとしてはいいかも。
ギターをはじめ、全体の音作りとミックス具合は心地よい。

Marks in daydream

前作と比べ曲全体のメリハリがはっきりしていて、
ループを聞かせつつも上手く予想を裏切ってくれる。

音作り全般はこちらも良いけれど、静かなフレーズだと
エレキギターのミスピッキング?みたいなノイズが
結構聞こえて、もったいないなーと思った。

変拍子フレーズのぶち込み方に若気の至りを感じる。
こういう勢いは大事、トテモダイジ。

...と、自分のことは棚にあげてレビューしてみました
今後の伸びしろに期待

C89 冬コミお疲れ様でした

ども、ねLです

冬コミお疲れ様でした!
今回、初めて自分でジャケットイラスト・デザインまでやりました。

イラスト描くのが久しぶり&曲作りと並行で作業するのとで大変でしたが、
なんとか形になってよかったです。

曲の方もいつもより反応が良いようで、ありがたい限りです。
在庫が無くあまり頒布できないと思うので、簡単なPVとか作って公開できたらと思います。

本年もどうぞよろしくお願い致します。