EPPlus を触ってみた

社内で営業の人が「―Excel を操作するパッケージがあるらしくて、それを使えば―」みたいな電話をしていて、「ああ POI っすね。.NET だと NPOI かな。」と思いながら、その日は自分の仕事をこなしていました。

で、気が向いたので軽く触ってみることにしました。

とりあえず、NPOI を触ってみたんですけど作成できるのは xls ファイルだけ。本家の NPOI は org.apache.poi.xssf パッケージで xlsx ファイルが作れるみたいですけど、NPOI は対応していないみたいですね。xlsx ファイルは ExcelPackage とか EPPlus で作成できるみたいです。で、今回は ExcelPackage より開発が盛ん(?)な EPPlus を触ってみることにしました。

EPPlus: http://epplus.codeplex.com/

バイナリと一緒にサンプルコードがダウンロードできるので、それを参考に大体の機能はすぐ作れそうです。

作るものが何も浮かばなかったので、okazuki さんの NPOI のサンプルコード(http://d.hatena.ne.jp/okazuki/20091128/1259405232)を EPPlus で書き直してみました。

using OfficeOpenXml;
using OfficeOpenXml.Style;
using OfficeOpenXml.Style.XmlAccess;
using System;
using System.Drawing;
using System.Linq;
using System.IO;

namespace EPPlusEdu
{
    class Program
    {
        static void Main(string[] args)
        {
            // output.xlsx の FileInfo を作成する。
            FileInfo file = new FileInfo("output.xlsx");
            if (file.Exists)
            {
                file.Delete();
                file = new FileInfo("output.xlsx");
            }
                
            // Excel 2007 XLSX ファイルパッケージを作成。
            using (var package = new ExcelPackage(file))
            {
                // シートを作成
                var sheet = package.Workbook.Worksheets.Add("何とかレポート");

                // ヘッダーにあたる行を作成
                CreateHeaderRow(sheet);

                // とりあえず10行くらいデータ作成
                foreach (var index in Enumerable.Range(1, 10))
                    CreateRow(sheet, index);

                // 2列目と3列目は、そのままだと幅が足りないので広げる
                sheet.Column(2).Width = 12;
                sheet.Column(3).Width = 16;

                // output.xlsxに保存
                package.Save();
            }
        }

        // ヘッダー行を作成する
        private static void CreateHeaderRow(ExcelWorksheet sheet)
        {
            // 1列目はIDの列
            sheet.Cells[1, 1].Value = "ID";

            // 2列目は名前の列
            sheet.Cells[1, 2].Value = "名前";

            // 3列目は誕生日の列
            sheet.Cells[1, 3].Value = "誕生日";

            // ヘッダーセルにスタイルを適用する
            var headerCells = sheet.Cells[1, 1, 1, 3];

            // 4方に罫線
            headerCells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            headerCells.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            headerCells.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            headerCells.Style.Border.Right.Style = ExcelBorderStyle.Thin;
            // 薄いグリーンの背景色で塗りつぶす
            headerCells.Style.Fill.PatternType = ExcelFillStyle.Solid;
            headerCells.Style.Fill.BackgroundColor.SetColor(Color.LightGreen);
            // テキストはセンタリング
            headerCells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            // 太字
            headerCells.Style.Font.Bold = true;
        }

        private static Random r = new Random();

        // index行目のデータを作る
        private static void CreateRow(ExcelWorksheet sheet, int index)
        {
            // id列を作る
            sheet.Cells[index + 1, 1].Value = index;
            // 名前も適当に入れて
            sheet.Cells[index + 1, 2].Value = "田中 太郎" + index;
            // 誕生日も適当に
            sheet.Cells[index + 1, 3].Value = DateTime.Now.AddYears(r.Next(10));
            // 日付用yyyy年mm月dd日のフォーマットで誕生日は表示するようにする
            sheet.Cells[index + 1, 3].Style.Numberformat.Format = "yyyy年mm月dd日";
            
            // 全ての列に4方に罫線のあるスタイルを作って適用する
            var cells = sheet.Cells[index + 1, 1, index + 1, 3];
            cells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            cells.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            cells.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            cells.Style.Border.Right.Style = ExcelBorderStyle.Thin;
        }
    }
}

出来上がったファイルを Excel で開いたのがこれ。

目新しいことは何もないんですけど、とりあえずこれで今後 Excel 出力の話がでても自信を持って答えられるようになったので、個人的には満足かな。