第1章 概述
本章对JasperReports的功能和特点进行概要说明。具体内容包括:
JasperReports历史
JasperReports由Teodor Danciu于2001年创立。那时他接受一项任务,为他参预的项目做报表工具的评估。他发现现存的方案对他们的项目预算来说都过于昂贵,于是他决定编写 自己的报表工具。后来,这个项目被取消了。于是他开始在业余时间开发JasperReports,并于2001年9月在http://sourceforge.net注册了这个项目。不久以后,他就开始收到来自潜在用户的邮件,尽管他还没有提交任何代码。
JasperReports于2001年11月发布了它的0.1.5版。从那以后,JasperReports被广泛地使用。如今,它已是最流行的报表工具之一。作为JasperReports享有巨大声望的一个证明,用Google搜索java reporting tool,返回的第一条结果就是JasperReports网站。
一直以来,JasperReports都是一个单人项目,Teodor用业余时间对它进行开发。在2005年4月,一家名为JasperSoft的公司在加利福尼亚的MySQL 用户会议上 正式启动。JasperSoft资助了JasperReports的开发,使Teodor和其他的JasperSoft开发人员可以全身心地投入到 JasperReports工作中。JasperSoft同时为JasperReports和相关产品提供商业支持与服务,包括用于 JasperReports的iReport Visual Designer。除了为JasperReports和iReport提供支持外,JasperSoft还销售整合了JasperReports的商业应用软件。
JasperSoft获得了八百万美元的风险投资,这在dotcom时代是个不小的壮举。这些投资表明了风险投资家们对 JasperSoft和JasperReports的成功充满了信心。据JasperSoft统计,JasperReports已经被下载300,000 次以上,平均每月就有20,000次下载。它已被10,000多家公司和独立软件供应商(ISV)所采用。
JasperReports是什么
JasperReports是一个面向开发人员设计的开源Java类库,通过它可以为Java应用程序增加报表功能。由于 JasperReports不是独立的工具,所以不能对它进行独立安装。而是要通过应用程序的CLASSPATH来包含其类库,从而把它嵌入到Java应 用程序中。JasperReports是Java类库,也就是说它不是为最终用户准备的。它的目标用户是那些需要为应用程序添加报表功能的Java开发人 员。
尽管JasperReports主要用于通过Servlet API来为基于Web的应用程序增加报表功能,但它并不是完全依赖于Servlet API或任何Java EE类库。因此,它并不仅限于Web应用程序。用JasperReports来建立独立的桌面程序或命令行程序来生成报表的工作从未停止过。可是,话说回 来,JasperReports除了是一个Java类库这外,什么都不是。它做的事情只是通过提供API来为各种Java应用程序增加报表功能。
JasperReports需要Java Development Kit (JDK) 1.3或更新的版本来进行编译,以便和JasperReports的Java类库一同工作。同时还需要Java Runtime Environment 1.3或 更新的版本来运行这些应用程序。早期版本的JasperReports需要JDK来运行JasperReports 应用程序(严格地讲,JasperReports需要tools.jar被设置在CLASSPATH环境变量中,JDK包含了tools.jar,而 JRE中没有)。然而,从0.6.4版以后,JasperReports把Eclipse Java Development Tools (JDT)编译器捆绑在一起,因此不再需要JDK来运行部署后的应用程序。本书的例子是用JDK1.5开发的,但它们在JasperReports支持其它JDK或JRE上也应该能够编译和运行。
JasperReports的开源许可
JasperReports的许可遵循Lesser GNU Public License (LGPL)。 与GPL不同,JasperReports选择的许可协议允许其被用于开源的或非开源的应用程序。连接到JasperReports Java类库的应用程序可以不开放源代码,但是,如果你要修改了现存的JasperReports源代码,那么所修改的内容也必须遵照LGPL进行发布。 请查看http://jasperreports.sourceforge.net/license.html 获取完整的许可协议。
JasperReports的特点
除了以文本方式生成报表外,JasperReports还可以生成包含图片、图表和图形的专业报表。JasperReports的主要特点包括:
下面的各小节将对这些特点做简要介绍。
灵活的报表排版
JasperReports允许我们把报表分割成若于区域,这些区域包括:
除了允许定义报表区域外,JasperReports还允许我们基于报表的内容创建精细的动态版面。例如,根据报表中域的值,可以把数据隐藏或显 示,也可以把数据分组到逻辑区域中。假如,我们要创建一个关于汽车的报表,JasperReports允许我们根据产地、型号、年代或它们的组合来对报表 中的数据进行分组。数据分组使我们能够对报表更好地布局,还可以基于报表中的部分数据进行求和计算。分组还用于为图表和图形定义数据集。
多种方式显示数据
JasperReports可以用文本方式或图形方式来显示报表。它还允许用户通过表示式来生成报表,从而动态地显示数据。也就是说,数据并不是直接被传到报表,或保存在什么地方。而是通过对来自数据源的数据和/或参数来计算得到。
多种方式提供数据
JasperReports允许开发人员通过传递报表参数的形式来提供数据,这些报表参数可以是Java类的实例。
数据还可以通过称为数据源的特殊类来提供给报表。报表参数和数据源可以组合使用,以达到最大的灵活性。
多种数据源
JasperReports可以通过JDBC来把任何关系数据库中的数据生成报表,但并不是只限于数据库报表。它还可以从许多数据源来生成 报表,包括:XML文件、简单Java对象(POJO)、任何实现了java.util.Map接口的类、以及任何实现了 javax.swing.TableModel接口的类。
JasperReports还支持空数据源,它被用于生成不需要显示动态数据的简单报表。如果要从一个JasperReports不直接支持的数据源来生成报表,我们可以创建自定义数据源。JDBC数据源以及其它的数据源类型将在后续的章节详细讨论,包括自定义数据源。
水印
JasperReports可以在它生成的报表的背景层生成图片或文本。这些图片可以用作报表的"水印",它就象是在主图象下面的二级图像。
水印可用于为报表添加商标。也可用于安全目的,因为这样的报表不易被仿制。所有的报表页都会有相同的水印,这使得报表具有一致的外观。
子报表
JasperReports还能创建子报表,也称为报表中的报表。Subreports把报表的设计变得简单化,它可以让我们把复杂报表中的一部分摘取出来在另外一个报表里进行设计,然后把它合并到主报表中。
报表导出能力
JasperReports生成的报表可以导出为多种格式,包括:PDF、XLS、RTF、HTML、XML、CSV、简单文本。有一个第
三方的库可以把JasperReports的报表导出为开放文档格式(ODF)。这种格式是一种OASIS组织开发的标准化的XML文件,专门用于办公软
件。OpenOffice.org的2.0版就是把ODF作为其默认格式。
注:JasperReports开放文本格式导出器是由Google于2005年夏开发的,相关的更详细信息可以查询网站http://netmoc.cpe.ucf.edu/Projects/jasper.html。
下面的屏幕截图演示了JasperReports的一些特性,包括:数据分组、添加图片和水印、导出为PDF。
生成上面截图中的报表,需要用到JasperReports的数据分组功能来为country、state和city进行分组,这样显示的 数据具有逻辑性,而且容易被理解。此外,还需要用到JasperReports的图片功能来为报表添加水印和商标。表头部分的字体被编辑为更大的粗黑体, 详细的数据以容易理解的格式进行编排。
上图中用到了免费的Evince文档阅读器。当然,导出的PDF报表也可以用其它的任何PDF阅读器查看,包括:Adobe Acrobat、Foxit、xPDF。
类库依赖
JasperReports借用了其它的开源Java类库来实现其部分功能,其中有:
iText: iText是一个用于生成和处理PDF的类库。另外,它不可以生成和处理RTF、XML和HTML文档。JasperReports用它来导出PDF和RTF格式的报表。要获得有关iText的更详细介绍,可以访问http://www.lowagie.com/iText/。
JFreeChart: JFreeChart是一个Java类库,可用于生成各种图表,包括:饼图、条形图、线形图、区域图、等等。JasperReports通过JFreeChart来实现其图形功能。有关JFreeChart的更详细介绍可以查阅http://www.jfree.org/jfreechart/index.php 。
Jakarta POI: Jakarta POI是一个Java类库,用于创建和处理各种建立在Microsoft的OLE2混合文档格式基础上的Microsoft Office格式的文档。JasperReports通过Jakarta POI来导出XLS格式的报表,更多的Jakarta POI有关介绍可查阅http://jakarta.apache.org/poi/。
JAXP: JAXP是Java SE 5.0中的用于解析和转换XML文档的Java API,JasperReports用它来解析XML文件。如果使用更早版本的Java SE,需要独立地下载它。有关JAXP的更详细介绍可以查阅http://java.sun.com/webservices/jaxp/index.jsp 。
Jakarta Commons: Jakarta Commons是一套Java类库,提供了大量的可重用组件。JasperReports使用了其中的Digester、BeanUtils、 Logging组件来完成XML的JAXP解析。关于Jakarta Commons的更详细介绍可查阅http://jakarta.apache.org/commons/。
注:这里给出URL的目的是为了提供信息,JasperReports类库已经包含了这里列出的所需JAR文件。我们没有必要自己再下载它们,以获得其在JasperReports中的相应功能。
典型的流程
下面的图形简单地示范了用JasperReports创建报表的典型流程:
用JasperReports进行工作时,第一步要创建报表模板,它是一个XML文件。它可以通过手工编码来完成,也可以用图形化的报表设 计器完成。虽然JasperReports的报表模板是XML文件,但其文件名却用.jrxml来作为扩展名。JasperReports XML模板通常就是指JRXML文件,本书中会用到这一术语。
下面是一个典型的JRXML文件的内容:
这个JRXML文件大致说明了JRXML文件中的主要元素。除了<jasperReport>根元素外,这个文件中的其它元素 都是可选的。在编译和填充时,上面的JRXML文件会生成一个空表。它本身没有什么用处,但我们可以用它来作为一个模板,进而编写更有用的报表。我们在上 面的例子中可以看到,JRXML文件的每个主元素都包含一个<band>元素作为它的子元素。Band包含了报表中要显示的数据。上例中,所 有的Band都是空的。在实际的JRXML文件中,Band包含的子元素用于:定位、格式化、显示实际报表的文本和图形数据。有一些商用的开源可视化设计 工具可用于开发JRXML文件。JsperReports的官方报表设计工具是iReport。
JRXML文件需要被编译成JasperReports本地二进制模板。我们可以通过调用适当的JasperReports类库方法 (compileReportToFile()),或者使用自定义的ANT任务(可以在一次操作中编译多个XML报表设计文件,要编译的文件可以通过包含 它们的根目录,或用文件选择模式来指定)。模板编译生成的结果通常称为Jasper文件,其扩展名为.jasper。Jasper文件用于和所需的数据一同生成最后的报表,这一过程被称为填充(filling)报表。JRXML文件只需被编译一次,编译生成的Jasper文件可以根据需要被多次填充,从而创建和显示报表。
填充后的报表可以JasperReports本地格式保存到磁盘,这种格式的文件通常称为JasperPrint文件,其扩展名为. jrprint。JasperPrint files只能用JasperReports特定的阅读器来查看。我们可以把它导出为其它的格式,这样就可以用一些通用的工具来打开查看了,如PDF阅读 器和Word。
从哪里获得帮助
JasperReports有官方的在线论坛和邮件列表,可以提问寻求帮助。这些论坛和邮件列表打包存档的地址是http://sourceforge.net/projects/jasperreports。
JasperReports网站有相关的提示、诀窍、JavaDoc API文档、以及JRXML元素的参考,本指南不会重复这些内容,读者可以自行到网上在线查阅它们。JasperReports的网站地址是http://jasperreports.sourceforge.net。
JasperSoft和其它一些三方厂商还提供商业支持和培训。
小结
本章我们对JasperReports进行了介绍。不仅提到JasperReports从很小的个人项目发展为一个由一家公司支持的项目, 获得了数百万美元的风险投资,还大致浏览了JasperReports。JasperReports不仅是一个独立的报表解决方案,它还是一个Java类 库,我们可以通过它来为自己的应用程序添加报表处理的功能。
另外,还提到了JasperReports的开源许可(LGPL)。本章简要地罗列了JasperReports的功能,包括:报表排 版、以文本方或图形方式显示数据、数据分组、JasperReports类库的依赖关系、报表设计的一般流程。最后还给出了用以寻求帮助的官方在线论坛和 邮件列表。