図6●Excelで作成したテンプレート
図6●Excelで作成したテンプレート
[画像のクリックで拡大表示]
リスト5●Excel帳票を生成するサーブレットPoiExcel.java(抜粋)
リスト5●Excel帳票を生成するサーブレットPoiExcel.java(抜粋)
[画像のクリックで拡大表示]
表4●セルのデータ型を指定するsetCellTypeメソッドの設定値
表4●セルのデータ型を指定するsetCellTypeメソッドの設定値
[画像のクリックで拡大表示]
リスト6●サーブレットPoiExcelを動作するためにweb.xmlに追加する設定
リスト6●サーブレットPoiExcelを動作するためにweb.xmlに追加する設定
[画像のクリックで拡大表示]
図7●動的に生成されたExcel帳票
図7●動的に生成されたExcel帳票
[画像のクリックで拡大表示]

Jakarta POI&Excelで
帳票を動的に生成する

 次に,Jakarta POIで,Excel帳票を動的に生成してみましょう。Jakarta POIは,このソフトのWebページ(http://jakarta.apache.org/poi/)からダウンロードできます。ダウンロードしたpoi-bin-2.5.1-final-20040804.zipを解凍すると,一連のファイルが展開されるので,配下に含まれるpoi-2.5.1-final-20040804.jarをアプリケーション・ルート直下の「/WEB-INF/lib」フォルダにコピーしてください*6

Excelを使ってテンプレートを作成する

 Jakarta POIでは,Excelで作成したテンプレート(「.xls」ファイル)を利用して帳票を作成できます。Excelを利用することで,Excelが標準で持っている表計算機能やチャート機能をPOIからフルに利用できるというメリットがあります。

 サンプルでは(図6[拡大表示])のようなテンプレートを作成しました。表部分はあらかじめチャートに関連付けてあります。これにより,アプリケーションからセル内にデータを引き渡すだけで,特別なコーディングを行うことなく,様々なチャートを動的に作成できます。作成したテンプレート(サンプルではtemplate.xls)は,アプリケーション・ルート配下の「/WEB-INF」フォルダに配置します。

テンプレートからExcel帳票を作成する

 テンプレートが準備できたら,Excel帳票を生成するサーブレット・クラスPoiExcelを作成します(リスト5[拡大表示])。POIでは,Excelファイルを操作するために,POIFSFileSystem(ファイル管理),HSSFWorkbook(ワークブック),HSSFSheet(ワークシート),HSSFRow(行),HSSFCell(セル)の五つのクラスを用意しています。

 POIFSFileSystemクラスはExcelファイルを読み込むためのクラスです。読み込んだファイルをHSSFWorkbookクラスのコンストラクタに引き渡すことで,ExcelファイルをPOIで扱えるようになります。HSSFWorkbookクラスは,その名の通りワークブックを表すクラスで,getSheetAtメソッドを介して配下のワークシート(HSSFSheetオブジェクト)を取得できます。同じ要領で,HSSFSheet#getRowメソッドで行(HSSFRowオブジェクト)を,HSSFRow#getCellメソッドでセル(HSSFCellオブジェクト)を取得できます。これらのオブジェクトの関係は,Excelを使ったことがある人なら直感的に理解できるでしょう。

 あとは名称の頭にsetが付くHSSFCellのメソッド群で,該当セルの属性情報をセットしていくだけです(リスト5(1))。setEncodingはセルの文字エンコーディングをセットするメソッドです。セルに日本語(マルチバイト文字)を含む場合には,必ずUTF-16(Unicode)をセットしてください。ここのように数値データだけの場合には,特に指定する必要はありません。setCellTypeメソッドは,セルのデータ型を指定するメソッドです(表4[拡大表示])。setCellTypeメソッドで指定したデータ型とsetCellValueメソッドで指定した実際の値とが合っていない場合には例外が発生しますので,注意してください。ここでは,あらかじめ配列に入れておいた値をsetCellValueメソッドでセットしていますが,実際のアプリケーションではデータベースなどから取り出したデータをセットします。

 編集が終わったワークブックは,HSSFWorkbook#writeメソッドで指定した出力先に書き出します(リスト5(2))。リスト3にもあったように,ServletOutputStreamオブジェクトはクライアントにバイナリ・データを送信するための出力ストリームです。HttpServletResponse#getOutputStreamメソッドを使って取得できます。

 サーブレット・クラスを動作させるには,web.xmlにサーブレットを登録します(リスト6[拡大表示])。これにより,「http://localhost:8080/nikkei200512/out.xls」でサーブレットを呼び出せるようになります(図7[拡大表示])。ユーザーからは,あたかも静的なExcelファイルをダウンロードしているように見えます。

☆          ☆          ☆

 今回は,JooReportsとJakarta POIを使った帳票アプリケーションの作成について紹介しました。オープンソース・ライブラリを使えば,商用ライブラリに負けない帳票を簡単に作成できることがおわかりになったと思います。

 さて,オープンソース・ソフトウエアを紹介する本連載もこれが最終回になりました。2005年7月号の第1回で紹介したように,オープンソースと一口に言っても,様々な分野,様々な目的のソフトウエアが存在します。限りある誌面でその魅力をどこまで味わっていただけたか心配ですが,少しでも読者の皆さんに伝わるところがあれば幸いです。またどこかでお会いしましょう!


山田 祥寛(やまだ よしひろ)

千葉県鎌ヶ谷市在住のフリーライター(http://www.wings.msn.to/