概要
C# + ClosedXML で、画像を読み込み Excel のセル背景を塗ります。
ClosedXML は、Microsoft Open XML Format SDK を Excel 向けに使いやすくしたライブラリで、NuGet からインストールできます。
この画像を読み込みます。
大阪の会社ということで勝手に たこ焼きを推しています。元データは、ぱくたそ のたこ焼き画像です。
コード
using ClosedXML.Excel; using System.Drawing; namespace ClosedXmlSample { class Program { static void Main(string[] args) { var bmp = new Bitmap(@"takoyaki.jpg"); // 画像読み込み var wb = new XLWorkbook(); // ワークブック作成 var ws = wb.Worksheets.Add("たこ焼き"); // ワークシート作成 for (int y = 0; y < bmp.Height; y++) { for (int x = 0; x < bmp.Width; x++) { var c = bmp.GetPixel(x, y); ws.Cell(y + 1, x + 1).Style.Fill.SetBackgroundColor(XLColor.FromColor(c)); // セル背景指定 } } ws.Columns(1, bmp.Width).Width = 0.01; // 列幅指定 ws.Rows(1, bmp.Height).Height = 3.75; // 行高さ指定 wb.SaveAs("takoyaki.xlsx"); // Excel ファイル保存 } } }
ClosedXML を使うと、セル等の値をプロパティとして設定する方法と、メソッドとして設定する方法が用意されています。後者は、メソッドチェーンとしてつなげられるので、フォントサイズ・色、罫線などいろいろ設定が必要なときも、少し簡潔に書けます。
列の幅だけ、なぜか設定した値になりません。
結果
SaveAs メソッド部分で数分レベルで時間がかかります。最初 256x256 ピクセルデータにしたところ数十分レベルで時間を要してさらに Excel ファイルが壊れている結果となってしまいました。SetBackgroundColor メソッドの行がなければ一瞬で処理が終わるため、たくさんセル背景を指定するとダメっぽいです。意外なところで ClosedXML の弱点が……。