Jasper帳票PDF出力備忘メモ　~ 複数のリストによる帳票出力 ~


https://qiita.com/yuuman/items/c2129e93202a49bd0287

上記記事の続き

前回の帳票PDF出力では、`JRBeanCollectionDataSource`を利用してListに格納された値をJasperテンプレートに埋め込んで帳票出力を行っていたが、今回は複数のListをテンプレートに埋め込む方法について検証したのでその時の内容を備忘メモとして残す。

基本的には[こちら](https://zetcode.com/jasperreports/multipledatasources/)に記載されている内容の通りである。

また、コードの実装例などは大幅に省略しているので細かいことは前回の記事を参照すること

# Jasper側の実装

## 1. データセット/パラメータの作成
 
`Outline`で右クリックを選択し、`Create Dataset`を選択すると下記画面が表示されるので必要事項を入力しデータセットを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/bf2dd2d2-32ab-e02d-003e-8d351dd789b1.png)

* Dataset name：データセット名を入力
* Data Adapter：「New Data Adapter -Collection of JavaBeans」を選択

`Outline`上に作成した`Dataset1`が表示されるので、`Dataset1`の`Fields`を右クリックで`Create Field`を選択し、フィールドを作成する。

* Field01
  * Name： name　
  * Class：java.lang.String
* Field02
  * Name： parameter
  * Class：java.lang.String

次に`Outline`から`Parameters`を選択しパラメータを追加する。

設定値は下記の通りである。

* Name：datasource1
* Class：java.util.List


XMLでは下記の設定となる。

```xml
<!-- データセット定義 -->
<subDataset name="Dataset1">
  <field name="name" class="java.lang.String"/>
  <field name="parameter" class="java.lang.String"/>
</subDataset>

<!-- パラメータ定義 -->
<parameter name="datasource1" class="java.util.List"/>
```

## 2. Listの作成

`Palette`から`List`を選択し、データセットとして先ほど作成した`Dataset1`を指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/c7957b14-d1a5-94f6-6004-848035f2b14d.png)

Connectionでは「Use a JRDatasource expression」を選択し、下記設定を指定する。

`$P{datasource1}`には上で作成したパラメータ名を指定すること。

```java
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{datasource1})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/4a39ef7b-3513-9903-c0c0-3168d5e5dcdd.png)

List fieldsで`Dataset1`のフィールドを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/aa306ce0-dc7c-b5f3-948e-420f85023dd9.png)

List作成後、下図の`List`を選択するとリスト部の編集画面が表示されるの文字幅やフォントなど細かな設定を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/0b046b16-0977-e9a1-0775-6ad92247d7a1.png)

以上の作業を行った場合、XMLでは下記の設定となる。

```xml
  <componentElement>
    <reportElement x="261" y="65" width="100" height="30" uuid="46944fc3-2ae0-4385-9dc2-8f347b76c260"/>
    <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
      <datasetRun subDataset="Dataset1" uuid="53aa30da-b1f7-4221-b76c-a72666e1a6f9">
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{datasource1})]]></dataSourceExpression>
      </datasetRun>
      <jr:listContents height="30" width="100">
        <textField>
          <reportElement x="0" y="0" width="50" height="30" uuid="ac884e55-7578-4e95-aea3-955a56ee00aa"/>
          <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
        </textField>
        <textField>
          <reportElement x="50" y="0" width="50" height="30" uuid="5e8b1136-3781-41e0-bfdc-7e32fed0e30c"/>
          <textFieldExpression><![CDATA[$F{parameter}]]></textFieldExpression>
        </textField>
      </jr:listContents>
    </jr:list>
  </componentElement>
```


# Java側の実装

新たなリスト項目として下記Entityクラスを用意する。

```java:Entiry.java
@Getter
@Setter
public class Entity{

    private String name;

    private String parameter;

}
```

帳票出力処理として下記を実装する。

```java
//Entityクラスのリストを準備
List<Entity> entityList= new ArrayList<>();
Entity entity01 = new Entity();
entity01.setName("Test User01");
entity01.setParameter("Parameter01");
entityList.add(entity01);

Entity entity02 = new Entity();
entity02.setName("Test User02");
entity02.setParameter("Parameter02");
entityList.add(entity02);

//parameterMapの作成
HashMap<String, Object> parameterMap = new HashMap<String, Object>();
parameterMap.put("datasource1", entityList);

//前回同様JasperFillManagerでparameterMapを渡す
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameterMap, jrBeanCollectionDataSource);
JasperExportManager.exportReportToPdfFile(jasperPrint, "jasper.pdf");
```

# 出力結果
これらの設定後、PDF出力を実行した結果が下図である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/7e87b347-e292-2b1d-e766-a446179d1f7f.png)