今回はClosedXMLでExcelに画像を挿入します。すでにExcelを起動しているのであれば画像をコピーしてペーストすれば簡単にできます。しかしスクレーピングで大量のデータをあつめた場合、自動で処理をしてしまいたいので、そのときについでに画像も入れたくなることもあるので、そのときの処理を考えます。

まず画像を入れるだけならこんなコードで可能です。

完成♪

とはなりません。写真だけをいれるのであればこれで終わりかもしれませんが、Excelであれば他のデータもあるはずです(むしろこっちが主役)。画像を挿入したあと入力されたデータがあるかもしれないのです。

セルの高さがすべて同じであるなら、画像の高さを調べてセルの高さで割れば画像が占める行が何行なのかわかるはずです。そこでこんなコードを書いてみます。

これだとうまくいきません。

実行結果

上記のコードではセルの高さを調べていますが、ここで取得できる値の単位はピクセルではありません。

高さ:15.00(20ピクセル)と表示されていますが、ws.RowHeightで取得できるのはピクセルである20ではなく15.00です。この値の単位はポイントです。

ではこれならどうでしょうか?

これだと一応うまくいきます。

問題は幅です。

columnWidthに格納される値の単位もピクセルではありません。「標準フォントの半角文字の文字数」です。そのため標準フォントを変更すると同じ幅でも値も変わってしまうのです。

それでも新しくファイルを作成する場合は ws.ColumnWidth * 7 + 5 とすれば単位をピクセルに変換することができます。

一応うまくできたっぽい。