SpringでのJasperReports
1. 概要
JasperReportsは、PDF、HTML、XLSなどの多くの形式で印刷またはエクスポートできるピクセル単位のレポートをユーザーが作成できるようにするオープンソースのレポートライブラリです。
この記事では、その主要な機能とクラスについて説明し、その機能を紹介するための例を実装します。
2. メーベン依存
まず、jasperreportsの依存関係をpom.xmlに追加する必要があります。
net.sf.jasperreports
jasperreports
6.4.0
このアーティファクトの最新バージョンはhereにあります。
3. レポートテンプレート
レポート設計は、JRXMLファイルで定義されます。 これらは、JasperReportsエンジンが解釈できる特定の構造を持つ通常のXMLファイルです。
ここで、JRXMLファイルの関連する構造のみを見てみましょう。これは、私たちの主な焦点であるレポート生成プロセスのJava部分をよりよく理解するためです。
従業員情報を表示する簡単なレポートを作成しましょう。
3.1. レポートの編集
レポートエンジンでデータを入力できるように、JRXMLファイルをコンパイルする必要があります。
JasperCompilerManagerクラスを使用してこの操作を実行してみましょう。
InputStream employeeReportStream
= getClass().getResourceAsStream("/employeeReport.jrxml");
JasperReport jasperReport
= JasperCompileManager.compileReport(employeeReportStream);
毎回コンパイルするのを避けるために、ファイルに保存できます:
JRSaver.saveObject(jasperReport, "employeeReport.jasper");
4. 人口を増やす レポート
コンパイルされたレポートを入力する最も一般的な方法は、データベースのレコードを使用することです。 これには、データを取得するためにエンジンが実行するSQLクエリをレポートに含める必要があります。
まず、レポートを変更してSQLクエリを追加しましょう。
...
それでは、簡単なデータソースを作成しましょう。
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:employee-schema.sql")
.build();
}
これで、レポートに入力できます。
JasperPrint jasperPrint = JasperFillManager.fillReport(
jasperReport, null, dataSource.getConnection());
レポートはまだパラメータを受け取っていないため、2番目の引数にnullを渡していることに注意してください。
4.1. パラメーター
パラメータは、データソースで見つからないレポートエンジンにデータを渡す場合や、異なるランタイム条件に応じてデータが変更される場合に役立ちます。
また、レポート入力操作で受け取ったパラメーターを使用して、SQLクエリの一部または全体を変更することもできます。
まず、次の3つのパラメータを受け取るようにレポートを変更しましょう。
// ...
それでは、titleパラメータを表示するタイトルセクションを追加しましょう。
// ...
...
次に、minSalaryパラメータとconditionパラメータを使用するようにクエリを変更しましょう。
SELECT * FROM EMPLOYEE
WHERE SALARY >= $P{minSalary} AND $P!{condition}
conditionパラメータを使用する場合は構文が異なることに注意してください。 これは、パラメータを標準のPreparedStatementパラメータとして使用するべきではなく、そのパラメータの値が元々SQLクエリに書き込まれたかのようにエンジンに通知します。
最後に、パラメータを準備してレポートに記入しましょう。
Map parameters = new HashMap<>();
parameters.put("title", "Employee Report");
parameters.put("minSalary", 15000.0);
parameters.put("condition", " LAST_NAME ='Smith' ORDER BY FIRST_NAME");
JasperPrint jasperPrint
= JasperFillManager.fillReport(..., parameters, ...);
parametersのキーは、レポートのパラメーター名に対応していることに注意してください。 エンジンがパラメータの欠落を検出した場合、パラメータのdefaultValueExpressionから値を取得します(存在する場合)。
5. エクスポート中
レポートをエクスポートするには、まず、必要なファイル形式に一致するエクスポータークラスのオブジェクトをインスタンス化します。
次に、以前に入力したレポートを入力として設定し、結果のファイルを出力する場所を定義します。
必要に応じて、対応するレポートを設定し、構成オブジェクトをエクスポートして、エクスポートプロセスをカスタマイズできます。
5.1. PDF
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(
new SimpleOutputStreamExporterOutput("employeeReport.pdf"));
SimplePdfReportConfiguration reportConfig
= new SimplePdfReportConfiguration();
reportConfig.setSizePageToContent(true);
reportConfig.setForceLineBreakPolicy(false);
SimplePdfExporterConfiguration exportConfig
= new SimplePdfExporterConfiguration();
exportConfig.setMetadataAuthor("example");
exportConfig.setEncrypted(true);
exportConfig.setAllowedPermissionsHint("PRINTING");
exporter.setConfiguration(reportConfig);
exporter.setConfiguration(exportConfig);
exporter.exportReport();
5.2. XLS
JRXlsxExporter exporter = new JRXlsxExporter();
// Set input and output ...
SimpleXlsxReportConfiguration reportConfig
= new SimpleXlsxReportConfiguration();
reportConfig.setSheetNames(new String[] { "Employee Data" });
exporter.setConfiguration(reportConfig);
exporter.exportReport();
5.3. CSV
JRCsvExporter exporter = new JRCsvExporter();
// Set input ...
exporter.setExporterOutput(
new SimpleWriterExporterOutput("employeeReport.csv"));
exporter.exportReport();
5.4. HTML
HtmlExporter exporter = new HtmlExporter();
// Set input ...
exporter.setExporterOutput(
new SimpleHtmlExporterOutput("employeeReport.html"));
exporter.exportReport();
6. サブレポート
サブレポートは、別のレポートに埋め込まれた標準レポートにすぎません。
まず、従業員のメールを表示するレポートを作成しましょう。
それでは、従業員レポートを変更して、前のレポートを含めましょう。
コンパイルされたファイルの名前でサブレポートを参照し、それにidEmployeeと現在のレポート接続をパラメーターとして渡すことに注意してください。
次に、両方のレポートをまとめましょう。
InputStream employeeReportStream
= getClass().getResourceAsStream("/employeeReport.jrxml");
JasperReport jasperReport
= JasperCompileManager.compileReport(employeeReportStream);
JRSaver.saveObject(jasperReport, "employeeReport.jasper");
InputStream emailReportStream
= getClass().getResourceAsStream("/employeeEmailReport.jrxml");
JRSaver.saveObject(
JasperCompileManager.compileReport(emailReportStream),
"employeeEmailReport.jasper");
レポートに入力してエクスポートするためのコードを変更する必要はありません。
7. 結論
この記事では、JasperReportsライブラリのコア機能について簡単に説明しました。
データベースのレコードを使用してレポートをコンパイルし、取り込むことができました。パラメータを渡して、さまざまなランタイム条件に応じてレポートに表示されるデータを変更し、サブレポートを埋め込み、最も一般的な形式にエクスポートしました。
この記事の完全なソースコードはover on GitHubにあります。