検索
カレンダー
2019年7月
« 4月    
 123456
78910111213
14151617181920
21222324252627
28293031  
ブログメニュー
Amazon検索
キーワード:

JasperReportsでレポートを入れ子にする

2012年10月25日

PDF出力でJasperReportsを使ったのですが、何箇所かハマったので忘れないようメモ。

JasperReportではDataSourceを渡して帳票とするのですが、それ以外のデータをPDF化したい時は以下の様にJavaBeansのリストからDataSourceを作ります。

JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(beanList);

このデータから入れ子になっている表を作るためにはSubreportを使います。Subreportにデータを渡すためには、Data Source Expression を以下のようにします。あ、文中のbeanはデータを入れているJavaBeansなクラスで、listFieldはそのメソッド(getListField)です。メソッドの戻り値は入れ子データが入っているJavaBeansなクラスのList型と思って下さい。

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{bean}.listField)

これでどうにか入れ子の表が入っているPDFを作成できたのですが、もう一つ問題にぶち当たりました。

実際にこのアプリケーションを動作させる環境のJVMのバージョン古いのか、ObjectInputStreamで「invalid stream header」てな感じで怒られます・・・。

多分、コンパイル後のjasperファイルを読み込むときにコンパイラのバージョンが違うのでエラーになってるんじゃないかなと思います。 ObjectOutputStreamで書き出したデータってバージョンが違いすぎるJVMで読み込めないって聞いた気がします。いや、うろ覚えなんですが。

てことで、最初にPDFを出力する時にサーバでjrxmlファイルをコンパイルすることにしました。コンパイルは以下のような感じでできます。

InputStream in = new FileInputStream(jrxmlFile)
try {
 OutputStream out = new BufferedOutputStream(new FileOutputStream(jasperFile));
 try {
 	JasperCompileManager.compileReportToStream(in, out);
 	out.flush();
 } finally {
 	out.close();
 }
} finally {
 in.close();
}

2回目以降のPDF出力は書き出したjasperファイルを使う感じで。ちなみに、jasperファイルからPDFファイルを作るにはJasperRunManagerってクラスを使います。

コメントはまだありません »

コメントはまだありません。

TrackBack URL : http://www.meibinlab.jp/nishijima/archives/141/trackback

コメントする