Java/帳票/JasperReports5.0 テンプレートにデータソースとパラメータ設定してPDF出力

  • 前回は練習として、シンプルな静的テキスト(ラベル)だけのテンプレートからPDFを出力しました。
  • 今回は、データソースとパラメータを設定して出力してみます。

今回作ったテンプレート

  • ページヘッダとフッタにパラメータから「ReportTitle」を出力し
  • 氏名と住所に、{ADDRESS」テーブルから取得した値を出力するテンプレートです。

出力結果のPDF

  • 上記の通り、パラメータとデータベースから取得した値が埋め込まれています。
  • 今回は「ADDRESS」テーブルには3件データを作ったため、氏名と住所が3件出力されています。

1.サンプル用データベース作成

  • データソースに使うデータベースは、「JasperReport5.0」のサンプル用データベースを参考にしました。
    • 大幅に削って中のデータを変えただけとも言います。

1-1.ディレクトリ構造

プロジェクトホーム
│  JasperSample2.jrxml
├─src
│      JasperSample2.java
├─hsqldb
│      build.xml
│      test.properties
│      test.script
└─lib
        hsqldb-1.8.0-10.jar
 
  • プロジェクトホームの配下にlibディレクトリを掘り、必要なjarファイルをまとめて入れます。
  • 同じくホームの配下にhsqldbディレクトリを掘り、3つのファイルをコピーします。

1-2.build.xml

<project name="HSQLDB" default="runServer" basedir=".">
 
	<description>Helps starting up the HSQLDB demo database.</description>
 
	<path id="hsql-classpath">
		<fileset dir="../lib">
			<include name="**/hsqldb*.jar"/>
		</fileset>
	</path>
 
	<target name="runServer" description="Launches the HSQLDB database server.">
		<java classname="org.hsqldb.Server" fork="true">
			<classpath refid="hsql-classpath"/>
		</java>
	</target>
 
	<target name="runManager" description="Launches the HSQLDB manager.">
		<java classname="org.hsqldb.util.DatabaseManager" fork="true">
			<classpath refid="hsql-classpath"/>
		</java>
	</target>
 
</project>
 
  • 変更箇所は「hsqldb-1.8.0-10.jar」を探してクラスパスに入れる部分です。

1-3.test.script

CREATE SCHEMA PUBLIC AUTHORIZATION DBA
CREATE MEMORY TABLE ADDRESS(ID INTEGER NOT NULL PRIMARY KEY,FIRSTNAME VARCHAR,LASTNAME VARCHAR,STREET VARCHAR,CITY VARCHAR)
CREATE USER SA PASSWORD ""
GRANT DBA TO SA
SET WRITE_DELAY 10
SET SCHEMA PUBLIC
INSERT INTO ADDRESS VALUES(0,'\u30ed\u30fc\u30e9','\u30b9\u30c1\u30fc\u30eb','\u7a1a\u5185\u5e02\u306a\u3093\u3068\u304b\u304b\u3093\u3068\u304b','\u5317\u6d77\u9053')
INSERT INTO ADDRESS VALUES(1,'\u30b9\u30fc\u30b6\u30f3','\u30ad\u30f3\u30b0','\u516b\u6238\u5e02\u306a\u3093\u3068\u304b\u304b\u306a\u3068\u3093','\u9752\u68ee\u770c')
INSERT INTO ADDRESS VALUES(2,'\u30a2\u30f3\u30cd','\u30df\u30e9\u30fc','\u76db\u5ca1\u5e02\u306a\u3093\u3068\u304b\u304b\u3093\u3068\u304b','\u5ca9\u624b\u770c')
 
  • build.xml実行時にテーブルとデータの作成を行うスクリプトです。
    • 元はもっとたくさんのデータがありましたが、多すぎても大変なので大幅に削って各項目に日本語を設定しました。

1-4.test.properties

  • 特に変更していないので省略

  • これで、コマンドプロンプトから「hsqldb」ディレクトリに移動し、「ant」を実行するとサンプル用データベースにアクセス出来るようになります。



2.テンプレートの作り方

2-1.「SQL文」の設定

  • 画像のように「Report Inspector」の一番上の要素で右クリックメニューを出すと、「Edit Query」があるので選択します。

  • 「Report query」タブを選択し、「Query language」は「SQL」でよいと思います。
  • 帳票出力に使いたいSQLを入力し、「OK」を押します。

2-2.パラメータの追加

  • 画像のように「Parameters」で右クリックメニュー「追加 Parameter」を選択します。
  • パラメータの名前を「ReportTitle」にして下さい。
    • 追加していないパラメータを使うと、テンプレートのコンパイル時にエラーが発生します。

  • 2-3.フィールドの追加
  • 画像のように「Fields」で右クリックメニュー「追加 Field」を選択します。
    • DBから取得する以下の項目を作成して下さい。
      • firstname
      • lastname
      • street
      • city
    • 項目名さえ合っていれば、PDF出力などに使えるようです。


2-4.パラメータの使い方

$P{ReportTitle}
 
  • テキストフィールドに上記のような式を設定すると、PDFにパラメータで指定した値が出力されます。


2-5.フィールド(データソースから取得した値)の使い方

$F{firstname}
 
  • テキストフィールドに上記のような式を設定すると、PDFにデータソースから取得した値が出力されます。
$F{firstname} + " " + $F{lastname}
 
  • 上記のように「+」で繋ぐと、Javaの用に文字列の結合ができます。


2-6.変数(Variables)の使い方

$V{COLUMN_COUNT}
 
  • 今回は新しい変数は追加しませんでしたが、最初から定義されている「COLUMN_COUNT」を使いました。
    • 「COLUMN_COUNT」には処理中のカラムのカウントが入っているようですが、「COLUMN_NUMBER」が111と出力されてしまい使い道がわかりませんでした。

3.Javaソースの変更点

import java.sql.*;
import java.util.*;
import net.sf.jasperreports.engine.*;
 
// JasperReports5.0用パラメータ、データソースを使ってPDF出力
// 参考 http://foolprogrammer.blogspot.jp/2012/04/itext217_28.html
// http://thinkit.co.jp/free/tech/4/4/1.html
public class JasperSample2 {
  public static void main(String[] args) {
    // テンプレートXMLファイルのパス
    String templatePath = "./JasperSample2.jrxml";
    // 出力するPDFファイルのパス
    String destPath = "./JasperSample2.pdf";
 
    try {
      // (1)テンプレートXMLのコンパイル
      JasperReport jasperReport = JasperCompileManager
          .compileReport(templatePath);
 
      // (2)パラメータの生成
      Map<String, Object> paramMap = new HashMap<String, Object>();
      paramMap.put("ReportTitle", "ちゃぱてぃ商店従業員名簿"); // ★ 追加 ★
 
      // (3)データソースの生成 ★ 追加 ★
      Class.forName("org.hsqldb.jdbcDriver");
      Connection con = DriverManager.getConnection(
          "jdbc:hsqldb:hsql://localhost", "sa", "");
 
      // (4)データの動的バインド
      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
          paramMap, con); // ★変更★
 
      // (5)PDFへ出力
      JasperExportManager.exportReportToPdfFile(jasperPrint, destPath);
 
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}
 
  • まず、(2)パラメータの生成で、帳票のタイトル「ReportTitle」を設定しています。
  • (3)データソースの生成は特に難しい事はしていません、データベースのコネクションを取得しているだけです。
  • (4)データの動的バインドでは、空のデータソースを設定していた所に、今回取得したデータベースのコネクションを設定しています。



サンプルダウンロード

  • JasperSample2.java- サンプルプログラム
  • JasperSample2.jrxml- JasperReportsテンプレート
  • JasperSample2.pdf- 出力結果のPDF
  • #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (JasperSample2.zip)
    - hsqldb含めた詰め合わせ

hsqldb含めた詰め合わせの実行方法

0.まるごとeclipseのプロジェクトにコピーします。
1.「lib」ディレクトリの中に、「hsqldb~.jar」をコピーして下さい。
2.「hsqldb~.jar」以外のjarファイルもコピーしても構いません。
3.jarファイルにビルドパスを通します。
4.コマンドプロンプトから「hsqldb」ディレクトリまで移動し、「ant」を実行します。
  「ant」のインストールはインターネットで頑張って検索して下さい。
5.「ant」を実行すると「hsqldb」が立ち上がります。
6.「JasperSample2」をeclipse上で実行すると「JasperSample2.pdf」ができます。


コメント

最終更新:2013年01月04日 02:34