JasperReportsでレポートを作る
JasperReports は、レポートを設計して生成するための Java ライブラリです。レイアウトは `.jrxml` テンプレートに書き、データはデータベースや Java オブジェクトから流し込み、結果を PDF、Excel、HTML に書き出します。この記事では、テンプレートの構造と、行のリストからレポートを作るコードを紹介します。
テストに関する注意:この記事を書いたコンピューターには JasperReports ライブラリがないため、ここではコードを実行していません。プロジェクトのドキュメントに従って依存関係を追加し、自分でテストしてください。
必要なもの
- JDK 17 以上
- Maven 経由の JasperReports ライブラリ(例:`net.sf.jasperreports:jasperreports`)
- Jaspersoft Studio などのデザイナー(ドラッグ&ドロップでテンプレートを作れます)
仕組み
手順1:テンプレートを設計する
`.jrxml` ファイルは、データフィールド、ヘッダー、明細行、フッターを定義する XML です。フィールドの例:
<field name="name" class="java.lang.String"/>
<field name="score" class="java.lang.Integer"/>
`<detail>` バンドに、`$F{name}` と `$F{score}` を参照する `textField` を追加して、各行の値を表示します。
手順2:データを準備してレポートを作る
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.List;
import java.util.Map;
public class ReportDemo {
public static class Row {
private final String name;
private final int score;
public Row(String name, int score) { this.name = name; this.score = score; }
public String getName() { return name; }
public int getScore() { return score; }
}
public static void main(String[] args) throws Exception {
List<Row> rows = List.of(new Row("สมชาย", 85), new Row("สมหญิง", 72));
JasperReport report = JasperCompileManager.compileReport("scores.jrxml");
JasperPrint print = JasperFillManager.fillReport(report, Map.of(), new JRBeanCollectionDataSource(rows));
JasperExportManager.exportReportToPdfFile(print, "scores.pdf");
}
}
- `compileReport` は `.jrxml` を実行可能な形式に変換します。
- `fillReport` はテンプレートとデータを組み合わせます。
- `exportReportToPdfFile` は PDF を書き出します。
よくあるミス
- **フィールド名がゲッターと一致しない:** 名前は完全に一致させる必要があります。
- **タイ語のフォントが表示されない:** テンプレートとシステムの両方で、タイ語に対応したフォントを指定します。
- **文字コードの設定漏れ:** `.jrxml` ファイルとコード内の文字列が UTF-8 であることを確認します。
次のステップ
科目ごとの合計を出すグループをレポートに追加する、学校名をパラメーターとして渡す、などを試してください。
まとめ
JasperReports はレイアウトとデータを分けます。テンプレートが見た目を定義し、コードがデータを流し込み、必要な形式に書き出します。これにより、主要なコードに触れずにレポートのレイアウトを変えられます。