JasperReport那些事儿(五)——再说表名目报表
副标题#e#
上一篇文章就有人评论说Jasperreport不适合中国式报表。我就很奇怪了,我从来没说Jasperreport适合中国式报表(虽然我也没说不适合)。我写文章的初志就是分享技能,东西这种对象历来是以需求为导向的,符合就用,不符合没钱买好的,也拼集用用。可是措施员往往是没权去抉择那些事儿的,措施员应该是一群能用有限的资源去办理问题的人,况且开源产物利用本钱和进修本钱都较量低,不消白不消。要一些人看着刺目或打着打告白的心态,我就劝你别看,方正我是会继承写下去的。扯远了,回到正题吧。
最近博客留言有问怎么做“单位格归并的报表”,单看这界说,无从下手啊,我也不知道我领略的意思对差池,上礼拜做了一个我领略的“单位格归并的报表,但愿和那位留言的博友的意思有一点重合就好了。看一下结果吧。
数据源布局:
<?xml version="1.0" encoding="utf-8" ?>
<DepartmentList>
<list>
<Department>
<name>行政部</name>
<personList>
<person>
<age>35</age>
<gender>男</gender>
<name>张三</name>
</person>
</personList>
</Department>
<Department>
<name>技能部</name>
<personList>
<person>
<age>30</age>
<gender>男</gender>
<name>李四</name>
</person>
<person>
<age>28</age>
<gender>女</gender>
<name>王五</name>
</person>
</personList>
</Department>
</list>
</DepartmentList>
#p#副标题#e#
都说中国的报表是大表中有小表,这其实和干系数据库的表格观念有很大的差异。干系数据库的表格是简朴的二维表格,不会在表格里再嵌套表格。那碰着这范例的表格应该怎么处理惩罚呢?我在前面的文章有讲怎么建造简朴的二维表格,所以这篇主要是办理表格前面的单位格归并的问题。
这里还要借助子报表,子报表是Jasperreport最为强大的成果,也是最具扩展性的成果组件(纯粹小我私家意见)。
做这样的表格我是用了三个报表模板。
第一个,DepartmentList.jrxml.(编译后为jasper后缀名)
第二个,DepartmentList_department.jrxml.
第三个,DepartmentList_department_person.jrxml.
挪用干系是第一个模板挪用第二个,第二个模板再挪用第三个。
DepartmentList.jasper.
|-DepartmentList_department.jasper.
|-DepartmentList_department_person.jasper.
在第二个报表给子报表通报数据源时,表达式要像下面这样写。这样写主要目标是选择当前department节点下的所有person节点。
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("/DepartmentList/list/Department["+$V{REPORT_COUNT}.intValue()+"]/personList/person")
REPORT_COUNT变量是指当前detail band内的计数器。譬喻,从父报表传过来的数据源的节点数是3,则REPORT_COUNT会从1到3遍历,detail band也会渲染3次。这里的XPATH是遍历了第一个到第三个Department下的所有person节点。
这里值得一提的是在第二张报表的部分谁人textfield里有个属性需要留意,Stretch Type配置为"relative to band height",就是让textfield自动往下延伸,延伸到与其地址的区域(band)沟通的高度。
说句实话,在Jasperreport内里处理惩罚表格简直是一件很贫苦的事(指以XML为数据源),像上文提到的表格是很简朴的例子,可是却要用到三个模板。并且Jasperreport报表是线性渲染(由上到下),所以无论从机动性和照旧效率来说,都比不上像Excel那种以表格为导向范例的报表东西。可是照旧那句话,东西这种对象历来是以需求为导向的,符合就用,不符合没钱买好的,也拼集用用。
措施员的一生其实可短暂了,这电脑一开一关,一天已往了,嚎;电脑一开不关,那就成处事器了,嚎……