Javaで帳票作成(JasperReports)条件によって出力を制御&JavaBean使用 | Hello, Stupid World!

Hello, Stupid World!

いろいろとメモ代わりに書いていきます。

帳票を作成していると、ある条件のときだけ表示したり消したりしたい場合が
あります。

そんな時にどうするか説明します。
あと、今回はBeanを使ったパラメータの渡し方を合わせて説明します。

まずはBeanを用意。

[Bean]
public class reportBean {
private int No;
private int Status;
public int getNo() {
return No;
}
public void setNo(int no) {
No = no;
}
public int getStatus() {
return Status;
}
public void setStatus(int status) {
Status = status;
}
}

NoとStatusという数値型のメンバーをもったBeanを作ってみました。
この作ったBeanをiReportとか読めるように設定します。

上部の「ツール」メニューから「オプション」を選択してオプションダイアログを
出し、「Classpath」タブに遷移後、「Add Folder」ボタンを押して
作ったBeanのパスを選択します。



次に出力先のレポートを開いて
Previewの右隣にある(赤い四角で囲んだ)ボタンを押します。



「JavaBean」タブを選択し、Class nameにクラス名を入れて「Read attribute」
ボタンを押すと、Beanのメンバーが表示されます。

出力したいメンバーを選択後、「Add Selected field」ボタンを押した後
「OK」ボタンを押します。
するとデザイン画面左の「Report Inspector」欄の「Fields」に追加されます。
これをデザイン画面の出力したい位置にドラッグして下さい。



今回は値による表示切替も行います。
そんな時はプロパティーの「Priint When Expression」に条件式を記述します。


「$F{no} != 0 ? Boolean.TRUE : Boolean.FALSE」
Javaできる人なら分かると思いますがnoが0でない場合はTRUE(表示)
0の場合はFALSE(非表示)です。

ここまでできたら、次は印刷のプログラムを書いていく。

[main]
public class printMain {

public static void main(String[] args) {
// テンプレートXMLファイルのパス
        String templatePath = "C:/Work/report1.jrxml";
        try {
         // (1)テンプレートXMLのコンパイル
         JasperReport jasperReport =
JasperCompileManager.compileReport(templatePath);

        // (2)パラメータの生成
       List<ReportBean> fields = new ArrayList<ReportBean>();
       ReportBean reportBean = new ReportBean();
         reportBean.setNo(1);
         reportBean.setStatus(1);
         fields.add(reportBean);

        
ReportBean reportBean2 = new ReportBean();
         reportBean2.setNo(2);
         reportBean2.setStatus(2);
         fields.add(reportBean2);

        
ReportBean reportBean3 = new ReportBean();
         reportBean3.setNo(0);
         reportBean3.setStatus(3);
         fields.add(reportBean3);

       // (4)データの動的バインド
       JasperPrint print = JasperFillManager.fillReport(jasperReport, null, new
JRBeanCollectionDataSource(fields));

       // (5)プリンターへ出力
       PrintServiceAttributeSet atts = new HashPrintServiceAttributeSet();
       atts.add(new PrinterName("Microsoft XPS Document
Writer",Locale.getDefault()));

       JRExporter exporter = new JRPrintServiceExporter();
       exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
     
 exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET,
atts);
       exporter.exportReport();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
}
}

ほとんど前回と同じです。
違いはバインドする時にデータソースとして
JRBeanCollectionDataSourceという
クラスを使います。引数には作ったBeanをセット。

出力結果です。



3個目はNoに0をセットしたのでNoもStatusも表示されていません。
表示条件が正常に動作している事を確認できました。