かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

NPOI入門してみた

C#やVBでExcelを出力するために、POIの.NET版が無いか探してみたら、NPOIというものを見つけたので試してみます!!




まず、CodePlexのNPOIのサイトからバイナリリリースをダウンロードします。ダウンロードしたら、コンソールアプリケーションをNPOIEduという名前で作って、ダウンロードしたDLLを参照に追加します。

とりあえず、超適当なデータを作り上げるコードを書いてみました。

using System;
using System.IO;
using System.Linq;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;

namespace NPOIEdu
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excelのブックを作成
            var book = new HSSFWorkbook();

            // シートを作成
            var sheet = book.CreateSheet("何とかレポート");

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

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

            // 2列目と3列目は、そのままだと幅が足りないので広げる(256で1文字ぶんの幅らしい)
            sheet.SetColumnWidth(1, 256 * 12);
            sheet.SetColumnWidth(2, 256 * 15);

            // output.xlsに保存
            using (var fs = new FileStream("otuput.xls", FileMode.OpenOrCreate, FileAccess.Write))
            {
                book.Write(fs);
            }
        }

        // ヘッダー行を作成する
        private static void CreateHeaderRow(HSSFWorkbook book, HSSFSheet sheet)
        {
            var row = sheet.CreateRow(0);

            // 0列目はIDの列
            var idCell = row.CreateCell(0);
            idCell.SetCellValue("ID");

            // 1列目は名前の列
            var nameCell = row.CreateCell(1);
            nameCell.SetCellValue("名前");

            // 3列目は誕生日の列
            var birthdayCell = row.CreateCell(2);
            birthdayCell.SetCellValue("誕生日");

            // 4方に罫線
            var style = book.CreateCellStyle();
            style.BorderTop = HSSFBorderFormatting.BORDER_THIN;
            style.BorderLeft = HSSFBorderFormatting.BORDER_THIN;
            style.BorderBottom = HSSFBorderFormatting.BORDER_THIN;
            style.BorderRight = HSSFBorderFormatting.BORDER_THIN;

            // 薄いグリーンの背景色で塗りつぶす
            style.FillForegroundColor = HSSFColor.LIGHT_GREEN.index;
            style.FillPattern = HSSFCellStyle.SOLID_FOREGROUND;
            // テキストはセンタリング
            style.Alignment = HSSFCellStyle.ALIGN_CENTER;

            // 太字
            var font = book.CreateFont();
            font.Boldweight = HSSFFont.BOLDWEIGHT_BOLD;
            style.SetFont(font);

            // 全てのヘッダー用のセルに、上で作ったスタイルを適用する
            foreach (var cell in new[] { idCell, nameCell, birthdayCell })
            {
                cell.CellStyle = style;
            }

        }

        private static Random r = new Random();

        // index行目のデータを作る
        private static void CreateRow(HSSFWorkbook book, HSSFSheet sheet, int index)
        {
            // 行を作って
            var row = sheet.CreateRow(index);

            // id列を作る
            var idCell = row.CreateCell(0);
            idCell.SetCellValue(index);

            // 名前も適当に入れて
            var nameCell = row.CreateCell(1);
            nameCell.SetCellValue("田中 太郎" + index);

            // 誕生日も適当に
            var birthdayCell = row.CreateCell(2);
            birthdayCell.SetCellValue(DateTime.Now.AddYears(r.Next(10)));

            // 全ての列に4方に罫線のあるスタイルを作って適用する
            // あえて別々のスタイルを設定してるのは、誕生日セルにフォーマットを入れるため
            foreach (var cell in new[] { idCell, nameCell, birthdayCell })
            {
                var style = book.CreateCellStyle();
                style.BorderTop = HSSFBorderFormatting.BORDER_THIN;
                style.BorderRight = HSSFBorderFormatting.BORDER_THIN;
                style.BorderLeft = HSSFBorderFormatting.BORDER_THIN;
                style.BorderBottom = HSSFBorderFormatting.BORDER_THIN;

                cell.CellStyle = style;
            }
            // 日付用yyyy年mm月dd日のフォーマットで誕生日は表示するようにする
            var format = book.CreateDataFormat();
            birthdayCell.CellStyle.DataFormat = format.GetFormat("yyyy年mm月dd日");
        }
    }
}

JavaのPOIとほとんど同じ使い方でいけます。たまに、set〜とかget〜という名前のメソッドのものが、NPOIだとプロパティになっていたりするので、そこだけ気をつけてればOKだと思います。上記のコードで、こんなExcelファイルが作られます。

このコードを実行したマシンはExcel入ってないので、Excel入ってないマシンでもExcelファイルを作れます。

今回参考にさせていただいたサイトは、以下のサイトです。(JavaのPOIと同じ要領で使えるので参考情報もJavaのが主になると思います)