Symfoware

Symfowareについての考察blog

OpenXMLを使用してExcelファイルをC#のプログラムから出力する

Visual BasicなどからCOM経由でExcelファイルを作成するプログラムがよくあると思います。
C#でもExcelファイルの出力が行えるか調べてみます。



OpenXML



MicrosoftからOpenXMLというライブラリが公開されています。
C#やVB.netからなら、COMを操作するのではなく、直接Excelなどで読み込めるXMLファイルを
出力する感じの仕様みたいです。

これを使用すれば、Office製品がインストールされていない端末でもプログラムが動かせるので
今回はこのライブラリを使用してExcelファイルを出力してみます。





Open XML SDK 2.0 for Microsoft Officeのインストール



こちらから、ライブラリのインストーラーを取得し、インストールを行います。
http://www.microsoft.com/ja-jp/download/details.aspx?id=5124

ダウンロードをクリック。

223_01.png


「OpenXMLSDKv2.msi」を選択して次へをクリックするとダウンロードが実行されます。

223_02.png


ダウンロードしたOpenXMLSDKv2.msiを実行し、インストーラーの指示に従って
インストールを実行します。

223_03.png

223_04.png

223_05.png

223_06.png

223_07.png



インストール先に指定したフォルダに「DocumentFormat.OpenXml.dll」という
ファイルがあると思います。
このdllがあればプログラムのビルドと実行が行えますので、開発するフォルダに
コピーしておきました。








サンプルソース



とりあえず1つのシートを持つExcelファイルを出力するサンプルは以下の通り。
シートは、グリッドを操作しているのではなくXMLのノードを操作しているイメージで
作成するようです。
この概念がよくわからず苦労しました。


  1. using System;
  2. using DocumentFormat.OpenXml;
  3. using DocumentFormat.OpenXml.Packaging;
  4. using DocumentFormat.OpenXml.Spreadsheet;
  5. public class Sample {
  6.     
  7.     public static void Main(string[] args) {
  8.         
  9.         // 新しいxlsxドキュメントを作成
  10.         SpreadsheetDocument document = SpreadsheetDocument.Create("Test.xlsx", SpreadsheetDocumentType.Workbook, true);
  11.         
  12.         // ドキュメントのワークブックパートに、ワークブックを設定
  13.         WorkbookPart wbpart = document.AddWorkbookPart();
  14.         wbpart.Workbook = new Workbook();
  15.         
  16.         // ワークブックパートに、ワークシートパートを設定
  17.         WorksheetPart wspart = wbpart.AddNewPart<WorksheetPart>();
  18.         SheetData sheetData = new SheetData();
  19.         wspart.Worksheet = new Worksheet(sheetData);
  20.         
  21.         // ワークブックにシートを設定
  22.         Sheets sheets = wbpart.Workbook.
  23.                 AppendChild<Sheets>(new Sheets());
  24.         
  25.         // シートを1つ追加
  26.         Sheet sheet = new Sheet() { Id = wbpart.GetIdOfPart(wspart), SheetId = 1, Name = "Sheet1" };
  27.         sheets.Append(sheet);
  28.         
  29.         
  30.         // ここまでがお決まりの処理
  31.         // Sheetではなく、SheetDataにデータを設定していく
  32.         
  33.         // Cell単独では存在できない模様
  34.         // Rowオブジェクトを作成し、そこにCellデータを追加していく。
  35.         Row row = new Row();
  36.         
  37.         Cell cell = new Cell();
  38.         cell.DataType = CellValues.String;
  39.         cell.CellReference = "A1";
  40.         cell.CellValue = new CellValue("A1のセル");
  41.         row.Append(cell);
  42.         
  43.         cell = new Cell();
  44.         cell.DataType = CellValues.String;
  45.         cell.CellReference = "B1";
  46.         cell.CellValue = new CellValue("B1のセル");
  47.         row.Append(cell);
  48.         
  49.         // 行が変わるタイミングで、Rowオブジェクトを再設定
  50.         sheetData.Append(row);
  51.         row = new Row();
  52.         
  53.         cell = new Cell();
  54.         cell.DataType = CellValues.String;
  55.         cell.CellReference = "A2";
  56.         cell.CellValue = new CellValue("A2のセル");
  57.         row.Append(cell);
  58.         
  59.         
  60.         /* こういう書き方でもOK
  61.         row.Append(new Cell() {
  62.                                 DataType = CellValues.String,
  63.                                 CellReference = "A1",
  64.                                 CellValue = new CellValue("Hello world!"),
  65.                             });
  66.         */
  67.         
  68.         // 最後にRowをSheetDataに追加
  69.         sheetData.Append(row);
  70.         
  71.         // ファイルを保存
  72.         document.Close();
  73.     }    
  74. }




ビルドには、DocumentFormat.OpenXml.dllとWindowsBase.dllが必要です。
リファレンスにWindowsBase.dllを追加せずにビルドすると
以下のエラーメッセージが表示されます。


error CS0012: 型 'System.IO.Packaging.Package'
が参照されていないアセンブリで定義されています。アセンブリ 'WindowsBase,
Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
への参照を追加してください。
DocumentFormat.OpenXml.dll: (以前のエラーに関連するシンボルの位置)




ビルドするときに使用したバッチファイルはこんな感じになりました。


@echo off
set csc="C:¥Windows¥Microsoft.NET¥Framework¥v3.5¥csc.exe"
%csc% /nologo /r:DocumentFormat.OpenXml.dll;WindowsBase.dll Sample.cs




実行すると、Test.xlsxというファイルが出力されます。
UbuntuのLibreOfficeで開いてみると、狙い通りのシートが作成されていました。

223_08.png





【参考URL】

Open XML を使った Office データの作成
http://karamemo.hateblo.jp/entry/20111207/1323267391

OpenXML 2.0 SDK Documentation - Class Library Reference
http://msdn.microsoft.com/ja-jp/library/gg278315(v=office.14).aspx

SpreadsheetDocument Class
http://msdn.microsoft.com/ja-jp/library/documentformat.openxml.packaging.spreadsheetdocument.aspx

SheetData Members
http://msdn.microsoft.com/ja-jp/library/documentformat.openxml.spreadsheet.sheetdata_members(v=office.14).aspx

[方法] スプレッドシート ドキュメント内のセルにテキストを挿入する (Open XML SDK)
http://msdn.microsoft.com/ja-jp/library/office/cc861607.aspx
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/10/05(土) 17:30:33|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<OpenXML + C#のプログラムでExcelの行の高さ、列の幅を指定する | ホーム | mage.exeで配布するClickOnceアプリケーションにURLクエリの情報を渡す方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1137-e7cb0ab2
この記事にトラックバックする(FC2ブログユーザー)