You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jasper嵌套子报表数据赋值问题:仅单对象列表时生效

Jasper嵌套子报表数据对象配置方案

核心逻辑实现

要实现仅当列表只有1个对象时赋值,需在报表中通过$F{records}.size()判断集合长度,结合子报表的Print When Expression控制显示。


1. 主报表配置

数据来源设置

  • 主报表数据源直接绑定传入的List<CompanyData> companyList,设置数据源类型为JavaBean Collection Data Source,类名填写实际包路径下的CompanyData(如com.yourpackage.CompanyData)。
  • 主报表字段映射:
    • companyCode:字段类型java.lang.String,表达式$F{companyCode}
    • companyName:字段类型java.lang.String,表达式$F{companyName}
    • records:字段类型java.util.List,表达式$F{records}

子报表1(公司列表)嵌入设置

  • 在主报表中添加子报表组件,设置子报表的Print When Expression为:
    $F{records}.size() == 1
    
  • 子报表数据源传递:将当前CompanyData的records集合作为子报表1的数据源,表达式为:
    new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{records})
    

2. 子报表1(公司列表)配置

数据来源设置

  • 数据源类型为JavaBean Collection Data Source,类名填写实际包路径下的CompanyReportData。
  • 绑定CompanyReportData中需要展示的字段(如分支机构名称、代理商ID等),根据实际类属性配置。

子报表2(分支机构&代理商详情)嵌入设置

  • 在子报表1中添加子报表组件,传递当前行的下级集合作为数据源(假设CompanyReportData包含List<BranchData> branches属性):
    new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{branches})
    
  • 无需额外判断,子报表1仅在records.size() == 1时打印,子报表2自然仅在符合条件时加载。

3. 子报表2(分支机构&代理商详情)配置

  • 数据源类型为JavaBean Collection Data Source,类名填写对应下级数据类(如com.yourpackage.BranchData)。
  • 绑定需要展示的详情字段,完成布局即可。

关键注意事项

  • 确保所有JavaBean的属性提供getter方法,Jasper依赖getter读取数据。
  • 子报表的Print When Expression必须设置在子报表组件属性中,而非字段或文本框,避免无效渲染。
  • 若需主报表仅在companyList长度为1时显示内容,可给主报表细节带设置Print When Expression:
    $P{REPORT_DATA_SOURCE}.size() == 1
    

内容的提问来源于stack exchange,提问作者Viduranga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:10:15