在 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。