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 出力の話がでても自信を持って答えられるようになったので、個人的には満足かな。