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
相关产品推荐
相关产品推荐

