Open XML SDK を使って Excel ファイルを出力

C#Excel ファイルを出力する場合、.xls ファイルだと

という選択肢があった。 Microsoft.Office.InteropExcel のインストールが必要だし、 ExcelCreator は有料だしと、 趣味のアプリとかではちょっと使いづらい。 主に金銭的に。

Office 2007 以降の .xlsx ファイルでいいなら、 Microsoft が提供している Open XML SDK を使って出力できる。 なんと、Open XML SDKオープンソースになっていて、 GitHubソースコードがあるからスバラシイ。

github.com

ただ、Open XML SDKAPI はクセがあるね。 ワークシートに 2 行書き込んだだけのファイルを出力するだけのサンプルを書いてみたけど、 使い方を調べるのに思いのほか時間がかかった。 ドキュメントの構造をかなり意識したコードを書かないといけないっぽいな。

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.IO;

namespace ExcelSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 出力先はデスクトップ
            var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "sample.xlsx");

            // スプレッドシートドキュメントを作成
            var document = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook);

            // WorkbookPart をドキュメントに追加
            var workbookPart = document.AddWorkbookPart();
            workbookPart.Workbook = new Workbook();

            // WorksheetPart を WorkbookPart に追加
            var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new SheetData();
            worksheetPart.Worksheet = new Worksheet(sheetData);
            
            // Sheets をワークブックに追加
            var sheets = workbookPart.Workbook.AppendChild(new Sheets());

            // ワークシートをワークブックに追加
            var sheet = new Sheet()
            {
                Id = workbookPart.GetIdOfPart(worksheetPart),
                SheetId = 1,
                Name = "Sample",
            };
            sheets.Append(sheet);

            // sheetData に行を追加
            var row1 = new Row();
            row1.Append(new Cell()
            {
                DataType = CellValues.String,
                CellValue = new CellValue("A1 のセル"),
            });
            sheetData.Append(row1);

            var row2 = new Row();
            row2.Append(new Cell()
            {
                DataType = CellValues.String,
                CellValue = new CellValue("A2 のセル"),
            });
            sheetData.Append(row2);

            // ワークブックを保存
            worksheetPart.Worksheet.Save();

            // ドキュメントを閉じる
            document.Close();

            Console.WriteLine("Excel ファイルの出力に成功しました。");
        }
    }
}