ireport 合并行

效果

    数据源结构:
<? 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 >

    都说中国的报表是大表中有小表,这其实和关系数据库的表格概念有很大的不同。关系数据库的表格是简单的二维表格,不会在表格里再嵌套表格。那遇到这类型的表格应该怎么处理呢?我在前面的文章有讲怎么制作简单的二维表格,所以这篇主要是解决表格前面的单元格合并的问题。
    这里还要借助子报表,子报表是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那种以表格为导向类型的报表工具。但是还是那句话,工具这种东西向来是以需求为导向的,合适就用,不合适没钱买好的,也凑合用用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值