天天看点

Jasper report 用json数据源创建的子报表在主报表中不显示

上篇写到用json数据源创建的子报表在主报表中竟然不显示,原因是需要在主报表中传递子报表的数据源。

先配置下Subreport 的 Data Source Expression属性试一下:

 new net.sf.jasperreports.engine.JREmptyDataSource()

Jasper report 用json数据源创建的子报表在主报表中不显示

OK,果然显示出来了,数据是空的,因为我们就是给它配置的空数据源。

Jasper report 用json数据源创建的子报表在主报表中不显示

说明就是数据源的问题,那我们再考虑怎么把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、修改主报表的数据源

Jasper report 用json数据源创建的子报表在主报表中不显示
Jasper report 用json数据源创建的子报表在主报表中不显示

可以发现,主报表的fields中多了两个test1、test2字段,这就是子报表的数据源。

Jasper report 用json数据源创建的子报表在主报表中不显示

3、修改子报表的 Data Source Expression

Jasper report 用json数据源创建的子报表在主报表中不显示
Jasper report 用json数据源创建的子报表在主报表中不显示

子报表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")

修改完毕,预览下效果:

Jasper report 用json数据源创建的子报表在主报表中不显示

ok,这是我们想要的效果,目的达到了。

其实,对于这种不需要根据主报表的某些字段值去加载表格内容的,没有必要使用子报表的方式。可以采用table表格实现,下一篇我们看下多个table怎么实现吧~