連載
» 2010年12月01日 00時00分 公開

業務アプリの常識をJavaオープンソースで身につける(2):JasperReportsとiReportで帳票の常識を理解しよう (4/4)

[久保田大輔,adempiere.jp]
前のページへ 1|2|3|4       

データを表示する帳票のデザイン

■ データを取得するSQL文の設定

 [Designer]ビューに、パレットにある部品を配置しますが、各部品をどの「バンド」に配置するかは重要です。「バンド」というのは繰り返しのパターンなどが異なる帳票上の区分です。[Report Inspector]にある、[Title][Page Header][Column Header][Detail 1][Column Footer]などがバンドです。

 部品をどこに配置するかによって、レコードが複数あった場合や改ページされた場合の表示パターンが変わります。SQLで取得したレコードが2レコード以上あった場合は、繰り返して表示されますが、レコードごとに繰り返しが行われるのは、「Detail」バンドの部分だけです。

 [Page Header][Column Header][Page Footer]などは、ページが切り替わったときに1個分表示されます。

 今回は、[Title]には、「納品書」という「Static Text」コンポーネント、およびデータベースから取得する、「郵便番号」「住所」「名前」「日付」の「Text Field」コンポーネントを配置します。

 [Column Header]には、明細のヘッダ(列名)として「商品名」「単価」「数量」「小計」の「Static Text」コンポーネントを配置します。

 [Detail 1]には、明細の各行として、「商品名」「単価」「数量」「小計」の「Text Field」コンポーネントを配置します。

 [Summary]には、「合計」という「Static Text」コンポーネントと、「合計」の「Text Field」コンポーネントを配置します。

各コンポーネントを配置した様子

 「Text Field」コンポーネントを設置する具体的な操作方法は、以下のとおりです。

  1. パレットから「Text Field」コンポーネントをデザイナの子ウィンドウにドラッグ&ドロップ
  2. 「Text Field」コンポーネントを右クリック→[Edit expression]で[Expression editor]というウィンドウが表示される
  3. [Expression editor]ウィンドウの左下にある一覧から、[Fields]を選択
  4. 下部の真ん中と右の一覧が切り替わる
  5. 真ん中の一覧がカラム一覧。カラムをダブルクリックすることで、上部の[Expression]に選択したカラムが表示される
  6. 右下の[Apply]をクリックすると、「Text Field」コンポーネントで表示するカラムを決定できる

 このようにして、各部品を配置していきます。

 [Column Header][Page Footer][Last Page Footer]の3つのバンドは、[Detail 1][Summary]バンドのスペースをなくすために、[Report Inspector]から、右クリック→[Delete Band]で削除してください。

 「小計」と「合計」の「Text Field」コンポーネントでは、変数を使っています。変数は、すでに説明したパラメーターと同じように[Report Inspector]の[Variables]の部分に追加できます。この帳票では、「SUBTOTAL」(小計)と「TOTAL」(合計)という変数を使っています。

■ iReportの枠線を引く方法

 各項目の枠線は、パレットにある「Frame」「Line」コンポーネントでも作成できますが、項目自体のボーダーでも設定できます。項目を右クリックして表示されるコンテキストメニューで、[Padding And Borders]から枠を設定できます。

 JasperReportsでは、XLS形式で出力したとき、各部品が重なっているとうまく表示できません。そのため、この方法はXLS形式で出力する場合に役立ちます。

■ 金額の表記

 前述したように、PCにインストールされているフォントファイルを指定することで、そのフォントで表示できます。

 [Pdf Font name]に「HeiseiKakuGo-W5」を指定すると、半角の\(円マーク)がバックスラッシュで表示されてしまいますが、フォントを「MS P ゴシック」などに変更することによって、半角の\(円マーク)をバックスラッシュではなく「\」と表示できます。

 金額を表示したいときは、[Text Field]の[Expression]を「"\\" + new DecimalFormat("###,###").format($F{ol_price})」とし、[Expression Class]を「java.lang.String」のようにすれば、金額の左に「\」マークを付けて、3けたごとにカンマを表示できます。

■ iReport上でプレビュー

 サンプル帳票の作成が完了したら、プレビューしてみましょう。

作成した帳票をプレビューしたところ

 このサンプルの.jrxmlファイルはこちらからダウンロードできます。

JasperReportsにパラメータを渡して帳票出力するコード

 最後に、作成したjrxmlファイルを使って、サンプルコードからPDFを出力してみます。前述のサンプルコードと異なる点は、パラメータとコネクションをJasperReportsに渡している点です。

 また、ここではxls形式でも出力しているので、Apache POIのjarファイルもビルドパスに含める必要があります。

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
 
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
 
public class Sample2 {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        Connection con = null;
        try    {
            // jrxmlを指定する
            File jrxmlFile = new File("C:\\Adempiere\\reports\\sampleReport2.jrxml");
            if(jrxmlFile.exists()){
                // jrxmlをコンパイルする
                JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlFile.getAbsolutePath());
                // パラメータの設定
                HashMap<String, Object> params = new HashMap<String, Object>();
                // サンプルデータの主キーの値を設定
                params.put("RECORD_ID", 2);
                // コネクションの設定
                Class.forName("org.postgresql.Driver");
                con = DriverManager.getConnection(
                "jdbc:postgresql://localhost:5432/jasperSample", "postgres","xxxxxxxxxx");
                // データソースにあるデータを、コンパイルされた帳票に入れる
                JasperPrint print = JasperFillManager.fillReport(jasperReport, params, con);
                // 出力用のPDFを指定する
                File pdf = new File("report2.pdf");
                // PDF形式で帳票の出力
                JasperExportManager.exportReportToPdfFile(print, pdf.getAbsolutePath());
 
                // XLS形式で帳票の出力
                File xls = new File("report2.xls");
                OutputStream output = new FileOutputStream(xls.getAbsolutePath());
                JRXlsExporter exporterXLS = new JRXlsExporter();
                exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, print);
                exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, output);
                exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
                exporterXLS.exportReport();
            }else{
                System.out.println("jrxmlファイルが見つかりませんでした。");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(con != null){
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 プログラムを実行してみてください。report2.pdfとreport2.xlsが、Javaのプログラムと同じ階層に作成されるはずです。

帳票もオープンソースを検討してみては

 iReportとJasperReportsを使って帳票を作成する手順を説明しましたが、いかがだったでしょうか?

 JasperReportsは、GUIで帳票の設計もでき、優秀なソフトウェアなので、Javaで帳票を出力することになったら、一度は利用を検討してみるべきだと思います。Web上にも比較的多くの情報があるので、JasperReports未体験の方は、ぜひ本稿も参照して使ってみてはいかがでしょうか。

著者紹介

adempiere.jp
久保田 大輔


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。