[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.