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であっさり解決できたのかもしれないと思うと悔やまれます。やっぱり一番大切なのは情報収集なんですね。