ディーバ Blog

大阪発 C#の会社、株式会社ディーバの Blog です。

Excel でたこ焼きを描く with C# + ClosedXML

概要

C# + ClosedXML で、画像を読み込み Excel のセル背景を塗ります。

ClosedXML は、Microsoft Open XML Format SDK を Excel 向けに使いやすくしたライブラリで、NuGet からインストールできます。

この画像を読み込みます。

f:id:jz5_diva:20160530014710j:plain

大阪の会社ということで勝手に たこ焼きを推しています。元データは、ぱくたそ のたこ焼き画像です。

コード

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 を使うと、セル等の値をプロパティとして設定する方法と、メソッドとして設定する方法が用意されています。後者は、メソッドチェーンとしてつなげられるので、フォントサイズ・色、罫線などいろいろ設定が必要なときも、少し簡潔に書けます。

列の幅だけ、なぜか設定した値になりません。

結果

f:id:jz5_diva:20160530014725p:plain

SaveAs メソッド部分で数分レベルで時間がかかります。最初 256x256 ピクセルデータにしたところ数十分レベルで時間を要してさらに Excel ファイルが壊れている結果となってしまいました。SetBackgroundColor メソッドの行がなければ一瞬で処理が終わるため、たくさんセル背景を指定するとダメっぽいです。意外なところで ClosedXML の弱点が……。

参考

qiita.com