在 JasperSoft Studio 报告中显示具有特定格式的 ArrayList 参数
Displaying an ArrayList parameter with a certain format in JasperSoft Studio report
我是 Jaspersoft Studio 的新手,所以我想知道是否可以执行以下操作:
问题
对于我在 Jaspersoft Studio 中的报告,我从 java class 传递参数,其中一个参数是一个 ArrayList,其中包含如下信息:
ArrayList<String> benefits = new ArrayList<String>();
benefits.add("benefit_1");
benefits.add("benefit_2");
benefits.add("benefit_3");
benefits.add("benefit_4");
在我的报告中,我需要显示这样的信息:
- Benefit: benefit_1
- Benefit: benefit_2
- Benefit: benefit_3
- Benefit: benefit_4
此 ArrayList 的项目数量可变,因此有时有 4 个,有时只有 2 个,依此类推
如何在报表中遍历此列表并以这种格式输出?
我试过的
通过阅读其他 Whosebug 问题,我尝试添加一个以 ArrayList 作为数据源的子报表:
<subreport>
<reportElement ... />
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{benefits})]]></dataSourceExpression>
<subreportExpression><![CDATA["benefits.jasper"]]></subreportExpression>
</subreport>
但是在子报表中,ArrayList 元素如何显示?
或者是否可以在没有子报表的情况下完成我想做的事情?
好吧,我不知道如何让它与我在问题中提到的 ArrayList 一起工作。我最终不得不将它从字符串的 ArrayList 更改为 HashMaps 的 ArrayList:
ArrayList<HashMap> benefits = new ArrayList<HashMap>();
// quick and easy, though not optimal, way of adding HashMaps for testing
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_1");}});
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_2");}});
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_3");}});
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_4");}});
然后我像这样更新了主报告中的代码:
<subreport>
<reportElement ... />
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRMapCollectionDataSource($P{benefits})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{TEMPLATE_DIR}+"benefits.jasper"]]></subreportExpression>
</subreport>
基本上,我不得不使用 JRMapCollectionDataSource
,而不是 JRBeanCollectionDataSource
。
最后我创建了名为 "benefits" 的子报表,只使用这样的详细信息带:
<detail>
<band height="14" splitType="Stretch">
<textField>
<reportElement ... />
<textElement>...</textElement>
<textFieldExpression><![CDATA["- Benefit: "+$F{benefit}]]></textFieldExpression>
</textField>
</band>
</detail>
$F{benefit}
使用 ArrayList 内部的 HashMap 中的键来获取正确的值。这就是为什么我不能使用简单的字符串 ArrayList。
我是 Jaspersoft Studio 的新手,所以我想知道是否可以执行以下操作:
问题
对于我在 Jaspersoft Studio 中的报告,我从 java class 传递参数,其中一个参数是一个 ArrayList,其中包含如下信息:
ArrayList<String> benefits = new ArrayList<String>();
benefits.add("benefit_1");
benefits.add("benefit_2");
benefits.add("benefit_3");
benefits.add("benefit_4");
在我的报告中,我需要显示这样的信息:
- Benefit: benefit_1
- Benefit: benefit_2
- Benefit: benefit_3
- Benefit: benefit_4
此 ArrayList 的项目数量可变,因此有时有 4 个,有时只有 2 个,依此类推
如何在报表中遍历此列表并以这种格式输出?
我试过的
通过阅读其他 Whosebug 问题,我尝试添加一个以 ArrayList 作为数据源的子报表:
<subreport>
<reportElement ... />
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{benefits})]]></dataSourceExpression>
<subreportExpression><![CDATA["benefits.jasper"]]></subreportExpression>
</subreport>
但是在子报表中,ArrayList 元素如何显示?
或者是否可以在没有子报表的情况下完成我想做的事情?
好吧,我不知道如何让它与我在问题中提到的 ArrayList 一起工作。我最终不得不将它从字符串的 ArrayList 更改为 HashMaps 的 ArrayList:
ArrayList<HashMap> benefits = new ArrayList<HashMap>();
// quick and easy, though not optimal, way of adding HashMaps for testing
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_1");}});
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_2");}});
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_3");}});
benefits.add(new HashMap<String, String>(){{put("benefit","benefit_4");}});
然后我像这样更新了主报告中的代码:
<subreport>
<reportElement ... />
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRMapCollectionDataSource($P{benefits})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{TEMPLATE_DIR}+"benefits.jasper"]]></subreportExpression>
</subreport>
基本上,我不得不使用 JRMapCollectionDataSource
,而不是 JRBeanCollectionDataSource
。
最后我创建了名为 "benefits" 的子报表,只使用这样的详细信息带:
<detail>
<band height="14" splitType="Stretch">
<textField>
<reportElement ... />
<textElement>...</textElement>
<textFieldExpression><![CDATA["- Benefit: "+$F{benefit}]]></textFieldExpression>
</textField>
</band>
</detail>
$F{benefit}
使用 ArrayList 内部的 HashMap 中的键来获取正确的值。这就是为什么我不能使用简单的字符串 ArrayList。