JasperReports:将一个列表的列表作为数据源传递

3
我需要填充几个子报表,这些报表都是关于不同对象的列表。假设我有以下内容: 子报表1: 已使用车辆 子报表2: 新车
我创建了一个车辆Bean类,其中变量为字符串,并创建了getter和setter方法。接着,在数据源中,我将一个 List<List<String>> 作为detailRows传入。detailRows 包含新车和已使用车辆的列表。因此,我传递 detailRows 到数据源中。 问题是如何将这两个列表传递给两个子报表?我可以使用 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{newVehiclesList}) 作为子报表1的数据源, new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{usedVehiclesList}) 用作子报表2的数据源吗? 除了我提到的之外,还需要做些什么吗?我需要创建并传递任何变量吗?我上面列出的列表的使用是否正确,还是应该使用 $F{detailRows}.get(0)
我在主报表中创建了一个类型为list的字段 detailRows。然后将以下内容传递到子报表数据源表达式中,new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{detailRows} 有没有办法将 detailRows 中的 newVehiclesList 传递给子报表?
谢谢!
3个回答

6
选择你的子报表,可以将属性“连接类型”设置为“使用数据源表达式”,在属性“数据源表达式”内设置如下内容:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{yourFieldHere})

在这里,“yourFieldHere”是一个列表(不要忘记在字段属性中设置“字段类”为java.util.List)


感谢您的回复。我主要困惑的是如何将集合中的单个列表传递给特定的子报表。在上面的例子中,我的数据源包括detailRows,它是newVehiclesList和usedVehiclesList的集合。我该如何将newVehiclesList传递给新车子报表? - user1486984
让我看看我是否理解正确,你有一个List<List<?>>吗?如果是的话,你可以完全按照我的答案所说的那样做,只是你需要两个子报告。 - Diego Urenia
是的,我明白了。所以你建议我首先创建一个字段并将其类型设置为集合,然后在第一个子报表下创建第二个子报表,并创建一个字段并将其类型设置为列表?此外,我正在使用一个bean,第二个子报表将具有与bean属性相同的字段吗? - user1486984
你有一个名为detailRows的提供者(它是一个包含两个列表的列表),它是一个列表,你是从Java中传递它的,对吗? - Diego Urenia
是的先生,那是我在数据源中设置并传递给“fillreport”的内容。 - user1486984

1

好的,那么您需要使用Field类作为java.util.List创建两个字段,一个用于newVehiclesList,另一个用于usedVehiclesList。

把您的两个子报表放在您想要的位置,然后依次执行以下步骤:

将“连接类型”更改为“使用数据源表达式”,然后将“数据源表达式”更改为new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{yourField})

完成。

附:为了在newVehiclesList和usedVehiclesList中使用字段,您必须在它们自己的子报表中创建它们。


我尝试了,但没有起作用,这是我做的...所以detailRows是一个包含newVehicles和usedVehicles(定义为字符串字段的bean的列表)的列表。在主报表中,我创建了一个字段detailRows(作为列表),并通过数据源new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{detailRows})传递数据。然后在子报表中,我创建了另一个字段newVehicles,并将其作为数据源 - new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{newLeads}).. 然后在子子报表中,我创建了一个字段, - user1486984
你在这里犯了一个错误:“在主报告中,我创建了一个字段,detailRows(作为列表)并通过数据源传递。” 如果它是你的主要来源,则应通过你的Java代码传递它,没有必要将其创建为主报告中的一个字段。 只有你的“SubSources”newVehicles和usedVehicles需要字段。 - Diego Urenia
顺便提一下,在我的子报告中(不是子子报告引用豆类的属性字段),我确实引用了该列表。 - user1486984
当你说“sub sub”时,你是指什么?有三个层次吗? - Diego Urenia
不需要这个字段,因为当您通过Java代码设置提供程序时,它会被存储,然后您可以使用 $P{REPORT_DATA_SOURCE} 获取它,然后像这样使用它:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{REPORT_DATA_SOURCE})。应该可以正常工作。 - Diego Urenia
显示剩余17条评论

0
我曾经和你一样遇到了同样的问题,我使用jasper中的List标签来解决了它,我在我的java类中使用了数据源。例如: parameter.put("MyList", new JRBeanCollectionDataSource(ListObjects)); 在JRXML中
在Jasper的工具箱中,选择LIST标签并将其拖放到你的报表中, 之后选择:
  • 创建新数据集
  • 从连接中创建新数据集...
  • 在数据适配器中选择新的数据适配器- javabean集合
  • 使用JRDatasource表达式
  • 进入参数列表并选择你的对象列表(MyList)
现在转到jasper的大纲中 - 数据集属性 - 编辑和查询过滤... ... - JavaBean - 搜索你的类(我使用的是eclipse,所以搜索起来很容易) - 添加要使用的字段

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接