BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース OpenXML を簡単にする ClosedXML

OpenXML を簡単にする ClosedXML

原文(投稿日:2011/07/20)へのリンク

Excel ドキュメントをプログラムで処理する場合,XML そのものを直接操作するか,あるいは Office Automation ライブラリを利用するのが一般的な方法だ。 しかし多くの人が知っているとおり,Office Automation ライブラリはサーバでの使用には適さないし,XML の処理はかなり面倒なものだ。ClosedXML は 利用が簡単な Office タイプの API を提供することにより,COM のオーバーヘッドを伴わずにそのギャップを埋める。

このライブラリを紹介するため,ClosedXML プロジェクトの Manuel De Leon 氏に話を聞いた。

1. 最初に ClosedXML ライブラリを開発しようと考えた理由は何ですか?

このプロジェクトは私がニューヨークの投資銀行で働いていたとき,サイドプロジェクトとして始めたものです。私たちは Excel によるレポート機能を .NET に移動する方法をあれこれ考えていました。いくつかライブラリ (フリーのものや有償のもの) を試したのですが,どれもあまりよいとは思えませんでした。それらは OpenXML 仕様に従って設計されているようでしたが,私は Excel を中心に設計されたものがどのように動作するのか,ということを知りたかったのです (Excel のファイルが OpenXML として保存されているということは,二次的なものでした)。

解決を急がされてはいませんでしたので,私のコードスタイルにより密接にマッチしたものを自分で作ることにしました。その後しばらくして私は,コロラド州に移動しなければならなくなりました。そこで上司に対して,このプロジェクトに興味があるので開発をオープンソースとして継続したい,と申し出たのです。こうして私は,それまでは仕事上の理由で必要だったものに代えて,自分が使いたいライブラリを開発するという自由を得たのです。それまでやっていたものは廃棄して,新しい API である ClosedXML を改めてスクラッチから作り始めました。

2. Microsoft の OpenXML ライブラリを使った開発では,何か特別な問題があるのでしょうか?

Microsoft の OpenXML SDK と OpenXML ドキュメントの関係は,ちょうどアセンブリ言語とプロセッサの関係のようなものです。それを使って仕事をやり遂げることはできますが,何をするにしても途方もない労力が必要になります。

SDK による作業を難しくしているものを,ほんの一部あげてみましょう。

  • SDK による作業は,まったく直感的ではない。
  • 自分が達成しようとするものとは関係のないものを含めて,すべての詳細部分を手作業で指定しなければならない。
  • XML ドキュメントを扱っているにも関わらず,すべての要素を特定の順序で生成しなければならない。そうしないとロードに失敗する。
  • 可変部分があまりにも多いため,問題解決が推理ゲームのようになる。

ClosedXML という名称を選んだ理由も,これと関係しています。最初に私が望んでいたのは,1つのセルに "Hello World" を表示することでした。この hello world プログラムを (SDK を使って) 書くために,数百行というコードが必要だったのです。その時私は,"これがオープンフレームワークを使って作業する,ということだったら,クローズドなものを使う方がましだ" と思いました。フォーラムで誰かが,"このプロジェクトの名前を見たとき,まさに私が探していたものだ,私と同じ思いをした人だ,と思いました。" とコメントしていたのを思い出します。

3. ClosedXML の API は Excel の COM API をベースとしているのでしょうか? もしそうなら,どの程度まで一致させようと考えていますか?

おおよそのベースは Excel の COM API ですが,模倣しようとはしていません。私は何か新たに実装するときはいつも VBA をリファレンスとして見ていますが,VBA コードを ClosedXML に移植するのは,おそらく簡単ではないでしょう。そうは言っても API はかなり似ているので,VBA を使っているのであれば,同じことを ClosedXML で行う方法を見つけるのに問題はないと思います。

新たに API 部分を計画するとき,私はまずそれが "どのように使われるのか" を考えるようにしています。次に,Excel ではどうやっているか,VBA にはどのように実装されているか,さらには他のスプレッドシートのコンポーネントはどうか,などを確認します。 それから私の考えることができる,もっとも直感的なインターフェースを考え出すように努力するのです。Ruby の "驚き最少の法則 (まつもとさんによる)" ですね 。

4. SmartXLS など他の企業では,Excel 用ライブラリを有償で提供しています。そうしないで,オープンソースとしてのリリースを選択したのはなぜでしょう?

このプロジェクトを始めたとき,商品化しようとはまったく考えていませんでした。単に自分が必要としているものが欲しかったのです。1か月ほど作業した後には,ほぼ動作するバージョンのライブラリが出来上がっていました。それまでオープンソースプロジェクトで作業した経験がなかったので,これがその絶好の機会だ,と思ったのです。他のコードリポジトリよりも使いやすそうに思えたので,CodePlex を利用することに決めました。

私は現在,コミュニティのためにプロジェクトを続けています。違う人たちと仕事をして,彼らからフィードバックを受取り,人々の仕事のやり方変えている,と実感するのは楽しいことです。

5. 現在,開発者を募集していますか?

支援はいつでも歓迎しています。プロジェクトに貢献する方法は,バグレポートやパッチの提出など,いろいろあります。時折 "X という機能が必要なので,私が作って提供しましょう" と言ってくれる人がいます。

6. ClosedXML の Word バージョンを作る予定はありますか?

当初からずっと,Word ドキュメントのサポートについては検討していました。しかし残念ながら,まだ Excel ドキュメントに関してやるべきことがたくさん残っていますので,誰かがそれを引きついでくれない限り,すぐには実現できそうもありません。

以下は Excel ファイルに保存されている単純なテーブルを処理するコードのサンプルである。Manuel によれば,

注目してほしいのは,次のようなことを行う必要がない点です。

  • データの位置を示す定型的コードの記述 (テーブルは A1,B1,B2 など,任意のセルから開始することができる)。
  • 行カウンタの保持。テーブルの行はイテレート可能である。
  • 先頭行 (ヘッダ) をスキップするようにコードを調整すること。table.Rows( ) がスキップしてくれる。
  • 名前による列の検索。
  • 行の最終セルの検索。

この記事に星をつける

おすすめ度
スタイル

BT