上記記事の続き
前回の帳票PDF出力では、JRBeanCollectionDataSource
を利用してListに格納された値をJasperテンプレートに埋め込んで帳票出力を行っていたが、今回は複数のListをテンプレートに埋め込む方法について検証したのでその時の内容を備忘メモとして残す。
基本的にはこちらに記載されている内容の通りである。
また、コードの実装例などは大幅に省略しているので細かいことは前回の記事を参照すること
Jasper側の実装
1. データセット/パラメータの作成
Outline
で右クリックを選択し、Create Dataset
を選択すると下記画面が表示されるので必要事項を入力しデータセットを作成する。
- 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では下記の設定となる。
<!-- データセット定義 -->
<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
を指定する。
Connectionでは「Use a JRDatasource expression」を選択し、下記設定を指定する。
$P{datasource1}
には上で作成したパラメータ名を指定すること。
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{datasource1})
List fieldsでDataset1
のフィールドを選択する。
List作成後、下図のList
を選択するとリスト部の編集画面が表示されるの文字幅やフォントなど細かな設定を行う。
以上の作業を行った場合、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クラスを用意する。
@Getter
@Setter
public class Entity{
private String name;
private String parameter;
}
帳票出力処理として下記を実装する。
//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出力を実行した結果が下図である。