JasperReports 中文用户手册


JasperReports 用户说明书 (中文版) ----By 2010 级电商研 姚海波 樊偿、钟健权 何瑜瑾、赵雪兰 李向涛、秦 雷 JasperReport 用户说明书 2 目录 目录________________________________________________________________ 2 序言________________________________________________________________ 4 第 1 章 JasperReport 简介 ____________________________________________________ 5 1. JasperReport 是什么 _______________________________________________________________5 1.1 JasperReports 基本操作步骤 ______________________________________________________6 1.1.1 下载 ________________________________________________________________________6 第 2 章 数据报表设计 _______________________________________________________ 7 2.1 iReport 使用简介 _________________________________________________________________7 2.1.1 iReport 介绍 ___________________________________________________________________7 2.1.2 iReport 的安装 _________________________________________________________________7 2.1.3 运行 Ireport ___________________________________________________________________8 2.1.4 使用报表向导_________________________________________________________________8 2.1.5 使用 iReport 设计报表模板 __________________________________________________ 14 2.2 使用 ireport 来实现报表的设计 ________________________________________________ 26 2.3 Jrxml 文件设计 ________________________________________________________________ 30 第 3 章 JapserReports 数据填充 _____________________________________________ 35 3.1 数据填充概述 ________________________________________________________________ 35 3.2 报表查询(Report Query) __________________________________________________ 39 第 4 章 数据报表导出 ______________________________________________________ 43 4.1 查看报表(Viewing Reports)__________________________________________________ 43 4.2 打印报表 _____________________________________________________________________ 45 4.3 导出报表 _____________________________________________________________________ 46 第 5 章 范例 _______________________________________________________________ 49 5.1 报表设计 _____________________________________________________________________ 49 5.2 数据填充 _____________________________________________________________________ 49 JasperReport 用户说明书 3 5.3 报表导出 _____________________________________________________________________ 50 第 6 章 JasperReport 与 struts2 的整合________________________________________ 51 6.1 环境准备 _____________________________________________________________________ 51 6.2 生成*.jasper 文件 _____________________________________________________________ 51 6.3 在 struts.xml 文件中的配置_____________________________________________________ 51 参考资料 __________________________________________________________________ 51 附 API 表 _________________________________________________________________ 52 JasperReport 用户说明书 4 序言 JasperReports 是一个强大、灵活的报表生成工具,能够展示丰富的页面内容, 并将之转换成 PDF,HTML,或者 XML 格式。它有一个相关的开源工程—IReport, 这是一个图形化的辅助工具,主要用于数据报表设计。JasperReports 完全是由 Java 写成,可以应用于 Java 的应用程序,包括 J2EE,Web 应用程序中生成动态 内容,它主要目的是辅助生成面向页面的(page oriented),准备付诸打印的文 档。总的而言,JasperReports 主要分成三个部分,包括数据报表设计、数据填充 与数据报表导出。 图 0-1 JasperReport 用户说明书 5 第 1 章 JasperReport 简介 在讨论 jasperReport 之前先介绍下 Ireport. Ireport 是个工具,用它可以方便 的生成报表,比如可以动态链接数据库生成报表,也可以在 SQL 语句中输入参数, 提取指定的数据生成报表。用 ireport 生成报表最终会产生两种文件 jsxml 和 jasper 文件。其中 jsxml 可以认为是 XML 文件,用来定义报表格式的,比如报表 头是什么内容,报表体有哪些列等等,jasper 是由 jsxml 编译生成的二进制文件, 用来产生报表。所以如果有 jsxml 文件,我们就定义好了报表的格式,现在还缺 一个就是数据源了,用来填充报表。比如数据源我们可以连接数据库得到。 综上所述,jasper 定义报表格式 + 数据源 = 最终生成的报表。 1. JasperReport 是什么 JasperReport 是一个免费、开源的纯 JAVA 报表工具和引擎,功能很强大。 她可以支持多种数据源,支持 Bean 作为数据源(支持 Hibernate)、Connection 作 为数据源、xml 记录集数据源、ResultSet 作为数据源,等等。她可以很灵活地设 计普通报表、主细表、交叉报表。也可以很方便地将报表的结果导出成 pdf、excel、 rtf、html 等等的格式。 该库完全由 Java 写成,可以用于在各种 Java 应用程序,包括 J2EE,Web 应 用程序中生成动态内容。它的主要目的是辅助生成面向页面的(page oriented), 准备付诸打印的文档。JasperReport 借由定义于 XML 文档中的 report design 进行 数据组织。这些数据可能来自不同的数据源,包括关系型数据库,collections, java 对象数组。通过实现简单的接口,用户可以将 report library 插入到订制好的 数据源中。 说白了 jasperReport 是一个 JAR 包,里面有很多 API 供我们调用,用来生成 报表。其实 Ireport 工具内部就调用了 jasperReport 的 API 生成报表。 那为什么我们有了 Ireport 这么好的工具还要 jasperReport 呢? 1.Ireport 是一个客户端工具,如果要生成报表,用户必须装它,必须知道 怎么用它。 2. Ireport 中带参数的SQL语句,如果改变筛选条件,用户必须自己去改变SQL, 这对不懂 SQL 的用户是不可能做到的 所以我们可以利用 jasperReport 这个工具包,自己写程序来生成自己需要的 报表。同理,用 jasperReport 生成报表,也要 jasper 定义报表格式 + 数据源, 如果你很懂 jasper 规范的话,你可以自己写 jsxml 文件,完全脱离 Ireport 工具。 但这种实在是走了很多弯路。所以我们可以借助 Ireport 帮我们生成 jsxml 文件, 然后利用 jasperReport 这个工具包编程生存报表。 JasperReport 用户说明书 6 1.1 JasperReports 基本操作步骤 1.1.1 下载 JasperReport 和 iReport 的资源,最新版本可以到官方网站1得到 如果希望 JasperServer 管理报表和资源,在 Windows 平台,可以到 SourceForge.net 下载 jasperserver-1.2.1-windows-installer.exe 版本 。这 个版本里 面 包括 了:MySQL 5/Tomcat 5/J2SDK 5/JasperReport 1.2.1/IReport 1.3.2[2]。 1.1.2 安装 1)JDK 的安装,并配置 JAVA_HOME。比如我的 JAVA_HOME 路径如下: JAVA_HOME D:\Program Files\j2sdk1.4.2_03 2)由于中文的问题,所以还需要下载:itext-1.02b.jar 和 iTextAsian.jar 包 下载地址:http://itext.sourceforge.net/downloads/iTextAsian.jar 并在 CLASSPATH 中设置 例如我们的 CLASSPATH 如下: CLASSPATH E:\ProgramFiles\ApacheGroup\Tomcat4.1\webapps\testreport\WEB-INF\lib\itext -1.02b.jar; E:\ProgramFiles\ApacheGroup\Tomcat4.1\webapps\testreport\WEB-INF\lib\iTex tAsian.jar;E:\Program Files\ApacheGroup\Tomcat4.1\webapps\testreport\WEB-INF\lib; D:\tools\iReport0.2.3\lib 3)iReport 的安装 iReport 只要解压就 OK,如果没有安装 Ant,可以直接在 iReport 下的 noAnt 目录下, 运行 startup.bat 就可以了,这样 iReport 就可以启 动了 4)JasperReport Jasperreport 不需要任何配置,你只需将下载以后的 jar 包放到 classpath 下即可 5)数据库的 JDBC 驱动包,加入到 CLASSPATH 中 1.1.3 编译报表、导出结果。 这对于 iReport 是比较容易使用的。这样一来就得到报表的结果——这里是 输出一个 pdf 文件。 如果有数据源,就是更改 JasperFillManager.fillReport() 的第三个参数为实际的数据源即可。 * 版本说明: JASPERREPORT 目前已经出到 jasperreport3.7.6,总共有好几十个版本,本次 我们安装的是 jasperreport3.7.5 版本。 1 iReport 官方网站:http://ireport.sourceforge.net。JasperReport 官方网站: http://jasperreports.sourceforge.net。 JasperReport 用户说明书 7 第 2 章 数据报表设计 为了生成一个报表,用户需要首先生成报表的设计,生成方法或采用直接编 辑 XML 文件,或用 JasperAssistant 或 iReport 等 GUI 工具来实现。用户通过使用 IReport 设计好报表后,得到一个 XML 文件(以.jrxml 结尾的),编译后生成 jasper 文件(以.jasper 结尾),最终要使用的是编译后的*.jasper 文件。在 iReport 中新建一 报表,报表有 title、pageHeader、columnHeader、detail、columnFooter、pageFooter、 lastPageFooter、summary 等部分,被成为 Report section。 title:顾名思义是指报表的标题,它会显示在报表的最上面,如果有多页只 会出现在第一页的最上面。 pageHeader:每页的标题,如果有多页每页的开始都会显示此部分内容。 columnHeader:显示报表的列头不经常使用。 detail:报表的具体内容。 有 header 就会出现 footer,lastPageFooter 只会出现在最后一页。summay 会 出现在每一页数据上,主要是为了展示一些统计信息,比如当前的时间,页数信 息。 2.1 iReport 使用简介 2.1.1 iReport 介绍 iReport 是一个能够创建复杂报表的开源项目。它是 100%使用 Java 语言编写。 是目前全球最为流行的开源报表设计器。 由于它是丰富的图形界面,你能够很快创建出任何一种你想要的报表。iReport 是开源报表引擎 JasperReport 的可视化设计工具。它具有一下几个突出功能:  拖拽式,所见即所得的报表编辑器;  多样的向导来简化复杂的报表设计任务;  支持所有有效的数据源,如 JDBC、CVS 等等;  报表模板与报表库样式管理;  源文件的备份。 2.1.2 iReport 的安装 在相关网站下载 iReport,直接解压后,将 J2SDK\lib 目录下的 tool.jar 拷贝到 iReport\lib 目录下,然后再 iReport 目录下运行 iReport.bat 即可。这里需要注意 的是 tool.jar 的版本必须与本机安装的 jre 一致,也就是说,如果系统安装的是 jre1.4.2 就必须用 jdk1.4.2 的 tools.jar。 JasperReport 用户说明书 8 2.1.3 运行 Ireport  直接在桌面双击 iReport 图标即可,如下图: 图 2-1-1  然后进入 iReport 设计主界面,如下图所示: 图 2-2 2.1.4 使用报表向导 我将以一个简单报表的制作来讲解 IReport 制作报表时的一些常用项。 选择菜单中“文件”——>“New”(如下图所示): JasperReport 用户说明书 9 图 2-1-3 进入报表设计的向导程序(如下图所示),在向导程序中可以选择报表模板, 其它的(如风格、图表等)目前都不能用,我就选择“Blank A4”: 图 2-1-4 选择“Launch Report Wizard”,系统引导你下一步(如下图所示)。在这一步 中在”Report Name“中输入报表的文件名,”Location“中指定报表文件存储目录。 JasperReport 用户说明书 10 图 2-1-5 选择“下一步”按钮,系统引导你配置数据源模式(如下图所示),在这里系 统默认提供两种数据源模式“Empty DataSource”和“Sample Database(HSQLDB test)”,我在这里新建一个自己的数据源模式——“Javabean DataSource”。 图 2-1-6 JasperReport 用户说明书 11 新建新的数据源很简单,可以点击”New“按钮,在下图中可以选择适合的数 据源模式。 图 2-1-7 可以支持的数据源类型很多,如通过 JDBC 直接连接数据库的“Database JDBC connection”、通过 XML 作为数据源的“XML file datasource”、通过 Javabean 作为 数据源的“Javabeans set database”等等,我这里使用“Javabeans set database”数据 源,因此需要在上面界面中选中“Javabeans set database”选项。采用“Javabeans set database”作为数据源就是可以将普通的 Javabean 作为数据来源,通过程序构建 Javabean,将其赋给报表,然后报表取出 Javabean 中的数据进行显示。这里的 Javabean 只要支持 set 和 get 方法就可以了。选择“Next>”按钮,界面如下: JasperReport 用户说明书 12 图 2-1-8 在 Name 中输入的是一个自定义的名称,如输入“Javabean Datasource”,这 个名称可以任意,是方便日后自己看到名称就能迅速理解数据源的类型。Factory Class 中输入的是一个用于在 IReport 中预览数据的类。在“The static method to call to retrive the array or the the collection”中输入的是在“Factory Class”中定义的类中 的一个静态方法的方法名。IReport 运行预览报表时会使用在“Factory Class”处定 义的类,并调用其在“The static method to call to retrive the array or the the collection”中定义的静态方法。然后选择“Save”按钮进行保存。 现在我们重新回到了报表向导界面,在“Connections / Data Source”的下列选择 项中选择我们刚刚建立的“Javabean Datasource”,直接选择”下一步“按钮,出现 如下界面: JasperReport 用户说明书 13 图 2-1-9 在这个界面中我们不做任何操作,直接选择”下一步“按钮,出现如下界面。 如果是选中了使用“Database JDBC connection”的数据源模式,此时会出现可以选 择的字段列表,只要将需要加入报表的字段选择到右边框中即可。 图 2-1-10 在这个页面上直接选择”下一步“按钮,出现如下界面。即使你的报表中需要 对某些字段进行分组,也可以在日后进行设置,这里可以忽略。 JasperReport 用户说明书 14 图 2-1-11 选择“完成”按钮,到此报表生成向导完成。并呈现如下界面: 图 2-1-12 2.1.5 使用 iReport 设计报表模板 前面我们已经介绍了 IReport 的开始,现在我们做一个例子。假设我们要做一 个会议通讯录的报表,要求按照参会人的单位分组显示,即同一个单位的参会人 员显示在一起,而且每个人占用一行,相邻两个人之间用不同的背景进行间隔。 要求在标题下面打印会议名称,会议名称通过参数传入。 首先你需要获得 Javabean 中的属性。通过在主界面中选择如下图所示图标, 图中用红圈圈住,并用红色箭头指向。 JasperReport 用户说明书 15 图 2-1-13 此时弹出 Report Query 窗口(如下图所示)。 图 2-1-14 选择“JavaBean Datasource”标签,在“Class name”中输入作为数据源的 Java 类,要求输入完整的类名,要包含包名。因为我建了一个叫做 report.CAddressList 的 Java 类(建立方法请看后篇),并且此类里面定义了 id、name、nationality、 phone、post、sex、unit 属性,因此输入完类名后直接点击“Read attributes”按钮 就可以获得类里面的这些属性了,选择需要加入报表的字段,然后点击“Add selected field(s)”按钮,将它们加入到窗口最下面列表中,最后选择“OK”按钮, 这些 Javabean 中的属性就加入到“Report Inspector”中的“Fields”节点下,如下图 所示: JasperReport 用户说明书 16 图 2-1-15 配置好数据源字段后,我们就来开始绘制报表,先要调出组件面板,在组件 面板上有很多用来绘制报表的控件,默认情况下组件面板是显示的,如果你的组 件面板没有显示,可以通过如下方法调出。 在主菜单“窗口”下选择“组件面板”(如下图所示),或者使用快捷键 “ctrl+shift+8”。 图 2-1-16 JasperReport 用户说明书 17 这时在屏幕右边(一般在这边)会出现如下图的面板区域。 图 2-1-17 在组件面板中可以选择绘制报表时需要的任何控件,例如线条、矩形框、静 态文本标题、图片等等。 下面我们首先绘制一个报表标题,在组件面板中选择“Static Text”,然后拖拽 它到报表设计器的 Page Header Band,并双击它编辑文字为“会 议 通 讯 录”,每个汉字自己使用空格做了一点间隔,好看而已,不是必须的。这样在报 表的每一页都将出现报表名称。如果你只是想在报表第一页显示报表名称,其它 页面上不显示,想想看如何处理?对了,将其放置在 Title Band 中就可以了。 我们将一个控件拖入报表设计器后,就可以在其中拖动位置来布局将来的显 示位置,IReport 是即看即所得的设计器,因此设计时你如何放置,显示时就是 如何显示的。 仅仅将控件拖入报表设计器还不能完全达到我们的目的,我们还需要设置其 属性,特别是对于显示的内容是中文的,而且将来要生成 PDF 文件的,设置相关 的属性就更加重要了。我们选中拖入的控件“Static Text”,这是打开其属性面板。 属性面板如果没有出现在主窗口中,可以同样在主菜单”窗口“中选择”属性“菜单 来打开,属性面板的界面如图: JasperReport 用户说明书 18 图 2-1-18 这里对于一个“Static Text”控件关键要设置如下几个属性: Font name:在其中选中“宋体”,为了保证报表将来在任何计算机上都可以正 常显示,最好使用统一的“宋体”,否则将来客户机器上没有这个特殊字体就会很 难看了。 Size:设置字体大小。因为此处是报表标题,因此我选用了大字体,选择 24。 Bold:设置字体为粗体。 Pdf Font name is now deprecated:在此选择“STSong-Light”。为了将来导出成 PDF 可以正常显示汉字。 Pdf Embedded:选中它。为了将来导出成 PDF 可以正常显示汉字。 Pdf Encoding:选择“UniGB-UCS2-H (Chinese Simplified)”。为了将来导出成 PDF 可以正常显示汉字。 Horizontal Alignment:选择“Center”。因为我将此"Static Text"的大小拖拽成合 页面一样宽。 Vertical Aligment:选择“Middle”。 最好效果如下图所示: 图 2-1-19 JasperReport 用户说明书 19 只要是涉及汉字的都要做如上设置,否则无法显示. 再选择四个“Static Text”控件放置在 Page Header Band 中,分别设置其文本内 容为“会议名称”、“第、页 ”“总、页”。并参考上面一样设置相关属性(这里略)。 打开“Report Inspector”面板。如果主窗口中没有此面板,还是到主菜单“窗口” 下,“Report Inspector”菜单即可“Report Inspector”面板如下图所示: 图 2-1-20 在这个面板中会分类列出“Style”、“Parameters”、“Fields”、“Variables”、“Scriptlets”、 “Table Dataset”、“Title”、“Page Header”、“Column Header”、“XXX Group Header”(如果 建立了分组就会出现它)、“Detail”、“XXXX Group Footer”(如果建立了分组就会出现它)、 “Column Footer”、“Page Footer”、“Last Page Footer”、“Summary”、“No Data”、“Background” 等节点。 因为按照需要,会议名称是通过参数传入的,因此我们需要在“Parameters”节点下面 建立一个名为“meeting_name”的参数。建立方法如下: 选中“Parameters”节点,鼠标右键,选择“添加 Parameter”菜单,系统将建立一个 “Parameter1”的参数。如下图: JasperReport 用户说明书 20 图 2-1-21 选中“Parameter1”(默认情况下自动选中的),查看其属性面板。修改“name” 属性为“meeting_name" 。修改“Parameter Class” 属性为“ava.lang.String” , “Parameter Class”属性就是用来指定参数的数据类型,在 IReport 中,属性的类型 都是 Java 的类。通过下列选择你需要的类型,也可以点击后面的“...”按钮直接输 入 java 类。可以输入的 java 类是任意的,可以是 Java JDK 中包含的任何类,也 可以是你定义的类。要使用自己定义的类,就必须将这些类所在的路径配置在 Classpath 中,配置方法参考前面描述。 现在我们回到“Parameters”的属性面板,在“Default Value Expression”属性中 可以填入此参数默认的初始值,因为此参数的数据类型都是 Java 的类,因此此 处要求如下这样写“new java.lang.String("江西省 XXX 公司年度大会")”,就是说要 new 一个对象出来,不管是 String 类型还是 Interger 类型或者其它什么类型。 在“Description”属性中填入的是对参数的描述,如填写成“会议名称”,这样 下次看到此参数时就可以指定此参数的用途了。 填写好的“meeting_name”的属性面板如下图所示: 图 2-1-22 添加页码和总页数。 页码和总页数通过展开“Report Inspector”面板中的“Variables”节点,并从中 拖拽就可以了。页码对应的变量是“PAGE_NUMBER”,其“Expression Class”是 “java.lang.Integer”,“Evaluation Time” 的值 是 “now”。 总 页 数对 应 的变 量 是 “PAGE_NUMBER”,其“Expression Class”是“java.lang.Integer”,“Evaluation Time”的 值是“report”。 “PAGE_NUMBER”是系统默认提供的,不需要我们手工建立。 JasperReport 用户说明书 21 到此我们的报表头已经绘制结束了,其布局如下图所示: 图 2-1-23 接下来我们来绘制报表体,因为需求中要求按照参会人所在单位进行分组,将同一 单位的参会人放在一起,因此我们先来建立一个分组。建立分组的方法如下: 选中“会议通讯录”,鼠标右键,选择“Add Report Group”菜单。如下图所示: 图 2-1-24 出现“New Group Wizard”向导窗口(如下图所示),在“Group name”中输入一 个用于表示本分组的名字,没有限制,我们这里输入“Unit Group”。选择“Group by the following report object”,并在下面的下列选择框中选择“unit”字段。“unit”字 段就是 Fields 中的。 JasperReport 用户说明书 22 图 2-1-25 建立好分组后在“Report Inspector”面板中就会多出“unit group Group Header 1”和“Unit Group Group Footer 1”两个节点。其中“unit group Group Header 1”是分 组的头,而“Unit Group Group Footer 1”分组的脚。它们中间就是“Detail Band”。 我们在“unit group Group Header 1”中放入矩形控件,放置方法是从组件面板 中选择矩形控件,然后拖入放置在适当的位置。放置矩形控件是为了制做报表的 边框、网格等。并放置一些静态文本“Static Text”控件和字段 unit。字段 unit 从 “Report Inspector”面板中的 Fields 中拖入。具体布局界面如下: 图 2-1-26 还为矩形控件设置了背景颜色。矩形控件设置背景颜色的方法是,选中矩形 控件,在其属性面板中修改“Backcolor”属性值。在字段 unit 外面也放置了一个矩 形控件,但没有设置它的背景颜色,因为默认的背景颜色是白色。 另外,为了当数据在换页后不重新显示本表头,因此我们需要做个设置,在 “Report Inspector”面板中选中“unit group Group Header 1”,在其属性面板中找到 “Reprint Header”,并设置其值为选中,这样当分组数据跨页时,在第二页会重新 打印表头。 下面将需要显示的字段如 id、name、post、sex、nationality、phone,依次从 “Report Inspector”面板中的 Fields 中拖入并对应放置在相应的表头下面。同时也 为每个字段都配置一个矩形用于描绘网格线。其配置效果如下图所示: JasperReport 用户说明书 23 图 2-1-27 其中姓名对应的是$F{name},职务对应的是$F{post},性别对应的是$F{sex}, 民族对应的是$F{nationality},联系电话对应的是$F{phone},签名下面对应的只 有一个矩形框。 序号的设想是每组的序号都会从 1 开始,因此我通过定义一个变量来实现。 选中“Report Inspector”面板中的“Variables”节点,鼠标右键,选择“添加 Variables” 菜单,如下图所示: 图 2-1-28 系统将在“Variables”节点新增一个“Variable1”,选中它,在属性面板中修改相 应属性。 修改 Name 属性值为“group inner number”; 修改 Variable Class 属性值为“java.lang.Integer”,此处的内容也必须是 Java 类, 可以是系统的类,也可以是自己定义的类; 修改 Calculation 属性值为“Nothing”,就是表明此字段不会自己增加。其可选 的值有“Count”、 “Distinct Count”、 “Sum”、 “Average”、 “Lowest”、 “Highest”、 “Standard Deviation”、 “Variance”、 “System”、 “First”;其中每种值的含义如下: 表 2-1 值 含义 Nothing 不做任何计算 Count 对记录集数进行循环累加,计算有多少条记录。 Distinct Count 对记录集数进行循环累加,计算有多少条记录。但忽略重复 记录,即某个值已经统计过此处就不再统计 Sum 累加某字段(必须是数字类型)的总和 Average 计算某字段(必须是数字类型)总和的平均值 Lowest 返回某字段的最小值 Highest 返回某字段的最大值 Standard Deviation 返回表达式的所有值的标准方差 JasperReport 用户说明书 24 Variance 返回表达式收到值的变化 System 不做任何计算也没有任何价值 First 修改 Reset type 属性值为“Group”。Reset type 属性可选的值有如下几种: 表 2-2 值 说明 none 任何时候不做重置操作 report 在报表创建时才进行变量初始化 page 在报表每页对变量进行初始化 column 在报表处理每个 Column 时就对变量进行初始化 group 报表每个分组对变量进行初始化 修改 Reset Group 属性值为“Unit Group"。 修改 Increment type 属性值为“Group”。其值可选同 Reset type 属性。 修改 Increment Group 属性值为“Unit Group”。 修改 Variable Expression 属性值为”$V{group inner number}。 修改 Initial Value Expression 属性值为“new Integer(0)"。 最终效果如下图所示: 图 2-1-29 接下来来建立一个 Scriptlets。选中“Report Inspector”面板中的“Scriptlets”节 点,鼠标右键,选择“添加 Scriptlet”菜单,如下图所示: JasperReport 用户说明书 25 图 2-1-30 系统自动建立“scriptlet1”,通过其属性面板修改相关的属性值。 修改 name 属性值为“group inner number”。 修改 Scriptlet Class 属性值为“report.CIntegerIncrement" 。 report.CIntegerIncrement 是我自己定义的一个 Java 类,具体定义请参考后续文档。 在 unit Group Group Footer Band 中放入二个静态文本,并从“Report Inspector” 面板中的“Variables”节点中拖入一个“Unit Group_Count”的字段。这个字段是建立 分组后由系统自动建立的,用于统计各个分组中记录数。其界面布局如下图所示: 图 2-1-31 到此,报表的设计工作结束,我们来预览一下,点击设计界面中的“Preview”, 就可以预览报表效果了。如图中红色圈中的部分: 图 2-1-32 报表设计完毕,通过点击编译图标来生产可分发的 jasper 文件,其操作如图 红色圈中部分: JasperReport 用户说明书 26 图 2-1-33 2.2 使用 ireport 来实现报表的设计 1)首先选择文件菜单,点击 new,然后选择纸张类型,就选择最常用的 A4;点击 launch report wizard;输入 report name 和文件存放的路径;一直点击 next 直至 finish。 图 2-2-1 2)进行完上一步之后会显示一张空表,本次演示只需要 page header,detail 1,summary 三个 band,因此删除不需要的 band。具体操作为在左侧的 report inspector 中,将鼠标置于 band 上点击右键,再点击 delete band,得到的表格如 下图所示: JasperReport 用户说明书 27 图 2-2-2 3)在 ireport 左边的有一个组件模板,将一个 frame 拖入 page header 中, 再将四个 static text 拖入 frame 中,同时给四个 static text 分别命名为 ID,Order Date,Ship City,Freight,将字体设置为 DejaVu Sans: 图 2-2-3 4)选中 frame,右侧有一个属性面板,在属性面板中设置 frame 的背景色和 位置等属性。 JasperReport 用户说明书 28 图 2-2-4 5)在 detail 1 中拖入四个 text field,分别命名为$F{ID},$F{OrderDate}, $F{ShipCity},$F{Freight},并将字体设置为 DejaVu Sans。 图 2-2-5 6)将一个 frame 拖入 summary 中,再将一个 static text 和两个 text field 拖 入 frame 中,将 static text 命名为 Total,text field 命名为$V{TotalFreight}和 $V{REPORT_COUNT};同时设置其字体和背景色。 JasperReport 用户说明书 29 图 2-2-6 7)在 field 中添加相应的字段,即 ID,OrderDate,ShipCity,Freight,添加 过程中都要注意大小写。 图 2-2-7 8)至此一个表格的设计基本完成,可以通过 xml 查看其代码,通过 preview 预览效果。 JasperReport 用户说明书 30 图 2-2-8 2.3 Jrxml 文件设计 报表模板是创建 JasperReport 报表的关键,报表模板是一个 XML 格式文件, 其后缀名为.Jrxml。一般的,模板文件都有报表头、表头、模板细节等几个部分 构成。 Jrxml 文件设计步骤  定义模板文件的 DTD 文档;  定义报表表头,在报表每个页面的开头都出现;  设计报表标题;  定义报表列表头部分;  定义报表细节部分(字段组织布局);  定义报表表尾,在报表每个页面的页尾都出现。  1)定义模板文件的 DTD 文档 当使用 XML 文件进行报表设计的时候,JasperReport 将使用内置的 DTD 文 件来验证其受到的 XML 内容的有效性。如果 XML 验证通过,则说明所提供的报 表设计符合 JasperReport 所需要的 XML 结构和语法规则,其引擎能够生成经过 编译的 report design。一般的,XML 报表设计的 DTD 引用如下所示: 2)定义报表表头 在介绍报表头之前,先了解下元素<jasperReport >、、 JasperReport 用户说明书 31 。 <jasperReport>它是 XML 报表设计的根元素,它可定义报表各个属性,如: 元素用于定义报表参数,参数值通过调用 JasperReports API 中 的相应方法以 java.util.Map 来提供,其定义如下: 元素用于定义从数据库获取数据的 SQL 查询,它在 parameter 之后,field 之前定义,其定义如下: 元素用于把数据源或查询获取的数据映射到报表模板。其定义如下: 元素用于包含显示在报表中的数据,前面介绍的每个元素都包含一个 元素作为它的子元素。 报表的表头在元素之间定义,它规定了报表每 个页面的表头的显示内容及其显示格式,下面是简单的报表表头设计: 3)设计报表标题 报表的标题在元素之间定义,它只在报表的开头出现一次, 下面的简单的报表表头设计: <band height="60"> <textField> <reportElement x="0" y="10" width="670" height="40"/> JasperReport 用户说明书 32 <textElement textAlignment="Center"> <font size="24"/> </textElement> <textFieldExpression class="java.lang.String"> <![CDATA[$P{reportTitle}]]> </textFieldExpression> </textField> </band> 在这段代码中: 元素用于显示非静态文本; 元素定义数据或文本在报表页面的显示方式,如位置和大小 等; 元素设置文本的字体显示格式,如字体大小、颜色等; 元素是报表的表达式,用来声明执行各种计算的报表变 量,进行报表的数据组织,定制/报表文本字段的内容或者进一步定制报表对象 的 appearance; 符号$P 表示在数据填充过程中,引入对应的参数值。 4)定义报表列表头部分 一般地,JasperReport 生成的页面都是有一列报表,当然你也可以生成超过 一列的报表,下图展示了拥有两列的报表: JasperReport 用户说明书 33 图 2-2-9 元素定义了报表的列表头,他在每页的列表头显示,它即 可显示静态文本也可显示动态文本。下面是简单的报表列表头设计: 元素用以定义一个矩形框; 元素用于显示静态文本。 5)定义报表细节部分 报表的细节部分在元素之间定义,数据源中数据在报表 JasperReport 用户说明书 34 中根据该部分定义的字段组织布局来显示。其简单定义如下: 符号$F 表示调用模板中定义的参数, 表示从数据源中引 入相应字段。 6)定义报表表尾 报表表尾在元素之间定义。这部分与开头的定 义报表表头相对应,它也只在报表的表尾只出现一次。简单定义如下: <./band> 这段代码中,符号$V 表示调用模板中定义的变量,一般用于函数计算。 JasperReport 用户说明书 35 第 3 章 JapserReports 数据填充 图 3-1 3.1 数据填充概述 报表数据填充是 JasperReports 最重要的功能,它体现了这个软件最主要的功 能,因为这一过程可以自由地操作数据集,以便产生高质量的文档。经过编译的 report-design 可以通过 JasperFileManager 类中 fillReportXXX()系列函数来填充数 据继而还产生报表。 各种fillReportXXX()其实都是对 JasperFileManager 中fillReport()函数的不同封 装,而 JasperFileManager::fillReport()又是对 JRFiller::fillReport()函数的封装。下 为 JasperFileManager::fillReport()的实现: ① public static JasperPrint fillReport( JasperReport jasperReport, Map parameters, Connection connection ) throws JRException { return JRFiller.fillReport(jasperReport, parameters, connection); } ② public static JasperPrint fillReport( JasperReport jasperReport, Map parameters, JRDataSource dataSource ) throws JRException { return JRFiller.fillReport(jasperReport, parameters, dataSource); } JasperReport 用户说明书 36 JRFiller 在进行数据填充前需要 3 个必要的参数,分别是一个 JasperReport 对象,参数(parameter),数据源(DataSource): 1) JasperReport 对象,JasperReport 对象是由在 design 阶段中将 JRXML 文件 进行 compile 得到的,这个过程可以由 JapserCompileManager 类提供的一系列 compileReportXXX() 函数来完成从而输出一个 *.jasper 文件或 JasperReport object。 2) 参数(parameters), fillReport 需要的 parameters 实际上是一个 Map 对象 的实例,它存储了 JRXML 文件中由 parameter 定义的字段名和其值。 例如,我们在 JRXML 文件中定义 则我们可以在 parameter 中 put 进相应的值: parameters.put("ReportTitle", "Address Report"); 参数表的存在意义在于它可以提供一些由 DataSource 不方便提供的数据例 如关于 JapserReports 自身的一些信息。关于 parameters 最有可能应用的地方是 它可以用来拼接 JRXML 文件中的 querystring 的 SQL,如: JapserReports 提供了一些内置参数: 表 3-1 REPORT_PARAMETERS_MAP 总是指向一个 java.util.Map 对象,该对象保存了用 户调用报表装填过程时传递给报表引擎的用户定的 参数。 REPORT_CONNECTION 指向一个 java.sql.Connection 对象,这个对象被提供 给报表引擎用来通过 JDBC 来执行 SQL 报表查询 REPORT_DATASOURCE 允许我们在报表表达式中或 scriptlet 中访问报表数 据源,而不论我们为什么要这么做。 REPORT_SCRIPTLET 即使报表不使用 scriptlet ,这个内置的参数仍将指 向一个 net.sf.jasper.engine.JRAbstracStriptlet 实例, 该实例实际是一个 net.sf.jasper.engine.JRDefaultScriptlet 对象。 3)数据源(DataSource), JasperReports 通过一个叫做 JRDataSource 的接口来 支持多种类型的数据源 JasperReport 用户说明书 37 当使用 JDBC 作为的数据源时,一个默认的对于该接口的实现 JRResultSetDataSource 类封装了一个 java.sql.ResultSet 对象。我们就可以创建一 个java.sql.Connection对象作为一个参数来参与JasperReports 的数据填充工作(正 如之前提到的 fillReport()函数的第三个参数),同时在 JRXML 文件中定义 SQL 。或者,直接创建一个 JRResultSetDataSource 对 象并向其提供一个由之前创建的 Connection 对象产生的 java.sql.ResultSet 对象。 当使用如(in-memory collections, arrays of JavaBeans, CSV or XML files),等其 他数据源时,我们要做的就是实现一个继承了 JRDataSource 接口的对象,又或 者直接使用 JasperRepReports 已经提供的实现 JRDataSource 接口的对象(就像 JRResultSetDataSource 类)。 实现 JRDataSource 接口,只需要实现两个方法: public Boolean next() throw JRException; public Object getFieldValue(JRField jrField) throw JRException 在报表装填的时候,next()方法将被报表引擎调用,迭代的从数据源中获取 数据。第二个方法用来为每个在当前数据源记录(data source record)中的报表 字段(report field)提供 value。如下图所示,JRResultSetDataSource, JREmptyDataSource, JRBeanCollectionDataSource, JRBeanArrayDataSource, JRTableModelDataSource 等都是实现 JRDataSource 接口的类。 图 3-2 应当知道,从数据源取得数据的唯一方法是使用 report field(接下来会介绍)。 一个数据源对象更像是一个二维表,表中含有数据。这个二维表的行是一条一条 的 record,而每一列都映射为一个 report field。所以我们可以在 report 表达式中 使用数据源。JasperReport 提供了一些缺省的 JRDataSource 实现,我们来具体看 一下: Class net.sf.jasper.engine.JRResultSetDataSource JasperReport 用户说明书 38 这是一个非常有用的缺省实现,因为它外覆(wrap)了 java.sql.ResultSet 对 象。由于多数报表的生成都采用关系数据库中存储的数据,所以这个类是被使用 得最为广泛的数据源对象。然而在以下的两种情况下您可以不必在装填过程中自 己生成这个对象: 如果你选择在你的报表中用SQL 查询来获得在关系数据库的某个table 中的 数据,报表引擎将会通过执行给定的 SQL 查询并且将返回的 java.sql.ResultSet 外 覆为一个 net.sf.jasper.engine.JRResultSetDataSource 实例来执行这项操作。引擎 唯一需要的是一个 java.sql.Connection 对象来执行查询操作。这时你可以提供 connection 对象来作为通用数据源对象(usual data source object)。例子有:jasper, scriptlet,subreport 和 query。当然你可以在应用程序中即 JasperReport 之外执 行 SQL 查询。这样的话,你可以手动的外覆 java.sql.ResultSet,再调用报表装填 过程之前实例化这个数据源对象。当使用这种类型的数据源的时候,你需要为在 result set 中的每一列生命一个 report field。report field 的名字和类型必须和列的 名字和类型匹配。 Class net.sf.jasper.engine.JREcptyDataSource 这个类主要用于当生成报表的数据不是来自数据源,而是来自参数或重要的 仅是数据源中 virtual records 的数量的时候。例子 fonts,images,shapes 和 unicode 都使用了这个类来装填报表,来模拟数据源中没有一条记录,所有字段都为 null 的情况。 Class net.sf.jasper.engine.data.JRTableModelDataSource 这个 JRDataSource 接口的缺省实现外覆了 javax.swing.table.TableModel 对 象,它可以用在 Java Swing 应用程序中从已经显示到屏幕上的 table 中得数据来 生成报表。--我喜欢。通常有两种方法来使用这种数据源:通常,为了要从中取 得数据,你需要为 javax.swing.table.TableModel 对象的每一列生命一个 report field。但是有些情况下会出现问题,比如 report field 的命名需要遵照 Java 命名 规范来声明变量,而 table 的列名则不需要。幸运的是,你仍然可以通过列的索 引而不是它的名字来将 report field 与列进行映射。例如,一个列名为“Produce Description”不可能被映射到名为“Produce Description”的 report field 上,因为 report field 名中含有空格,这将引起一个编译错误。但是如果你知道这个列示 table model 对象的第三列(index=2),那么你就可以命名相应的字段“COLUMN_2” 并无误地使用这一列的数据。 Class net.sf.jasper.engine.data.JRBeanArrayDataSource 这个类外覆了一个 JavaBeans 数组,并且通过反射来获取 report field 的值。 在这种数据源中,一个 JavaBean 对象描述了一条记录。如果我们有一个名为 “ProductDescription”的 report field,在获取这个字段的值的时候,程序将会试图 通过反射机制调用一个当前 JavaBeans 对象中]名为 getProductDescription()的方 法。对于 boolean 字段,当调用 get 前缀的属性不能返回其属性值的时候,程序 将会试图使用 is 前缀的方法来获得属性值。 JasperReport 用户说明书 39 Class net.sf.jasper.engine.data.JRBeanCollectionDataSource 这个类和上一个类非常类似,它也是使用反射机制和 JavaBean 命名规范,但 是它外覆了一个 java.util.Collection 对象而不是一个 JavaBean 对象数组。在 datasource 例子中你可以看到进一步的用法。 3.2 报表查询(Report Query) 在报表中,可以使用元素来引入查询。如果这个元素存在,则 出现在报表参数声明之后,报表 field 之前。 如下是一个 SQL 查询的例子: 为了更好的定制从数据库中取回的数据集(data set),一个重要的方面是在 报表查询字符串中报表参数的使用(use of report parameters)。在查询中,这些 参数可能会像动态过滤器(dynamic filter)一样工作,它们用特殊的语法被引入 进来为报表提供数据,很像 report expression。 如下有两种在查询中的使用参数的方法: ① 像通常的 java.sql.PreparedStatement 的参数那样使用,用如下语法: ② 有时,我们需要使用参数来动态更改 SQL 查询的某些部分,或将整个 SQL 查询作为参数提供给装填过程。在这种情况下,语法稍微有些不同,向下面的例 子,注意”!” 在这个例子中,这个引入了参数值得特殊的语法确定了我们为这些参数所提 供的值将会替代查询中的参数引用($P!{}的内容)。这些参数将被传给使用 java.sql.PrepqredStatement 对象的数据库服务器 事实上,报表引擎首先处理$P!{}参数引用,通过使用他们的值来获取最重的 SQL 查询,并且仅当这件事完成之后,引擎才会将剩下的普通的$P{}参数引用传 递给 usual IN parameters。 第二种用于 SQL 查询的参数引用允许你在运行期传递整个 SQL 查询语句: $P!{MySQLQuery} 注意:你不能在参数值中再加入参数引用,也就是说,参数引用不能嵌套使 用。更详细的信息可以参看工程所带的例程:jasper,subreport,scriptlet,webapp 以及最有学习价值的 query 字段(Field) 报表字段是从数据源到报表设计的数据映射的唯一途径。你可以应用报表字 段在 report 表达式中使用数据源中的数据,或获得所需的输出。一旦定义了报 表字段,你需要在报表填充的时候确认你所提供的数据源中提供了所有你声明的 fields。 例如,如果你使用 JRResultSetDataSource 作为数据源,你需要确定在 SQL 查 询结束之后所获得的 ResultSet 中的 column 包含你生命的全部 fields。相应的列 名和字段名必须完全相同,并且其数据类型也必须完全一致。 这是一个字段声明的语法,字段的声明需要对应于数据库表中的某一字段。 我们来考虑一个 Employee 的例子,有如下表结构(structure): JasperReport 用户说明书 41 报表字段需要像下面这样定义: 如果你定义的字段不能和 ResultSet 中的某一列相对应,则在运行期将会抛 出异常(如果你用 IReport,在编译时也会抛出异常)。然而执行 SQL 查询之后返 回的结果集中包含的列不需要与报表字段一一对应(即列可以多于字段,只是在 显示的时候不显示出来罢了)。 字段名(Field Name) 元素的 name 属性是强制属性(即不能省略),你可以在表达式中通过 它来引用该字段。字段名必须是一个单词,且不含有特殊字符,如点和分号。 字段类型(Field Class) 这个属性描述了字段值的类型,缺省的类型是 java.lang.String,还有其他可 选类型如: java.lang.Object java.lang.Boolean java.lang.Byte java.util.Date java.sql.Timestamp java.lang.Double java.lang.Float java.lang.Integer java.io.InputStream java.lang.Long java.lang.Short java.math.BigDecimal 如果某些数据源含有一些自定义的类型,则该类型所对应的字段应该声明为 java.lang.Object。但是与参数定义不同的是,你只能选择上述列表中的类型名。 字段描述(Field Description) 当实现一个自定义数据源的时候跟,这一伴随着某个字段的附加的文本块是 JasperReport 用户说明书 42 很有用的。你可以在字段描述中保存一个 key 或其他任何信息以便于在运行期从 自定义数据源中取回字段值。通过使用可选的元素,你就可以 轻松的越过字段名的约束(field naming conventions),在从数据源取数据的时候, 使用字段描述而不是字段名来获取相应数据。 PERSON NAME JasperReport 用户说明书 43 第 4 章 数据报表导出 4.1 查看报表(Viewing Reports) 报表填充阶段的输出通常是一个 JasperPrint 对象,如果把它保存在磁盘上, 通常以一个.jrprint 文件的形式存在。JasperReports 拥有一个内置的查看器,用来 查看用内置的 XML 导出器(XML exporter)获得的 XML 格式的报表文件。这个查 看器就是以前提到过的 net.sf.jasper.niew.JRViewer,一个基于 Swing 的应用程序 组件,用户可以通过继承这个类来定制自己所需的查看器。例如,在 JasperReports 工程中自带的例子 webapp 中,可以阅读 JRViewerPlus 类的代码来获取进一步内 容。 需要注意的是,JasperViewer 更像是一个教人们如何使用 JRViewer 组件的 演示程序,当用户在调用 JasperViewer 的 viewReport()方法来显示报表时,如果 关闭了预览 Frame,整个应用程序将会随之结束,因为这个函数最后调用了 System.exit(0);用户可以通过继承这个类,并重新在用户的 Viewer 里注册 java.awt.event.WindowListener 来避免这一情况的发生。 下表所列的是查看报表的相关类: 表 4-1 类 功能介绍 Class net.sf.jasper.view.JRViewer 这是一个基于 Swing 的应用程序,可以将它视为 一个独立组件,用来进行打印预览。用户可以继 承这个类,来构造满足自身要求的预览程序。 Class net.sf.jasper.view.JasperViewer 这个类更像是使用 JRViewer 的教学组件,它演示 了一个 Swing 应用程序如何装在并显示报表。 Class net.sf.jasper.view.JasperDesignViewer 这个类用于报表的设计期间,用来预览报表模 版。它仅作为一个开发工具存在于类库中。 接下来,我们来看一个例子: 1)进入 Demo 的 samples 中,查看 beanshell 的具体执行过程,首先查看可 用命令: JasperReport 用户说明书 44 图 4-1-1 2) 通过命令:ant view 进行查看报表。 图 4-1-2 3)得出结果,可以看到报表: 图 4-1-3 JasperReport 用户说明书 45 4.2 打印报表 JasperReports 类库的主要目标,就是生成可打印的文档。而且多数应用程序 生成的报表都是需要落实(或打印)到纸张上。我们可以 net.sf.jasper.engine.JasperPrintManager 来打印 JasperReports 生成的文档。当然, 报表也同样可以在被导出到其他格式如 PDF,HTML 之后再被打印。通过 JasperPrintManager 提供的方法,我们可以打印整个文档,打印单个文档或打印 某一范围内的文档,可以显示打印对话框也可以不显示。 下面的例子演示了不显示对话框,打印整个文档的方法: JasperPrintManager.printReport(myReport,false); 这个例子显示了如何打印 5-11 页的文档,同时显示打印对话框: net.sf.jasper.engine.JasperPrintManager.printPages(myReport,4,10,true); 下表所列的是查看报表的相关类: 表 4-2 类 功能介绍 Class net.sf.jasper.engine.JasperPrint 当一个报表已经装填好数据之后,这个文 档就以JasperPrint 类的实例出现。 这个类可以直接用JasperReport 内置的 viewer 进行查看,也可以序列化到硬盘以备 后用,或者发送到网上去。这个类的实例是 报表装填过程后的产物,它可以被 JasperReports 类库中的导出方法导出成各种 流行的格式—PDF,HTML,XML等等。 Class net.sf.jasper.engine.JasperPrintManager 这个类用户提供打印方法,用户可以将整 个文档或部分文档传递给它,也可以选择是 否显示打印Dialog,这在他的API文档中便可以 找到。 在打印报表时,有以下核心语句需要注意: public void print() throws JRException { long start = System.currentTimeMillis(); JasperPrintManager.printReport("build/reports/FirstJasper.jrprint", true); System.err.println("Printing time : " + (System.currentTimeMillis() - start)); } JasperReport 用户说明书 46 4.3 导出报表 在一些应用程序环境下,将 JasperReports 生成的文档从其特有的格式导出到 其他更为流行的格式如 PDF,HTML 是非常有用的。这样一来,其他人就可以在 没有安装 JasperReport 的情况下查看这些报表,特别是当这些文档要通过网络发 送出去的时候。 JasperReports 提供了 JasperExportManager 类来支持此项功能。这项功能将 会在以后不断加入对新的格式的支持。目前,JasperReports 主要支持导出 PDF, HTML 和 XML 类型的文档,下面是导出的代码片断: JasperExportManager.exortReportToHtmlFile(myReport) 还需要注意的是,如果想要将自己的报表导出到其他格式的用户,需要实现 JRExporter 的接口,或继承相应的 JRAbstractExporter 类。 对于导出报表这一部分功能而言,相关的类有: 表 4-3 类 功能介绍 Class net.sf.jasper.engine.JasperExportManager 这个类主要负责文档的导出。 Class net.sf.jasper.engine.JasperRunManager 有时,我们仅仅需要构造一个流行的文档格 式,例如PDF,或HTML,而不需要将装填过 程后生成的JasperPrint 对象保存到硬盘或其 他中间媒体上。这时,可以使用这个类来直 接将装填过程生成的文档导出到所需的格 式。 接下来,我们来看一个例子: 1) 利用命令 “ant pdf” 将报表导出为PDF格式文件 图4-3-1 2)使用test命令, JasperReport 用户说明书 47 图4-3-2 3) 在目录下会生成build文件夹: 图4-3-3 4) 在build文件夹下reports文件夹中会生成pdf文件 图4-3-4 JasperReport 用户说明书 48 图4-3-5 导出报表部分的核心语句有: 导出 PDF 格式: public void pdf() throws JRException { long start = System.currentTimeMillis(); JasperExportManager.exportReportToPdfFile("build/reports/FirstJasper.jrprint"); System.err.println("PDF creation time : " + (System.currentTimeMillis() - start)); } 导出 xml 格式: public void xml() throws JRException { long start = System.currentTimeMillis(); JasperExportManager.exportReportToXmlFile("build/reports/FirstJasper.jrprint", false); System.err.println("XML creation time : " + (System.currentTimeMillis() - start)); } 导出其他格式与上面类似可得。 JasperReport 用户说明书 49 第 5 章 范例 通过分析 JasperReport 项目中的一个 demo(\demo\samples\xmldatasource) 可以进一步了解 JasperReport 工作的整体流程。 本例中的数据源为一个 xml 文件,位于\date 目录下的 northwind.xml 文件。 5.1 报表设计 本例中的数据源为一个 xml 文件,位于\date 目录下的 northwind.xml 文件, 根据需求,做出报表设计,可以利用 iReport 也可以通过真接写 xml 文件获得, 本中最终的报表设计位于\reports 目录下的两个.jrxml 文件。其中 OrdersReport.jrxml 中的一段关键代码如下: . . . . . . . 5.2 数据填充 数据填充一般由 fill 函数来完成。本例中的 fill 函数如下 public void fill() throws JRException { Map params = new HashMap(); Document document = JRXmlUtils .parse(JRLoader.getLocationInputStream("data/northwind.xml")); params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document); params.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, JasperReport 用户说明书 50 "yyyy-MM-dd"); params.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, "#,##0.##"); params.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH); params.put(JRParameter.REPORT_LOCALE, Locale.US); JasperFillManager.fillReportToFile("build/reports/CustomersReport.jasper", params); } 本函数功能主要为加载数据源,配置数据源的一些参数,如日期格式、数 字格式等,加载报表设计。利用本函数可以连接报表设计与数据源,并设置相应 参数。 5.3 报表导出 报表导出的形式可以用多种多样,本例用就采用了多种导出格式,如 pdf、 doc、xml、html、csv 等等,可以通过写相应的函数来实现导出的格式,如:  生成 PDF public void pdf() throws JRException { long start = System.currentTimeMillis(); JasperExportManager.exportReportToPdfFile("build/reports/CustomersReport.jr print"); System.err.println("PDF creation time : " + (System.currentTimeMillis() - start)); }  生成 XML 报表 public void xml() throws JRException { long start = System.currentTimeMillis(); JasperExportManager.exportReportToXmlFile("build/reports/CustomersReport.jr print", false); System.err.println("XML creation time : " + (System.currentTimeMillis() - start)); }  生成网页形式报表 public void html() throws JRException { long start = System.currentTimeMillis(); JasperExportManager.exportReportToHtmlFile("build/reports/CustomersReport.j rprint"); System.err.println("HTML creation time : " + (System.currentTimeMillis() - start)); } JasperReport 用户说明书 51 第 6 章 JasperReport 与 struts2 的整合 6.1 环境准备 在 struts2 中使用 jasperreports 生成报表除了常规 struts2 工程需要的 Jar 文 件和环境之外还需要两个 Jar 文件:struts2-jasperreports-plugin-2.0.11.jar(在 struts2 发布包的 lib 目录下可以找到)、jasperreports-2.0.2.jar(在 jasperreports 的 发布包中),如果要在报表中输出中文还需要两个 Jar 包:iTextAsian.jar 和 itext-1.3.1.jar[5]。 6.2 生成*.jasper 文件 在应用中,我们普遍是先通过 iReport 等工具生成编译后的*.jasper,然后交 Struts2,Struts2 的 Action 负责提供数据源及组装.,其实也可以用 iReport 工具只 生成*.xml 文件,再由 Struts2 的 Action 编译生成*.jasper 文件。如果通过 Action 中的 Java 生成代码如下: 1. reportSource=ServletActionContext.getServletContext().getRealPath("/jasper/templa te.xml"); 2. File parent = new File(reportSource).getParentFile(); 3. JasperCompileManager.compileReportToFile(reportSource, new File(parent, "compiled_jasper_template.jasper").getAbsolutePath()); 6.3 在 struts.xml 文件中的配置 1. 2. 3. 4. WEB-INF\jasperTemplet\testreport.jasper 5. HTML 6. accountList 7. 8. 9. 这个配置的关键在于几个参数的配置,location 指的是*.jasper 文件的位置; format 指的是导出报表的格式,除了 HTML 还可以是 pdf、doc、docx、xls、xlsx、 rtf、csv、ppt 等;dataSource 指的是报表所用到的数据来源,这里用的是一个 List, 实际应用中也可以是一个 JavaBean 或数组等。 经过控制器后,如果成功跳转将直接在浏览器打开所导出的报表。 JasperReport 用户说明书 52 参考文献 [1] 薛笛. Jasper Report 用户手册. [2] JasperReports Requirements. [Online]. Available: http://jasperforge.org/uploads/publish/jasperreportswebsite/trunk/requirements .html. [3] David R. Heffelfinger. Getting Started With JasperReports. [Online]. Available: http://www.theregister.co.uk/2006/10/24/jasperreports_tutorial/. [4] Deepak Vohra. Creating a Report with JasperReports. Oct. 2006. [Online].Available: http://www.theregister.co.uk/2006/10/24/jasperreports_tutorial/. [5] 张向军. Struts2 整合 JasperReport. [6] Erik Swenson. Reports made easy with JasperReports. Sep.2002.[Online].Available: http://www.javaworld.com/javaworld/jw-09-2002/jw-0920-opensourceprofile.ht ml. [7] JasperReports API Docs. [Online].Available: http://jasperreports.sourceforge.net/api/index.html. JasperReport 用户说明书 53 附 API 表 1. Class net.sf.jasper.engine.design.JasperDesign 这是一个未经加工的报表实例,供 JasperReport Library 使用。这个类可以 在 JasperReport 类库内置的 XML解析器对 XML report design 进行解析处理之后 得到。 2. Class net.sf.jasper.engine.JasperReport 这个类的实例包含了一个经过编译的 report design 对象。生成它的时机是对 报表编译之后,但尚未对其填入数据的时候。编译过程中,JasperReport 需要生 成一个临时的类文件,用以保存 report expression,如变量表达式,文本,图像 表达式,组表达式等等。这个临时的 Java Source File 是被动态编译的,编译器 使用的是JDK 中用来执行应用程序的编译器类(compiler class)。如果 tools.jar 不 在 classpath 中,编译过程将采用 javac.exe 来进行后台编译。编译后所得的字节 码保存在 JasperReport 类中,用来在执行期装填数据(filling the report with data) 和给表达式赋值(evaluate various report expression)。 3. Class net.sf.jasper.engine.JasperCompileManager 这是一个上面提到的与编译有关的类。利用它提供的一些方法,你将有能力 编译从本地硬盘或一个 Input Stream 获得的 XML report;还可以通过传给 JasperCompileManager 一个 JasperDesign 类,来对内存中的 report design 进行编 译—功能很强大。 4. Class net.sf.jasper.engine.JasperPrint 当一个报表已经装填好数据之后,这个文档就以 JasperPrint 类的实例出现。 这个类可以直接用 JasperReport 内置的 viewer 进行查看,也可以序列化到硬盘 以备后用,或者发送到网上去。这个类的实例是报表装填过程后的产物,它可以 被 JasperReport 类库中的导出方法导出成各种流行的格式—PDF,HTML,XML 等等。 5. Interface net.sf.jasper.engine.JRDataSource 这个类与报表的数据源有关。只要能够恰当的实现他的一些接口,用户就可 以在报表中使用各种数据源,在报表装填的时候由报表引擎负责对数据进行解释 和获取。当报表装填的时候,报表引擎都会在后台生成或提供一个该接口的实例。 JasperReport 用户说明书 54 6. Class net.sf.jasper.engine.JRResultSetDataSource 这是一个 JRDataSource 的缺省实现,因为很多报表数据都来源于关系数据 库,所以 JasperReport 缺省包含了这个外覆(wrap)了 java.sql.ResultSet 对象的 实现。这个类可以用来包裹(wrap)用以对报表进行装填的、已经载入的结果集, 也可以被报表引擎用来包裹通过 JDBC 执行完查询后所得的数据。 7. Class net.sf.jasper.engine.data.JRTableModelDataSource 此类用于包裹 java.swing.table.TableModel 类中的数据,它也是实现了 JRDataSource 接口,用于在 Java Swing 程序中使用已经被载入到 table 中的数 据来生成报表。 8. Class net.sf.jasper.engine.JREmptyDataSource 这是 JRDataSouce 接口的最简单实现,这个类用在不需要显示数据源数据 而从参数中获取数据的报表和仅需要知道数据源中的实际行数(number of virtual rows)的报表中。JasperReport 自带的例子:fonts,images,shapes 和 unicode 中 使用这个类对报表进行装填,来模拟没有任何 record 的数据源,这时所有的 field 都为 null。 9. Class net.sf.jasper.engine.JasperFillManager 这个类用来实现报表的数据装填。这个类提供了很多方法来接受各种类型的 reportdesign--可以是一个对象,一个文件,或一个输入流。它的输出结果也是多 样的:file,Object,output Stream。report 的装填引擎需要接收一个可以从中获 取数据和 value 的数据源作为报表参数。参数值(Parameters value)通常使用 Java.util.Map 来提供,里面包含的 KEY 是报表的参数名。 10. Class net.sf.jasper.engine.JRAbstractScriptlet 这个类同样用于报表装填期间,用户可以自己定义一些代码,并由报表引擎 在装填过程中执行。这些用户代码可以处理报表数据操作,或在一些定义好的时 刻执行,例如 page,列,或组的分割处。 JasperReport 用户说明书 55 11. Class net.sf.jasper.engine.JRDefaultScriptlet 这是一个非常方便的 JRAbstractScriptlet 的子类。通常情况下你应该选择继 承这个类。 12. Class net.sf.jasper.engine.JasperPrintManager 这个类用户提供打印方法,用户可以将整个文档或部分文档传递给它,也可 以选择是否显示打印 Dialog。 13. Class net.sf.jasper.engine.JasperExportManager 这个类负责文档的导出。这个类的具体信息详见 API 文档。 14. Class net.sf.jasper.engine.JasperRunManager 有时,用户仅仅需要构造一个流行的文档格式,例如 PDF,或 HTML,而 不需要将装填过程后生成的 JasperPrint 对象保存到硬盘或其他中间媒体上。这 时,可以使用这个类来直接将装填过程生成的文档导出到所需的格式。 15. Class net.sf.jasper.view.JRViewer 这是一个基于 Swing 的应用程序,你可以将它视为一个独立组件,用来进 行打印预览。用户可以继承这个类,来构造满足自身要求的预览程序。 16. Class net.sf.jasper.view.JasperViewer 这个类更像是使用 JRViewer 的教学组件,它演示了一个 Swing 应用程序如 何装在并显示报表。 17. Class net.sf.jasper.view.JasperDesignViewer 这个类用于报表的设计期间,用来预览报表模版。它仅作为一个开发工具存 在于类库中。 18. Class net.sf.jasper.engine.util.JRLoader 装载器用于报表生成的各个主要阶段—编译,装填等等。用户和引擎都可以 JasperReport 用户说明书 56 利用这个类来装载所需的序列化对象如 file,URLs,intput stream 等等。这个类 最令人感兴趣的函数当属 loadOnjectFromLocation(String location)。当用户使用这 个类从指定地点装载对象的时候,该函数将首先将 location 解释为一个合法的 URL,如果解析失败,函数将认为所提供的 location 是硬盘上的一个文件名,并 将试图读取它。如果在指定地点没找到文件,它将通过 classpath 定位一个相应 于该 location 的资源,所有努力失败之后,将抛出异常。
还剩55页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 11 人已下载

下载pdf

pdf贡献者

fengli

贡献于2013-07-02

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!