上篇寫到用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怎麼實作吧~