Excelファイルの生成

いがぴょんの日記ウェブページv2を読んでいたらこんな記述がありました。

2005.02.19 追記 JExcelApi (Java Excel API) の最新版は JExcelApi v2.5.2 でした。Jakarta POI 2.5.1において Excelシートのコピーの際に画像が入っているとコピーできないという不具合があり、JExcelApiの検討を深めていく予定です。

驚きました。ぼくも先週はまったく同じ問題、すなわち「Jakarta POIでのExcelファイル生成において画像の入ったシートをコピーできない」という問題に直面していたのです。POIでのファイル読み込みは昔から色々なシステムでやっていた(マスタ取り込みなどのバッチ系)ので、書き込みもそんなに問題ないだろうと甘く見ていたところがありました。

一応POIのソースを追っかけてみて、どこかのクラスのclone()というメソッドだったかでNULLを返すのが原因だろう、というところまで追いつめていたのですが、POIを修正して解決するだけの余力が無く、また当該機能の実装を急ぐ必要もあったため、別の方式で無理矢理作り込んだのでした。・・・この時点ではJExcelApiの存在を知りませんでした。

ASP.NETで、Excelを起動してファイルを生成するWebサービスをこしらえて、それをJavaから呼び出すという、いかにもその場しのぎの方法をとったのですが、これが逆に大きな地雷原になってしまいました。具体的には以下の問題がありました。

  • サーバーサイドでExcelを利用するときは、ライセンスに注意。→ 今回は、クライアントの数だけExcelのライセンスが確保できていたのでセーフでした。ライセンスがたくさんあったのではなく、クライアント数が確実に限定でき、極めて少数だったというだけですが(苦笑)。
  • そもそも、サーバーサイドでのOfficeのオートメーション利用について、Microsoftはサポートしていない → [OFF2003] [INFO] Office のサーバーサイド オートメーションについて @ Microsoftサポート
  • Excelファイルの生成時、excel.exeプロセスが解放されず残っていく。→ WorkBook、WorkSheet、Range、Cellなどの単位で確実にReleaseObject()しないとダメっぽいです。(手元にソースがないので詳細は後日また)
  • .NET FrameworkdからExcelを呼び出すときの設定。 → DCOMConfigでしたっけ?(手元にソースがないので以下同文)

これら諸々の解決に、都合3日ほど要してしまったのでした。実装とテストは半日で終わったのに。

もしかしたら、JExcelApiであっさり解決できたのかもしれないと思うと悔やまれます。やっぱり一番大切なのは情報収集なんですね。

BACnetの情報収集中

仕事の関係で、BACnetについての情報を集めています。BACnetというのは簡単に言うと、ビルやマンションの設備を管理・制御するためのプロトコルです。ISO 16484-5として標準規格になっているようです。普及しているかどうかはともかくとして。

ところで、テレコム業界にはCMIPというOSIの標準プロトコルが昔からありまして、こちらは通信装置の管理・制御を行うためのプロトコルです。SNMPのちょっと高度なバージョンという位置づけでしょうか。普及しているかどうかはともかくとして。

5年くらい前にCMIPを相手に格闘していた時期があったのですが、そのときに経験したCMIPと今勉強しているBACnetを比べていると、BACnetもCMIPも実現しようとしていることの本質は同じではないかなあと、強く思います。

  • 管理する側(Manager)、管理される側(Managed Objects)という考え方をする。
  • 管理される側は、ある程度の単位でクラスが定義される。例えば「スイッチ」というクラス。
  • 管理する側は、管理される側をオブジェクトの集まりとして扱う。
  • プロトコルの肝は、オブジェクトの生成・削除(CREATE/DELETE)、オブジェクトの属性取得/設定(GET/SET)・オブジェクトからの属性変化通知(EVENT)。

Manager側を作るとき、一番悩むのが実際の管理対象機器との状態整合とその検証ルーチン、そしてEVENTの扱いだという点も似ているような気がします。まあ、ぼくの理解がまだまだ浅いという可能性がかなりありますが・・・。