1概要


[JasperReports

は、PDF、HTML、およびXLSを含むさまざまな形式で印刷またはエクスポートできるピクセル単位のレポートを作成できる、オープンソースのレポートライブラリです。

この記事では、その主な機能とクラスを調べ、その機能を紹介するための例を実装します。


2 Mavenの依存関係

まず、

jasperreports

依存関係を

pom.xml

に追加する必要があります。

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.4.0</version>
</dependency>

このアーティファクトの最新バージョンはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22net.sf.jasperreports%22%20AND%20a%3A%22jasperreports%22[にあります。ここに]。


3レポートテンプレート

レポートデザインはJRXMLファイルで定義されています。これらはJasperReportsエンジンが解釈できる特定の構造を持つ通常のXMLファイルです。

ここでは、JRXMLファイルの関連構造のみを見てみましょう。レポート生成プロセスのJava部分をよく理解するために、これが私たちの主な焦点です。

従業員情報を表示する簡単なレポートを作成しましょう。

<jasperReport ... >
    <field name="FIRST__NAME" class="java.lang.String"/>
    <field name="LAST__NAME" class="java.lang.String"/>
    <field name="SALARY" class="java.lang.Double"/>
    <field name="ID" class="java.lang.Integer"/>
    <detail>
        <band height="51" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression class="java.lang.String">
                  <![CDATA[$F{FIRST__NAME}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression class="java.lang.String">
                  <![CDATA[$F{LAST__NAME}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="200" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression class="java.lang.String">
                  <![CDATA[$F{SALARY}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>


3.1. レポートの編集

レポートエンジンがそれらをデータで満たすことができるように、JRXMLファイルはコンパイルされる必要があります。


JasperCompilerManager

クラスを使用してこの操作を実行しましょう。

InputStream employeeReportStream
  = getClass().getResourceAsStream("/employeeReport.jrxml");
JasperReport jasperReport
  = JasperCompileManager.compileReport(employeeReportStream);

毎回コンパイルするのを避けるために、ファイルに保存することができます。

JRSaver.saveObject(jasperReport, "employeeReport.jasper");


4

レポートを作成する**

コンパイル済みレポートを埋める最も一般的な方法は、データベースからのレコードを使用することです。これには、レポートにデータを取得するためにエンジンが実行するSQLクエリを含める必要があります。

まず、レポートにSQLクエリを追加します。

<jasperReport ... >
    <queryString>
        <![CDATA[SELECT **  FROM EMPLOYEE]]>
    </queryString>
    ...
</jasperReport>

それでは、簡単なデータソースを作成しましょう。

@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つのパラメータを受け取るようにレポートを修正しましょう。

<jasperReport ... >
    <parameter name="title" class="java.lang.String"/>
    <parameter name="minSalary" class="java.lang.Double"/>
    <parameter name="condition" class="java.lang.String">
        <defaultValueExpression>
          <![CDATA["1 = 1"]]></defaultValueExpression>
    </parameter>
   //...
</jasperreport>

それでは、

title

パラメータを表示するtitleセクションを追加しましょう。

<jasperreport ... >
   //...
    <title>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="238" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression class="java.lang.String">
                  <![CDATA[$P{title}]]></textFieldExpression>
            </textField>
        </band>
    </title>
    ...
</jasperreport/>

次に、

minSalary

および

condition

パラメータを使用するようにクエリを変更しましょう。

SELECT **  FROM EMPLOYEE
  WHERE SALARY >= $P{minSalary} AND $P!{condition}


condition

パラメーターを使用するときは、構文が異なることに注意してください。これは、そのパラメータを標準の

PreparedStatement

パラメータとして使用するべきではなく、あたかもそのパラメータの値がもともとSQLクエリで書き込まれたかのようにエンジンに伝えます。

最後に、パラメータを準備してレポートに記入しましょう。

Map<String, Object> 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("baeldung");
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. サブレポート

サブレポートは、他のレポートに埋め込まれた標準レポートにすぎません。

まず、従業員のEメールを表示するレポートを作成しましょう。

<jasperReport ... >
    <parameter name="idEmployee" class="java.lang.Integer"/>
    <queryString>
        <![CDATA[SELECT **  FROM EMAIL WHERE ID__EMPLOYEE = $P{idEmployee}]]>
    </queryString>
    <field name="ADDRESS" class="java.lang.String"/>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="156" height="20"/>
                <textElement/>
                <textFieldExpression class="java.lang.String">
                  <![CDATA[$F{ADDRESS}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

それでは、前のレポートを含めるように従業員レポートを修正しましょう。

<detail>
    <band ... >
        <subreport>
            <reportElement x="0" y="20" width="300" height="27"/>
            <subreportParameter name="idEmployee">
                <subreportParameterExpression>
                  <![CDATA[$F{ID}]]></subreportParameterExpression>
            </subreportParameter>
            <connectionExpression>
              <![CDATA[$P{REPORT__CONNECTION}]]></connectionExpression>
            <subreportExpression class="java.lang.String">
              <![CDATA["employeeEmailReport.jasper"]]></subreportExpression>
        </subreport>
    </band>
</detail>

サブレポートをコンパイル済みファイルの名前で参照し、

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ライブラリーのコア機能について簡単に説明しました。

データベースからのレコードでレポートをコンパイルして生成することができました。さまざまな実行時条件に従ってレポートに表示されるデータを変更し、サブレポートを埋め込み、最も一般的な形式にエクスポートするためのパラメータを渡しました。

この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-all[Githubに掲載]にあります。