最近些日子一直在研究报表生成的模块,用的是jasperreport,用ireport来设计报表模板,涉及到后台像子报表传递参数。
后台采用的是springmvc+spring+spring data jpa,
在后台向子报表传递map参数时的步骤是:
1.在Parameters添加一个同后台传递到子报表map同名的parameter
2.设置subMap的属性
3.设置子报表的属性
Parameters Map Expression属性填写$P{subMap},
(tips:此项只能用来向子报表传递普通的参数,比如string类型参数subparam)
1
2
3
|
Map<Object, Object> subMap =
new
HashMap<Object, Object>();
subMap.put(
"subparam"
,
"subparam display"
);
|
Connection type属性选择Use a datasource expression
(tips:此项向子报表传递数据集,即List类型等可迭代的集合类型参数)
然后再Data Source Expression中填写
1
2
|
new
net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(((Map<String,List>)$P{subMap})
.get(
"persons1"
))
|
我的后台代码是
1
2
3
4
5
6
7
|
Map<Object, Object> mainMap =
new
HashMap<Object, Object>();
List<Persons> persons1 = (
new
PersonsFactory()).getPersons();
subMap.put(
"persons1"
, persons1);
mainMap.put(
"subMap"
, subMap);
|
其中困扰了我很久的一点就是,按照高洪岩写的《Jasperreports + ireport报表开发详解》书中data source expression属性填写的格式为
1
|
new
net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{subMap}.get(
"persons1"
))
|
如此填写的后果实jasper文件编译无法通过,会报错
说object类型没有get()方法,而且Parameters参数类型中没有map类型,
只能选择父类型object,所以我把Object参数$P{subMap}强制转换为Map<String,List>,再去获取其中的List,
1
|
((Map<String,List>)$P{subMap}).get(
"persons1"
)
|
编译不报错,成功编译完成,
子报表map中List<Persons>也可以正常传递显示。