帳票作成と聞くと,とかく「高価なツールが必要なのでは?」「コーディングが難しそう」と思いがちです。なるほど,一昔前ならそうだったかもしれません。しかし,今では高度な機能を備えたオープンソースの帳票ソフトウエアが数多くあります。連載最終回の今回は,無償で利用できるこうしたソフトウエアを使って,帳票を出力するアプリケーションを作成してみましょう。
テンプレート作成にOfficeを利用できる二つのソフト
オープンソースで提供されている代表的な帳票ライブラリには,(表1[拡大表示])のようなものがあります。今回は,その中から二つのソフトウエアを紹介します。
一つは,PDF(Portable Document Format),RTF(Rich Text Format),HTMLなど様々な形式のドキュメント出力に対応した「JooReports」です。テンプレートから動的に帳票ドキュメントを生成する「JooTemplates」とフォーマット変換を行う「JooConverter」から構成されるソフトです。JooConverterを利用することで,一つのドキュメントから複数のフォーマットを手軽に生成できます。
JooReportsの帳票テンプレートの編集には,オープンソースのオフィス・スイートであるOpenOffice.orgを利用します。OpenOffice.orgのGUIはマイクロソフトのOfficeによく似ており,Officeとの互換性が高いのが特徴です。帳票テンプレートをGUIで編集できるソフトには「JasperReports」もありますが,専用のGUIツール「iReport」を使う必要があります。Officeソフトで帳票を設計できるのは,JooReportsの大きなメリットです。
もう一つは「Jakarta POI」です。こちらは主にExcel帳票を作成するためのライブラリです*1。PDFには「改ざんが難しい」「セキュリティ設定が容易」といったメリットがあります。しかし,PDFはあくまで最終結果の出力に適したフォーマットです。出力後に編集したり,データを分析するのには向きません。こうした用途にはExcelファイルのほうが適しています。Excel形式の帳票なら,マイクロソフトのExcelが提供する分析/集計機能やチャート生成機能をフルに活用できます。元になる帳票レイアウトを普段使い慣れたExcelで設計できるのも魅力です。
これらの帳票ライブラリを利用するには,JDK(Java Development Kit)と,WebコンテナのTomcatをインストールする必要があります。ソフトウエアのインストール方法については,著者のサイト「サーバサイド技術の学び舎- WINGS」(http://www.wings.msn.to/)の「サーバサイド環境構築設定」を参照してください。サンプルの「nikkei200512.war」は,日経ソフトウエアのサイト(http://software.nikkeibp.co.jp/)からダウンロードできます。サンプルは(図1[拡大表示])に示した手順で動作させることができます。
JooReports&OpenOffice.orgで
PDF帳票を動的に生成する |
では,JooReportsを使ってPDF帳票を生成してみましょう。JooReportsを利用するには,OpenOffice.orgの環境設定を行う必要があります。(表2[拡大表示])に示したファイルをあらかじめダウンロードしておいてください。
テンプレート作成の環境を整える
(1)OpenOffice.orgのインストール
OpenOffice.orgをインストールするには,ダウンロードしたOOo_1.1.5_Win32Intel_install_ja.zipを解凍し,配下に含まれるsetup.exeを実行します。インストール後,画面右下のタスクバーに「OpenOffice.org 1.1.5 クイック起動」が常駐していれば,インストールは成功です*2。
インストール後,「%OOo_HOME%/share/registry/data/org/openoffice」フォルダ*3に含まれる設定ファイル「setup.xcu」に(リスト1[拡大表示])に示した内容を追加してください。これは,JooConverterをOpenOffice.orgに接続するための設定で,この設定をしないと正しくJooConverterを実行できません。setup.xcuを編集した後,設定を反映させるため「OpenOffice.org 1.1.5 クイック起動」を再起動してください。
(2)OpenOffice.org上でJooReportsを有効化
次に,JooTemplatesに含まれているJooReports-AddOnInstaller.sxcをOpenOffice.orgで開いてください。マクロが含まれているため,起動時にセキュリティのメッセージが表示されますが,[実行する]を選択します。(図2[拡大表示])のような画面が開くので,[Install]ボタンをクリックしてください。インストールの途中で,JooReportsのメニューをどこに追加するかを聞かれたときは,「Top Menu」に追加しておきます。OpenOffice.orgを再起動し,メニューバーに[JooReports]が追加されていれば成功です。
(3)必要な「.jar」ファイルを配置
JooReportsとOpenOffice.orgを利用するには,(表3[拡大表示])に示した「.jar」ファイルが必要です。それぞれアプリケーション・ルート配下の「/WEB-INF/lib」フォルダに配置してください*4。OpenOffice.orgの「.jar」ファイルは,「%OOo_HOME%/program/classes」フォルダに含まれています。
テンプレート・ファイルをOpenOffice.orgで作成する
JooReportsでは帳票テンプレートをOpenOffice.orgで作成します。帳票テンプレートを利用することで,定型的な表示をコードで制御する必要がなく,コードを簡素化できます。また,帳票レイアウトの変更に柔軟に対応できるというメリットもあります。ここでは,(図3[拡大表示])のようなテンプレートを作成します。作成したテンプレート(サンプルではtemplate.sxw)は,アプリケーション・ルート配下の「/WEB-INF」フォルダに配置します*5。
テンプレート・ファイルを作るには,OpenOffice.orgの「文書ドキュメント」を新規作成します。テンプレートの外枠を作成した後,アプリケーションから動的に操作するためのタグとフィールドを埋め込みます。フィールドはテンプレート内で置き換え可能な変数,タグは出力時の繰り返しや条件分岐を制御するための命令です。メニューバーの[JooReports]から[Insert Fields...]や[Insert ~Tag...]を選択することで,現在のカーソル位置にタグやフィールドを挿入できます。(図4[拡大表示])の要領でタグやフィールドを追加してください。
図4に示したForEachタグは繰り返しを表すためのタグです。[Items Expression]で渡された変数(配列)に含まれるオブジェクト(JavaBeans)を順番に取り出し,中身がなくなるまで繰り返し出力します。取り出したオブジェクトのプロパティは,#Item.TitleのようにForEachタグの[Variable Name]で設定されたオブジェクト変数名を使って参照できます。「#Item.Title」と指定すると,「配列ItemListから取り出されたオブジェクトItemのアクセサ・メソッドであるgetTitleメソッドが呼び出される」ことになります。
ちなみに,明細の行情報を表すBeanであるItemクラスは(リスト2[拡大表示])のように記述します。getItemInfosメソッドは,行情報(Itemオブジェクト)のリストを配列として取得するメソッドです。本来はデータベースなどから情報を取得すべきところですが,サンプルではコードの簡素化のため,データをコードに直接記述して静的にセットしています。詳細は,ダウンロードしたサンプルに含まれるItem.javaのソースコードを参照してください。
PDF帳票を自動生成するサーブレットを用意
テンプレートが準備できたら,テンプレートから帳票を生成するサーブレットを作ってみましょう。サンプルでは,JooReportPdfクラスが帳票を生成するサーブレットになります(リスト3[拡大表示])。
テンプレート・ファイルを操作するのは,Templateオブジェクトの役割です(リスト3(1))。コンストラクタからテンプレート・ファイルを読み込んだ後,Template#createDocumentメソッドでテンプレート内の変数にデータを流し込みます。テンプレート変数は,HashMapオブジェクトとして引き渡すことが可能です(リスト3(2))。キー名はテンプレート内で指定した変数名と対応していなければなりません。createDocumentメソッドで生成した帳票ドキュメントは,一時ファイルinFile(Fileオブジェクト)に出力されます。
次に,生成したドキュメントをDocumentConverter#convertメソッドでPDFファイルに変換します(リスト3(3))。convertメソッドの構文は以下の通りです。
convert(入力元, 出力先, 変換フォーマット)
ここでは変換フォーマットに,PDF(DocumentFormat.PDF_WRITER)を指定しています。これでPDF帳票が生成できたので,あとはクライアントに出力するだけです。変換結果を表すoutFile(Fileオブジェクト)をFileInputStreamクラスで読み込み,これをServletOutputStream#writeメソッドで出力します(リスト3(4))。ServletOutputStreamクラスは,PDFや画像などのバイナリ・データをそのまま出力する場合に使用するバイナリ出力ストリームです。
コード内で利用した一時ファイル(inFileとoutFile)は,最後に削除するのを忘れないようにしてください(リスト3(5))。
サーブレットを動作させるには,デプロイメント・ディスクリプタに登録する必要があります(リスト4[拡大表示])。まず,<servlet>要素で,サーブレット・クラスの完全修飾名(<servlet-class>要素)に対応する論理名(<servlet-name>要素)を定義します(リスト4(1))。論理名は,アプリケーション内で一意である必要があります。次に,この論理名と呼び出しURLを<servlet-mapping>要素で関連付けます(リスト4(2))。ここでは,URLパターン(<url-pattern>要素)として「/out.pdf」を指定しています。これで,「http://localhost:8080/nikkei200512/out.pdf」のように,静的なファイルを呼び出す要領で,サーブレット・クラスnikkei.sheet.JooReportPdfを呼び出せるようになります(図5[拡大表示])。
山田 祥寛(やまだ よしひろ)千葉県鎌ヶ谷市在住のフリーライター(http://www.wings.msn.to/) |