[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」コンポーネントを設置する具体的な操作方法は、以下のとおりです。
このようにして、各部品を配置していきます。
[Column Header][Page Footer][Last Page Footer]の3つのバンドは、[Detail 1][Summary]バンドのスペースをなくすために、[Report Inspector]から、右クリック→[Delete Band]で削除してください。
「小計」と「合計」の「Text Field」コンポーネントでは、変数を使っています。変数は、すでに説明したパラメーターと同じように[Report Inspector]の[Variables]の部分に追加できます。この帳票では、「SUBTOTAL」(小計)と「TOTAL」(合計)という変数を使っています。
各項目の枠線は、パレットにある「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けたごとにカンマを表示できます。
サンプル帳票の作成が完了したら、プレビューしてみましょう。
このサンプルの.jrxmlファイルはこちらからダウンロードできます。
最後に、作成した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未体験の方は、ぜひ本稿も参照して使ってみてはいかがでしょうか。
Copyright © ITmedia, Inc. All Rights Reserved.