2012年6月20日水曜日

Open XMLでExcelを生成する

@ryuichi111std氏からのお仕事紹介でサーバサイドでのExcel出力機能を承り、Excel周りの作業の調査をしたら時代の移り変わりを実感したので解説。

一昔前のExcelのオートメーションと言えば、ExcelのオブジェクトをCOM InteropやらCOM Callable WrapperやらでごにょごにょしてぐりぐりしてどこやらでCellオブジェクトの解放忘れやらシートとブックの解放の順番間違いやらをしてしまいメモリリークという悲劇を生む精根尽き果てる作業というのが筋だったけれど、今やそれも昔。今やOpenXMLという規格があるのでそれに準じた形のXMLを吐き出すことで、あらまOffice 2007/2010対応のファイルができちゃった、という寸法になっている。

で、OpenXMLの初期の初期のころはそんなXMLのフォーマットをごりごりと手動で実装するというキチガイ沙汰の作業が横行していたようだけれど、そんな時代が長く続くはずもなくOpenXMLのフォーマット形式で出力してくれるSDKが登場した。それが下記。

Open XML SDK 2.0 for Microsoft Office
OpenXMLSDKv2.msiの方をインストールしてね。ToolのほうはExcelファイルを渡すとそのファイルを作成するためのコードを生成してくれるというツールなので興味がある人はどうぞ。

で、OpenXMLSDK、実はこいつもかなり使いづらい。かなりどころか、ディモールト(非常に)使いづらい。使いづらいどころかまったくこなれておらず、かなり分かりづらい仕様となっているOpenXMLを単純にそのままラップしたような構成になっているので、とっても廻りくどいしバグが入り込みやすい。

一体OpenXMLSDKを使っての開発がどういうものになるのか、下記のコードを参照してもらうのが一番手っ取り早いと思う。
Using C# and Open XML SDK 2.0 for Microsoft Office to Create an Excel 2007 Document
Creating basic Excel workbook with Open XML

で、めんどくせーなー、と思いつつ実装していたら、di molto(非常に)使いやすいライブラリを発見したのでご紹介。それが下記。

ClosedXML - The easy way to OpenXML

ClosedXMLはOpenXMLSDKをラップして使いやすくしたライブラリで非常に直観的。下記のコードはワークブックを作成してシートを追加してA1セルに値を設定して名前を付けて保存している。下記と同等のコードをOpenXMLSDKだけで行おうとすると50行~100行ほどの実装が必要になる。

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");

ほかにもほとんどのパターンに対応するサンプルコードが豊富にあるので詳細はDOCUMENTATIONを参照してもらいたい。

このプロジェクトが気に入ったらブログで紹介してね、とClosedXMLのサイトにあったのでご紹介。このエントリーをご覧になられた方もどうぞよろしく。