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] を行っていない可能性あり。確認して、コンパイルし直してみる価値あり。