僕の中で話題のPlay Frameworkで、JasperReportを使う方法をご紹介します。
環境とかバージョン
開発環境はOSX10.9で、既存でPlay Frameworkを利用したWebシステムがあります。
今回は、このシステムにJasperReportを利用して、帳票出力機能を追加してみようと思います。
バージョンとかは以下。
Java1.6
Play Framework 1.2.5
JasperReport Library 5.6.0
Jaspersoft Studio 5.6.0
Jasper関連のダウンロードとインストール
Jasper関連は、こちらからダウンロードします。
JasprtReport Libraryは、解凍後、jarファイルなどをPlay Frameworkに組込みます。
Jaspersoft Studioは、帳票作成用エディタなのでインストールします。
Jaspersoft Studioでレポート定義ファイルを作る
インストールしたJaspersoft Studioを起動します。
そしてレポートを適当に作ります。
※今回はPlay Frameworkシステムに入れこむことが目的なのでレポート作成方法は割愛します(・ω<)
DBからレコードを取得したかったので、商品一覧を表示するレポートを作ってみました。(超適当です。。。
PDFなどに日本語を表示する場合は、フォントを組み込む必要があります。
組込み方法は以下サイトに詳しく書いてあったので、そちらをご参照ください。
レポート定義をPlay Frameworkとガッチャンコ!
Jaspersoft Studioで作成したレポート定義ファイルをPlay Frameworkに組込みます。
必要になるのは、.jaspertファイルです。
実際の定義ファイルは、「.jrxml」ファイルなのですが、それをコンパイルしたものが、.jasperファイルになります。
今回の流れとして、Jaspersoft Studioで定義ファイル作成→コンパイルまでを行ってから、Play Framework側に持っていくようにしました。
PlayFramework側に、以下の様な感じで必要なファイル群を配置します。
基本はフォントファイルとjasperファイルになります。(ゴミファイルもありますが、気にしないでください( ˘ω˘)
フォント設定ファイルは以下の様な感じになります。
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="UTF-8"?> <fontFamilies> <fontFamily name="ipaex"> <normal>./app/fonts/ipaexg.ttf</normal> <pdfEncoding>Identity-H</pdfEncoding> <pdfEmbedded>true</pdfEmbedded> </fontFamily> </fontFamilies> |
<normal>の部分のパスがフォントファイルの配置ディレクトリになります。
帳票を出力する
では最後に帳票を出力してみます。
コードは以下の様な感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public static void report(){ try { //帳票に渡すパラメータ群 Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("p1", Integer.parseInt("10000")); //.jasperファイルへのパス String compiledFile = "./app/reports/test2.jasper"; //PlayのDBコネクションを渡す JasperPrint jrprint = JasperFillManager.fillReport(compiledFile, parameters, play.db.DB.getConnection()); //PDF出力 renderBinary(new ByteArrayInputStream(JasperExportManager.exportReportToPdf(jrprint)), "output.pdf", false); } catch (Exception e) { e.printStackTrace(); } } |
とりあえずPDFでの出力をやってみました。
最後はPlayのステキポイント、renderBinaryでブラウザで保存ダイアログが表示されるになってます。
※第三引数を、trueにするとインライン表示されます。
モザイクかかってる部分にはDBから取得したデータがリスト形式で表示されてます。
ちなみにExcel出力する場合は以下。
1 2 3 4 5 6 |
JRXlsExporter exporter = new JRXlsExporter(); exporter.setExporterInput(new SimpleExporterInput(jrprint)); //出力パス指定 exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("/Users/yakisake/test.xls")); exporter.exportReport(); |
Excelの場合は 一旦ローカルにxlsファイルを保存します。
記述していませんが、保存後にそこからStream読みだししてrenderBinaryすれば良いと思います。
xlsxの場合は、「JRXlsxExporter」を使用すれば出力されます。
ぱっと見、行列がすごいことになってますね。。。
PDFよりかは少し癖があるかもなんですが、直接Excelファイルを出せるのは良いことです。
Play FrameworkとJasperReportの良い関係
以上で、とりあえずPlay FrameworkからJasperReportを使用して、
PDF、Excel帳票を出力することが出来ました。
以下に良かった点をまとめます。
- JasperReportにPlayのDBコネクションを渡せる
- renderBinaryがあるので、バイナリファイル(PDF、Excel)をブラウザに簡単に返せる
- JasperReportからはコンパイル済の.jasperファイルのみを持ってくれば良いので分業できる
- JaspersoftStudioがGUIで帳票作れるのでプログラマじゃなくても帳票を作れる
Play Frameworkでは帳票出力機能が標準で搭載されてないのが唯一の不満点でしたが
これでPDF、Excel系が出せることになったので業務システムとかにも使えるんじゃないかなと思っています。