読者です 読者をやめる 読者になる 読者になる

JasperReportsのexpressionでgroovyを使う

JasperReportsのvariableやtextFieldのexpressionで使用する言語はデフォルトではJavaです。
Booleanとbooleanのキャストが必要だったり、オブジェクトのプロパティにアクセスするのにgetterを呼ばないといけなかったりと、ほんとにJavaなのでJSPなどのELに慣れていると面倒です。このexpressionで使用する言語はJava以外にgroovyも使用できるので試してみました。
JasperForge: iReport: Groovy(参考)

テンプレート(jrxml)の作成

<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
              name="report" 
              language="groovy"
              pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20">
...

テンプレートの方では、単純にjasperReport要素の属性languageで"groovy"を指定します。iReportから見ると、ここの選択肢に"JavaScript"もあるので使えそうです。

// Mapのアクセス
$F{fMap}.get('key1')
// ↓
$F{fMap}.key1

// 文字列がnullでない
new Boolean($F{fStr} != null)
// ↓
$F{fStr}

// オブジェクトのフィールドの値を取得
$F{fObj}.getValue()
// ↓
$F{fObj}.value

こんな感じでgroovyの文法で書けるようになります。iReportのexpressionの編集画面は使いやすいとは言えないので、ありがたいです。
さらに、JasperReportのFieldやVariableではあらかじめ型を指定する必要がありますが、groovyを使うのであればObject型でもフィールドにアクセスできるようになるため、クラスをimportしておく必要がなくなります。

レポートの作成

自分のアプリケーションで、groovyのexpressionを含むテンプレートを使用してレポートを作成する際には、groovyが必要になりますのでclasspathにgroovy関連のjarを追加しておきます。
私は以下の環境で試しました。

  • jasperreport3.5.2
  • groovy 1.6.3