かえでBlog

色々なことを徒然と……

【iReport&JasperReports】複数ページ結合によるページNoの振り方

      2015/01/30

前回の記事にて複数レポートによる結合を行いました。

しかし、結合レポートにページNoを振って印刷しようとするとページNoの値がおかしくなり、iReportで対応がわからなかったのでJAVA側で対応をすることにしました。

【通常】

$V{PAGE_NUMBER}パラメータを使い、評価時間は分子は「今」分母は「レポート」で記述します。

 

JAVA側にて新しくパラメータ[ページ]、[最大ページ]を作成し、最大ページを取得するためにJasperReportの処理を2回行う。

//メインレポートのフィールド作成
ArrayList<ArrayList<String>> メインレポートのデータソース = new ArrayList<ArrayList<String>>();
ArrayList<String> サブレポートのフィールド  = new ArrayList<String>();
メインレポートのフィールド.add("テスト");
メインレポートのフィールド.add("テスト2");
メインレポートのフィールド.add("テスト3");
サブレポートのデータソース.add(メインレポートのフィールド);

//結合レポートのフィールド作成
ArrayList<ArrayList<String>> 結合レポートのデータソース = new ArrayList<ArrayList<String>>();
ArrayList<String> 結合レポートのフィールド  = new ArrayList<String>();
結合レポートのフィールド.add("test");
結合レポートのフィールド.add("test2");
結合レポートのフィールド.add("test3");
結合レポートのデータソース.add(結合レポートのフィールド);

//最大ページの取得
// レポートのパラメータを作成する
HashMap maxpages_parameters = new HashMap<String, String>();

// ページの設定
maxpages_parameters.put("ページ", 0);
maxpages_parameters.put("最大ページ", 0);


List<JRPrintPage> pages = null;

//データソースの作成
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(メインレポートのデータソース);

//メインレポート出力処理
JasperPrint maxpage_print = JasperFillManager.fillReport(テンプレートパス+テンプレートファイル名, maxpages_parameters, メインレポートのデータソース);


//サブレポートの出力処理
JasperPrint maxpage_print2 = JasperFillManager.fillReport(テンプレートパス+テンプレートファイル名, maxpages_parameters, 結合レポートのデータソース);

// 追加する帳票をメイン帳票に追加
maxpage_pages = maxpage_print2.getPages();
for(JRPrintPage maxpage_page : maxpage_pages ){
	maxpage_print.addPage(maxpage_page);
}


//通常処理
// レポートのパラメータを作成する
HashMap parameters = new HashMap<String, String>();

// ページの設定
parameters.put("ページ", 0);
parameters.put("最大ページ", print_maxpages.getPages().size());


List<JRPrintPage> pages = null;

//データソースの作成
dataSource = new JRBeanCollectionDataSource(メインレポートのデータソース);

//メインレポート出力処理
JasperPrint print = JasperFillManager.fillReport(テンプレートパス+テンプレートファイル名, parameters, メインレポートのデータソース);


//サブレポートの出力処理
JasperPrint print2 = JasperFillManager.fillReport(テンプレートパス+テンプレートファイル名, parameters, 結合レポートのデータソース);
//現在ページの更新
parameters.put("ページ", print.getPages().size());


// 追加する帳票をメイン帳票に追加
pages = print2.getPages();
for(JRPrintPage page : pages ){
	print.addPage(page);
}


// PDFファイルへ出力する
//直接出力の場合
//JasperExportManager.exportReportToPdf(print,"pdf/output/sample_report2.pdf");
//byteにて格納する場合
byte[] bytes = JasperExportManager.exportReportToPdf(print);


最大ページ取得するため、余分に処理がかかりますが、部単位での出力を行ったりとか汎用性がききやすいんじゃないかな? と思います。

 - JAVA , , , ,