Hatena::ブログ(Diary)

regerege メモ帳

カウンター

2010-07-31

Open XML Excel の出力

| 11:42

新規に Open XMLスプレッドシートを出力するプログラム

Excelに比べると非常に面倒です。

いちいち行や列のインスタンスを作るのが面倒・・・・

 Cell は DataType を設定すると同時に、子要素に InlineString のインスタンスを追加して、またその子要素に DataType で指定した型に合うインスタンスを追加する必要があるみたいです。

使用ライブラリ:
 Open XML SDK 2.0

参照設定:
 DocumentFormat.OpenXml
 WindowsBase

※ DocumentFormat.OpenXml は
  C:\Program Files (x86)\Open XML SDK\V2.0\lib
  にあります。

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var doc = SpreadsheetDocument.Create("test.xlsx", SpreadsheetDocumentType.Workbook))
            {
                // WorkBookPart
                var workBookPart = doc.AddWorkbookPart();
                workBookPart.Workbook = new Workbook();

                // WorkSheetPart
                var workSheetPart = workBookPart.AddNewPart<WorksheetPart>();

                ////////////////////////////////////////////////////////////////////////////////////////
                // WorkSheet データ、テーブル構造、Cellの位置 など
                ////////////////////////////////////////////////////////////////////////////////////////

                // WorkSheetの作成
                var workSheet = new Worksheet();
                // SheetDataの作成
                var sheetData = new SheetData();
                // Defualt Cell
                var textCell = new Cell() { DataType = CellValues.InlineString };

                // 書き込むテキストデータの作成
                var texts = new Text[] {
                    new Text("C1"),
                    new Text("A2"),
                    new Text("B3"),
                };

                // テキストデータのセル
                var dataCells = new Cell[] { (Cell)textCell.Clone(), (Cell)textCell.Clone(), (Cell)textCell.Clone() };
                for (var i = 0; i < dataCells.Length; i++)
                {
                    dataCells[i].AppendChild<InlineString>(new InlineString(texts[i]));
                }

                // 行と列を作成して、テキストデータを内包させる。
                var rows = new Row[] {
                    new Row(new Cell(), new Cell(), dataCells[0])
                    , new Row(dataCells[1], new Cell(), new Cell())
                    , new Row(new Cell(), dataCells[2], new Cell())
                };

                // 追加
                foreach (var row in rows)
                {
                    sheetData.AppendChild<Row>(row);
                }
                workSheet.AppendChild<SheetData>(sheetData);
                workSheetPart.Worksheet = workSheet;

                // Sheets
                var sheets = doc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

                // Sheetの作成
                var sheet = new Sheet()
                {
                    Id = doc.WorkbookPart.GetIdOfPart(workSheetPart),
                    SheetId = 1,
                    Name = "SheetName1"
                };

                // Sheetの追加
                sheets.Append(sheet);

                ////////////////////////////////////////////////////////////////////////////////////////

                // Workbookの保存
                workBookPart.Workbook.Save();

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

            try
            {
                var process = Process.Start("test.xlsx");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            Console.WriteLine("終了します。");
            Console.ReadLine();
        }
    }
}
トラックバック - http://d.hatena.ne.jp/regerege/20100731/1280544126
Connection: close