上一篇文章就有人评论说Jasperreport不适合中国式报表。我就很奇怪了,我从来没说Jasperreport适合中国式报表(当然我也没说不适合)。我写文章的初衷就是分享技术,工具这种东西向来是以需求为导向的,合适就用,不合适没钱买好的,也凑合用用。但是程序员往往是没权去决定那些事儿的,程序员应该是一群能用有限的资源去解决问题的人,何况开源产品使用成本和学习成本都比较低,不用白不用。要一些人看着刺眼或打着打广告的心态,我就劝你别看,方正我是会继续写下去的。扯远了,回到正题吧。
    最近博客留言有问怎么做“单元格合并的报表”,单看这定义,无从下手啊,我也不知道我理解的意思对不对,上星期做了一个我理解的“单元格合并的报表,希望和那位留言的博友的意思有一点重合就好了。看一下效果吧。

数据源结构:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><? 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节点 。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->((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那种以表格为导向类型的报表工具。但是还是那句话,工具这种东西向来是以需求为导向的,合适就用,不合适没钱买好的,也凑合用用。
     报表模板及数据源点这里 下载。

JasperReport那些事儿(五)——再说表格式报表相关推荐

  1. 五种主流web报表工具的功能对比

    公司在做项目时,需要用到报表工具,经过我们对一系列市场上主流报表工具的考察.综合评定,以及到部分报表工具厂商实地考察.我们最终选择了更为专业,和适合我们开发的报表工具,以下是我们在前期选择报表工具时的 ...

  2. 如何将网格式报表打印成其它样式

    我们经常要打印报表,也遇到打印上的麻烦,比如有时候我们不想严格按照报表上面的样式,根据实际应用可能有别的样式更适合,这时候怎么办呢,其实报表软件是可以设置,今天我就带大家来了解一下! 1. 问题描述 ...

  3. 【Kettle】如何输出固定格式报表

    我的工作是为公司分析部门提供数据,其中一部分是固定时间点提取的报表,这些报表的格式固定,每次机械化的修改参数→提取数据→复制粘贴,实在是繁琐.下面介绍一个我工作中使用kettle输出固定格式报表的例子 ...

  4. 实验五 单表查询(V2.0版)

    实验五 单表查询 [实验目的] 1. 掌握单表的列的查询 2. 掌握单表的行的查询 [实验内容] 1. 实验前准备,SC数据库的创建.   (见参考资料1) 2. 查询的理论基础 命令: 1) Sel ...

  5. GraphPad Prism的八种数据表格式

    GraphPad Prism的数据表格式将决定可以制作何种图表以及可以执行何种分析.选择数据表格式可以让GraphPad Prism创建一张适合于您数据的数据表,并且可以轻松创建您想要的图表类型并执行 ...

  6. 强化学习理论基础(MDP、值函数与贝尔曼公式以及表格式Agent)

    强化学习理论基础(MDP.值函数与贝尔曼公式以及表格式Agent) 前言 一.MDP策略与环境模型 二.值函数与贝尔曼公式 1. 值函数 2. 贝尔曼公式 三.表格式Agent 1. 概念介绍 2. ...

  7. RBP中新增自由格式报表资源之自由格式风格

    RBP的资源中心模块提供了新建资源的自由格式报表功能,本文将简单介绍一下RBP中如何使用自由格式报表的jsp入口中的自由格式风格. 进入RBP资源中心模块的某个目录,点击新增资源图标,打开新增资源设置 ...

  8. java错误信息表_java报表

    java报表``` java报表``` 请问一些关于报表的考察代码````请``各位英雄``相助```谢谢搜索更多相关的解决方案: java"target="_blank" ...

  9. 个人永久性免费-Excel催化剂功能第49波-标准数据结构表转报表样式结果

    中国的企业信息化,已经过去了20年,企业里也产生了大量的数据,IT技术的信息化管理辅助企业经营管理也已经得到广泛地认同,现在就连一个小卖部都可以有收银系统这样的信息化管理介入. 但同时也有一个很现实的 ...

  10. 表格式计算机教案模板,2014表格式教案模板.doc

    表格式教学设计模版 教学设计表 学科? 数学? 授课年级??六? 学校??温县番田镇刘谢村小学? 教师姓名 张高峰 章节名称平面图形的周长和面积计划 学时一课时学习内容分析本节内容是九年义务教育六年制 ...

最新文章

  1. OpenDDS安装与开发
  2. Android基础_数据存储
  3. 那些年做的学术公益-你不是一个人在战斗
  4. 全选反选JavaScript实现
  5. Spring装配Bean的过程
  6. asp.net core 使用 signalR(一)
  7. c语言程序综合实习学生成绩,C语言程序设计综合实习报告
  8. python如何分别控制2个相同的窗口_Python入门到精通(2):使用Python计算数学算式...
  9. jquery中each_如何在jQuery中使用each()
  10. 字符串属性和函数的使用
  11. scikit-learn 算法的通用形式
  12. Java CookBook(一)
  13. Cadence OrCAD Capture交叉参考报表生成方法图文教程
  14. cpu224xp生产方案
  15. Ubuntu18.04设置阿里源
  16. 钢笔墨水能否代替打印机墨水_喷墨打印机该用染料墨水还是颜料墨水?
  17. MBR20200CT-ASEMI肖特基二极管MBR20200CT
  18. 《数据结构》课程介绍
  19. 2018 年的第一次福利
  20. NVMe-MI协议解读

热门文章

  1. mac 下 Parallels Desktop 克隆虚拟机 product_uuid 相同
  2. 硬派健身——健身先健脑
  3. mysql将公历农历转换_SQL农历转换函数(显示中文格式,加入润月的显示)
  4. 奥布莱恩杯尘埃落定 人工智能立功了!
  5. 程序猿头头:数组应用(indexOf,includes,find,findindex)
  6. Word替换重复的内容
  7. 让微软起死回生之作:CEO纳德拉18年新书《刷新》
  8. linux 网络配置 nm_controlled,[转帖]NM_CONTROLLED的含义以及网卡配置参数
  9. ZigBee无线通信--BasicRF无线点对点通信
  10. MPI编程(3)—点对点通信(阻塞式MPI_Send/MPI_Recv和非阻塞式MPI_Isend/MPI_Irecv)