上篇写到用json数据源创建的子报表在主报表中竟然不显示,原因是需要在主报表中传递子报表的数据源。
先配置下Subreport 的 Data Source Expression属性试一下:
new net.sf.jasperreports.engine.JREmptyDataSource()

OK,果然显示出来了,数据是空的,因为我们就是给它配置的空数据源。
说明就是数据源的问题,那我们再考虑怎么把json的数据源传递过来就可以啦。
一个报表只能绑定一个数据源,那我们就把子报表的json数据整合到主报表的json文件中试试呗。
原来的3个json文件:
detail.json
{
"data":[
{
"topic":"我就是可爱的topic",
"serialNo":"A98K-002-001",
"isImport":"true",
"isChecked":"false",
"noReason":"之所以没选中,是为了测试"
}
],
success:true
}
test1.json
{
"data":[
{
"field1":"我是field1-row1",
"field2":"我是field2-row1",
"field3":"我是field3-row1",
"field4":"我是field4-row1",
"field5":"我是field5-row1"
},
{
"field1":"我是field1-row2",
"field2":"我是field2-row2",
"field3":"我是field3-row2",
"field4":"我是field4-row2",
"field5":"我是field5-row2"
},
{
"field1":"我是field1-row3",
"field2":"我是field2-row3",
"field3":"我是field3-row3",
"field4":"我是field4-row3",
"field5":"我是field5-row3"
}
],
success:true
}
test2.json
{
"data":[
{
"name":"MISS李",
"tel":"12345678",
"email":"[email protected]"
},
{
"name":"MISS张",
"tel":"12345679",
"email":"[email protected]"
},
{
"name":"MISS王",
"tel":"12345689",
"email":"[email protected]"
}
],
success:true
}
把主报表、子报表的数据源合并到一起,成为新的details.json文件:
{
"data":{
"topic":"我就是可爱的topic",
"serialNo":"A98K-002-001",
"isImport":"true",
"isChecked":"false",
"noReason":"之所以没选中,是为了测试",
"test1":[
{
"field1":"我是field1-row1",
"field2":"我是field2-row1",
"field3":"我是field3-row1",
"field4":"我是field4-row1",
"field5":"我是field5-row1"
},
{
"field1":"我是field1-row2",
"field2":"我是field2-row2",
"field3":"我是field3-row2",
"field4":"我是field4-row2",
"field5":"我是field5-row2"
},
{
"field1":"我是field1-row3",
"field2":"我是field2-row3",
"field3":"我是field3-row3",
"field4":"我是field4-row3",
"field5":"我是field5-row3"
}
],
"test2":[
{
"name":"MISS李",
"tel":"12345678",
"email":"[email protected]"
},
{
"name":"MISS张",
"tel":"12345679",
"email":"[email protected]"
},
{
"name":"MISS王",
"tel":"12345689",
"email":"[email protected]"
}
]
}
}
数据整合完毕,开始修改报表。
1、创建新的Data Adapters——details
2、修改主报表的数据源
可以发现,主报表的fields中多了两个test1、test2字段,这就是子报表的数据源。
3、修改子报表的 Data Source Expression
子报表1:((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("test1")
子报表2:((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("test2")
修改完毕,预览下效果:
ok,这是我们想要的效果,目的达到了。
其实,对于这种不需要根据主报表的某些字段值去加载表格内容的,没有必要使用子报表的方式。可以采用table表格实现,下一篇我们看下多个table怎么实现吧~