【JasperReport】Javaで、PDF出力 -シンプル・サンプル編- [1]

Java Bean からPDF出力

簡単なサンプルを通して、使い方を学ぶ

 参考にしたサイトは、以下の通り。
http://park.geocities.jp/gdfsm000/ireport/ireport04.html
http://d.hatena.ne.jp/rokugen/20060323

作成手順

[1] Java Bean を作成する(サンプルの「Person.java」を参照のこと。)
[2] [1]で作成したJava Beanのクラスパスを、iReport に設定する 

 [2-1] iReport を立ち上げ、新規ファイルを開く( Report Name は、「sampleTemplate.jrxml」としておく)
 [2-2] iReport の[ツール]-[オプション]-[ClassPath]で、「Add Forlder」ボタンを押下
 [2-3] [1]で作成したJava Beanのクラスパスを選び、「了解」ボタンを押下する 。
 ※あくまで、『クラスパス』を選択すること
 (例えば、Eclipseのプロジェクト名が、「sampleiReport」だとしたら、「・・・workspace\sampleiReport\bin」)。
 ソースではない。) '''
 [2-4] Report Inspector欄のファイル名を右クリックし、「プロパティ」を選び、Languageを「Groovy」→「Java」に変更する
★重要★
 [2-5] 「リポートクエリ(Previewと虫眼鏡アイコンの間にあるデータベースに矢印が入ってるアイコン)」アイコンを押下し、
    「Report query」を開く
 [2-6] 「Java Beans Datasource」タブのClass Name欄に、[1]で作成したJava Beanのパッケージを含めたクラス名を
    入力(例の場合、「beans.person」)し、「Read Attribute」ボタンを押下
  =>すると、Java Beanのクラス名およびメンバ名が、一覧になって表示される
   (※されない場合は、[2-3]の設定がうまくいってないと思われる)
 [2-7]表示したいフィールドを選び、「Add Selected Filed」ボタンで追加したら、「OK」ボタン押下
  =>すると、左側にある「Report Inspector」欄を見ると、「Fields」には、選択したフィールドがあるはず
 [2-8]ドロップ&ドロップでフィールドを配置する。(なお、ドロップ&ドロップした時に、
   ダイアログで「The filed value」を選ぶ)
 [2-9] [ファイル]-[保存]で、ファイルを保存する
 [2-10] Compile Reportアイコン(マイナス虫眼鏡アイコンの横にあるトンカチがあるアイコン)押下で、コンパイルする
      (これをしなくて、はまってしまう。。。) '''
   => コンパイルがうまくいくと、テンプレート「sampleTemplate.jrxml」ができる
http://www.thinkit.co.jp/images/tech/4/4/1.gif
 [3] JavaBeanを通して、PDF出力 

 [3-1] iReport内にある以下のJarをコピーし、Eclipseに組み込む
  + commons-beanutils-1.8.0.jar
  + commons-collections-3.2.1.jar
  + commons-digester-1.7.jar
  + commons-logging-1.1.jar
  + iText-2.1.0.jar
  + jasperreports-3.7.0.jar
  + jdt-compiler-3.1.1.jar

 なお、上記JARは「C:\Program Files\Jaspersoft\iReport-nb-3.7.0」で検索掛ければ、
見つかるが、以下のJARはネットからDownloadすること
 + iTextAsian.jar

 [3-2] サンプルの「SampleMain.java」を参考に、ソースを組む
 [3-3] 実行すれば、PDFが作成される

サンプル

Person.java

package beans;

public class Person {
	private String name;
	private int age;
	
	// Constructor
	public person() {
	}
	public person(String name) {
		this.name = name;
	}
	public person(int age) {
		this.age = age;
	}
	public person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// Getter & Setter
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}
}

SampleMain.java

package sample;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import beans.person;

public class SampleMain {
	public static void main(String args[]) {
		List<Person> list = new ArrayList<Person>();
		
		// データをBeanに格納する
		for(int i = 0; i < 5; i++) {
			// Java Beanのオブジェクトを作る
			Person bean = new Person();
			// データをBeanに格納する
			bean.setName("Mike");
			bean.setAge(20 + i);
			// データを格納したBeanをListに格納する
			list.add(bean);
		}

		
		//iReportで作ったjasperファイルのパス
		String jasperPath = ".\\template\\sampleTemplate.jasper";
		String pdfOutputPath = ".\\template\\output.pdf";
		
		try {
			// Listからデータソースを作成
			JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list);
			// jasperファイルにデータを動的にバインド
			JasperPrint print = JasperFillManager.fillReport(jasperPath, null, ds);
			// jasperファイルからPDFファイルを作成
			JasperExportManager.exportReportToPdfFile(print, pdfOutputPath);
		} catch (Exception ex) {
			System.out.println(ex);
		}
	}
}

エラーについて

『Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException』というエラーが出たら...

原因

 + [2-4] を行っていない可能性あり。確認して、コンパイルし直してみる価値あり。