【问题标题】:JasperReports: Passing in a list of lists as a datasourceJasperReports:将列表列表作为数据源传递
【发布时间】:2017-05-05 21:57:37
【问题描述】:

我需要用不同对象的列表填充一些子报表。基本上可以说我有以下几点:
二手车子报告
新车子报告

我创建了一个带有变量作为字符串的车辆 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)

我在主报告中创建了一个字段 detailRows 作为类型列表。然后我将以下内容传递给子报表数据源表达式new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{detailRows} 有什么办法可以将 newVehiclesList 从 detailRows 传递到子报告?

谢谢!

【问题讨论】:

    标签: list jasper-reports


    【解决方案1】:

    选择您的子报表,您可以将“连接类型”属性设置为“使用数据源表达式”,并在“数据源表达式”属性中进行设置:

    new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{yourFieldHere})
    

    您的“yourFieldHere”是一个列表(不要忘记将字段属性中的“Field Class”也设置为 java.util.List)

    【讨论】:

    • 感谢您的回复。我主要困惑的是如何将单个列表从列表集合传递到特定的子报告。在上面的例子中,我的数据源由 detailRows 组成,它是 newVehiclesList 和 usedVehiclesList 的集合。如何将 newVehiclesList 传递给新车子报告?
    • 让我看看我是否明白,你有 List> 吗?如果你这样做,你可以完全按照我在回答中所说的那样做,除了你需要两个 subReports。
    • 是的,我愿意。所以第一个子报表你建议我创建一个字段并使其类型为集合,然后是第二个子报表,在第一个子报表下我创建一个字段并使其类型为列表?另外,我正在使用一个 bean,第二个子报表将具有与 bean 中的属性相同的字段??
    • 您有一个名为 detailRows 的提供程序(它是一个包含两个列表的列表),这是一个列表,您从 java 传递它,对吧?
    • 是的先生,这就是我在数据源中设置的内容并将其传递给填充报告。
    【解决方案2】:

    好的,那么您需要创建两个字段,其字段类为 java.util.List,每个列表一个(newVehiclesList 和 usedVehiclesList)。

    将您的两个子报表放在您想要的任何位置,然后单击每个子报表,执行以下步骤:

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

    完成。

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

    【讨论】:

    • 我试过了,但没有用,这就是我所做的......所以 detailRows 是一个包含 newVehicles 和 usedVehicles 的列表列表(字段定义为字符串的 bean 列表)。在主报告中,我创建一个字段 detailRows(作为列表)并通过数据源 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{detailRows}).. 然后在子报告中我创建另一个字段newVehicles 并作为数据源传递 - new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{newLeads}).. 然后在子报表中创建字段,
    • jasperVehicleId(我的 JasperVehicle bean 中的一个属性)并尝试显示相同的内容。我收到消息,JRException:从 bean 检索字段值时出错:detailRows ..知道我做错了什么吗?
    • 您在这里犯了一个错误:“在主报告中,我创建了一个字段,detailRows(作为列表)并通过数据源”。如果它是您的主要来源,它应该通过您的 java 代码传递,并且无需在您的主报告中将其创建为字段。只有您的“子来源”newVehicles 和 usedVehicles 需要字段。
    • 你是对的。我从主报告中删除了该字段,现在它运行良好,但没有打印任何内容。我将一个静态文本标签作为列名,并且只是在详细信息带中打印一个值(文本字段)以查看它是否有效并且没有打印任何内容。感谢您指出我的错误。
    • 顺便说一句,我确实检查了我的 detailRows,它确实包含两条记录,所以我没有传递空数据源,com.edmunds.dwh.jasperreports.JasperDealerVehicle@33c282a1,com.edmunds.dwh.jasperreports。 JasperDealerVehicle@270e3293]
    【解决方案3】:

    我和你有同样的问题,我使用 jasper 的标签列表解决了它,我在我的 java 类中使用了数据源,例如: parameter.put("MyList", new JRBeanCollectionDataSource(ListObjects)); 在 JRXML 中

    在 Jasper 的面板中,选择标签 LIST 并拖放到您的关系中 选择后

    • 创建新数据集
    • 从连接创建新数据集... ...
    • 在数据适配器中选择新的数据适配器 - javabeans 集合
    • 使用 JRDatasource 表达式
    • 进入参数列表并选择列出操作对象 (MyList)

    现在转到 jasper 的轮廓和 - 数据集属性 - 编辑和查询过滤器...... - 爪哇豆 - 搜索你的班级(我使用eclipse,所以很容易搜索我的班级) - 添加要使用的字段

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多