您的位置:首页 > 编程语言 > ASP

iReport 和 Jasperreport 整合开发 WEB 报表向导(一)

2006-01-07 21:41 615 查看
我是在一个星期以前接触 iReport 和 Jasperreport 的,下载最初它们并没有吸引我的兴趣(或信任),主要是他们的版本的问题(我一直不敢用版本都不到1.0的工具软件,目前它们的版本: iReport0.2.2, Jasperreport0.5.0),不过听说有人在用他们,于是就仔细看了一下(因为在 java 应用程序的 web 打印方面我一直都是采用浏览器打印,非常痛苦,所以宁可信其有不可信其无,呵呵……)
一个星期下来,我针对项目中关于报表的一些需求点进行了尝试,发现他们都可以解决,真实大快人心,于是今天把他们推荐给各位。其实我们做报表用的只是 Jasperreport, iReport 是一个 Jasperreport 的可视化开发工具(不要看它的界面有些简陋,我们要的操作他都可以帮我们轻松搞定。),当然 iReport 还有其他的用处,不过这里不做阐述。目前几乎还没有中文的介绍他们整合开发的文章,尽管如此我也不准备非常详细的介绍它们,在这里我仅将我的一些经验写出来,不乏有些地方浅尝辄止,如果想细致的研究它们还请阅读它们配套的英文文档。Jasperreport 的配套文档非常详细,该文档是收费的,不过网上有流传的电子版本,本人有幸得到一份,如果你需要可以到本人站点(http://plateau.sicool.com)获得,在此感谢 Jasperreport 的为开源世界做出的贡献。相反 iReport 的文档不多,也许作者认为其足够简单,我也是经过无数的探索才有些开发的经验。
好了,让我们进入上述两者整合开发报表的历程……
1. 首先你要得到它们最新的版本,你可以到下边的地址下载
iRport: http://ireport.sourceforge.net
Jasperreport: http://jasperreports.sourceforge.net
他们的配置也很简单:iReport 解压缩以后编辑目录下的 iReport.bat 文件即可,如下

@echo off

set JAVA_HOME=C:/jdk14
set ANT_HOME=d:/ant
set IREPORT_HOME=C:/Documenti/progetti/iReport/iReport2/

rem %ANT_HOME%/bin/ant javadocs
%ANT_HOME%/bin/ant iReport
是不是很简单,你只要设置相应的一些路经就可以,这里是采用 ant 来运行,当然如果你没有安装 ant 也不想安装它,那么也可以,不过这里我买个官子,你们自己可以到解压缩以后的目录中找到相应的运行方法。呵呵,安装 ant 吧! Jasperreport 不需要任何配置,你只需将下载以后的 jar 包放到 classpath 下即可。呵呵,说来简单,可是如果没有 iReport 来替我们干“脏活”,那么做报表的工作将是怎样的痛苦~!
2. Jasperreport是如何工作的?
这里我就往简单里说了。首先要先有个 xml 文件,然后编译成 jasper 文件(以 .jasper 结尾),我们真正要使用的是编译以后的 .jasper 文件,这很像我们熟悉的 .jsp 文件,其实我们调用的是其编译以后的 servlet。



(图片来自 http://ireport.sourceforge.net/cap3.html#3.1) 不过静态的报表没有什么意思,所以有句话说得好:“A datasource + a jasper = a print”。它可以支持的输出格式如下:PDF, HTML, XML, XLS, CVS 等等。因此, Jasperreport 的原始输入就是一个 .xml 文档,想象看一个简单报表的 xml 文件也有几百行,在没有 iReport 以前用它做报表是多么痛苦。(令我不可思议的是,我一个同学公司曾经用 jasperreport 做报表,可是它们竟然没有用过 iReport,天!)。现在不用怕了,用 iReport 可以轻松的搞定这 个XML,写到这里,我想起了 struts_config.xml,也曾出现不少关于它的可视化的编辑器,呵呵。
如果在 iReport 以前,如果你要做报表,你要花上很长时间来熟悉 Jasperreport 的文档,熟悉文档的一个用途就是编写那个 xml 文件,现在你只要他熟悉文档的时间来熟悉 iReport 就可以了。
3. IReport初探
先来看一下这个(rich and very simple to user GUI)吧:


如果以前你有过用 vb 或其他的开发工具开发报表的经验的话,这个界面乍一看应该很熟悉的,如果碰巧你又熟悉 java 语言,哇,那么你用 iRepor t应该易如反掌啊,呵呵

在上一篇文档里我们初步介绍了 iReport 和 Jasperreport,基本上我们已经对它们有了一个最初的认识,在今天这篇文档里,我将深入的对 iReport 这个工具进行说明。
接着上篇文档的结尾,如果我们成功运行 iReport 的话,可以看到如下的主界面:


点击“新增”

按钮可以创建一个新的空报表,考虑到生成后的XML文件编辑的时候可以显示中文,请在 xml encoding 选项上 GB2312 (没有选项自己手动输入),如下图:


当设置完必要的选项点击完成可以得到一个空白的报表,如下图:


好了,输入一段文本,很简单,点击创建“静态文本”按钮

,然后在报表任何一个工作区(如 title,pageheader,detail,pagefooter summary 等等)输入,如输入“今天天气不错!”。在属性框页可以对输入的内容进行属性控制,如字体,颜色,大小,以及其他的属性,报表中任何的元素(静态文本,线,框等等)都有自己的属性页,一般双击任何元素都可以弹出该元素的属性页,属性页如下图:


完工,一个最简单的报表就生成了,iReport 配有运行环境,如下快捷按钮:


左边的按钮是运行静态报表(无需数据库环境),右边的是运行动态报表(这时需要设置数据库连接,数据库的连接载下面介绍)
那么经过上遍的努力,很显然我们将要运行的静态报表,那么点击左边的按钮就可以看到下面的 pdf,如图:


当然上遍的例子是最简单,呵呵
下面我将采用问答的方式进行逐步讲解 iReport 的用法
1. 如何连接数据库?
2. 如何定义变量、参数以及字段?
3. 如何定义字体以及如何使用自定义的字体(如黑体、楷体或者比较艺术化的子体)?
4. 如何执行 SQL 脚本进行查询?
5. 如何把做好的报表引入到应用程序中?
好了,针对上面的问题,我在下面的篇幅中给于解答并穿插介绍 iReport 中其它的功能菜单。
1. 如何连接数据库?
静态的报表其实很少的,我在前一篇文档中有提到过一句经典的话:“A datasource + a jasper = a print” 因此有必要首先介绍一下如何连接数据库,其实很简单。进入 Datasource/Connections/Datasources 菜单或者点击

快捷按钮,则出现下面属性页:


进行必要的数据库连接属性配置,然后点击test按钮进行测试,如果提示测试成功,则保存数据库连接,即可。
2. 如何定义变量、参数以及字段?
变量、参数以及字段的定义,在 iReport 里是比较方便的,在菜单 view 下可以看到一些控制点,如下图:

Report properties 设置报表属性

Report query 设置查询语句的,这个在下面有介绍

Report fields 设置字段(数据库)

Report variables 设置变量

Report parameters 设置参数

Report fonts 设置字体

顺便把下面的你个也说明一下

Bands,弹出报表工作区(如 title detail 等)的属性页

Report groups 设置组

Element properties 元素属性页

Element browser 显示报表所有元素的列表
设置很容易,但是在报表中引用这些变量、参数和字段就有写说头了,呵呵J,让我们一步一步慢慢来。
在 iReport 中引用的方式,如下表
元素名称引用
变量variablesName$V{ variablesName }
参数parameterName$P{ parameterName }
字段filedsName$F{ filedsName }
其实这些不说明好像不知道如何办,一单说明了,它们也是很好用的也很简单的。多用吧!
3. 如何定义字体以及如何使用自定义的字体(如黑体、楷体或者比较艺术化的子体)?
因为考虑到使用亚洲字体,因此你需要下在额外的 ja r包 iTextAsian.jar,如果 iReport 下载包中含有此 jar 包,此步骤可免。
目前在 iReport 中使用中文字体,好像只有宋体一种,如果想用其它的字体(如黑体、楷体等)需要另外的方法,这在下面介绍,下面介绍如何使用常用的中文字体“宋体”的设置方法,在问题2中我们看到引入字体的选项,点击 “Report fonts” 可以看到下面属性页:


好,如上边的设置就已经设置好宋体,以后在报表的任何地方都可以引用该字体,如下面我们要把我们在上边的例子中的元素“今天天气不错!”改为用宋体,如下:


这样只要我们在 Report font 选项中选中 songti 那么下面的属性自动继承,呵呵,方便吧!
好,下面讲述如何使用宋体以外的中文字体,如:黑体、楷体或其他的艺术化的字体。
也很简单,不过好像目前 iReport 的功能不够完美的缘故,还要手动修改 xml 文件才可以达到要求,如下图我们定义黑体:


首先不同的是在 PDF font name 选项中选中 External TTF font…,按照常理,此时要在紧接着的选项中选择黑体的 ttf 文件 SIMHEI.TTF,可是不知为什么 TrueType font 的选项是空的,(当时我在学习的时候,这步操作让我好胜郁闷),天啊,该怎么办?!
后来我查看了相应的 xml 文件,如下:(由于文件较大,因此只截取我们关心的)

<staticText>
<reportElement
mode="Opaque"
x="13"
y="42"
width="239"
height="53"
forecolor="#000000"
backcolor="#FFFFFF"
positionType="FixRelativeToTop"
isPrintRepeatedValues="true"
isRemoveLineWhenBlank="false"
isPrintInFirstWholeBand="false"
isPrintWhenDetailOverflows="false"/>
<textElement textAlignment="Left" verticalAlignment="Top" lineSpacing="Single">
<font fontName="黑体" pdfFontName="" size="36" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="true" pdfEncoding ="Identity-H" isStrikeThrough="false" />
</textElement>
<text></text>
</staticText> 大家可以看到黑体的 pdfFontName=”” 是空的,于是我尝试把系统黑体的TTF文件路径(C:/WINNT/fonts/SIMHEI.TTF)写到这个地方,哈哈,居然成功了。
于是我得到这样一个结论,目前如果你在报表中使用其它的字体,首先要做上面图中所做的属性设置,然后手动把字体的 TTF 文件写到 pdfFontName=””,虽然麻烦了点,不过这招挺管用,呵呵!
让我们先回顾一下上一篇文档中已经阐述的问题:1. 如何连接数据库?
2. 如何定义变量、参数以及字段?
3. 如何定义字体以及如何使用自定义的字体(如黑体、楷体或者比较艺术化的子体)?
下面我们接着往下阐述余下的两个问题,在开始以前我补充两个因该在上篇文档阐述而没有阐述的地方。 第一个就是我忘记说明iReport怎样把xml文件编译成jasper文件,其实很简单,点击“编译”按钮

即可,其实在你点击两种“运行

”按钮的是缺省的操作就是先对xml文件进行编译。第二个就是如何设置iReport的输出格式,我们在前面曾说过iReport可以以很多种格式进行输出,如PDF,HTML,XML,XLS,CVS等等,那么我们该如何设置以何种方式输出呢?在菜单Build中我们可以看出iReport的缺省输出格式为PDF,如图:


PDF preview 缺省输出格HTML preview 以网页的格式输出剩下的就不说了,大家试一下就明白了,J
但是只在此设置输出格式了,还没有完成设置,还有一个必需的设置就是,为每一种设置选择执行“环境”,例如,如果你选择以PDF输出,那么你需要为其指明Acrobat Reader的路径,如图选择菜单Tools/Options,则会弹出如下属性页:

这里还有一点我要说明的就是,在上边途中External editor的设置是选择编辑xml文件的编辑器,这里我一般用UltraEdit来编辑,你可能喜欢用其他的,譬如editplus等,那么就把常用的xml编辑器输入在这里就可以随心所欲的编辑xml文件了,编辑xml文件进入菜单“Edit/edit XML source”,则会弹出你熟悉的编辑器来编辑该xml文件,如图:


还有最后一点要补充的就是,在上一篇文档中我引入非宋体的字体的pdfFontName的ttf文件路径都是绝对路径(如:c:/winnt/fonts/simhei.ttf),其实这是不对的,应该把你在应用程序中的字体打包进来,这样改绝对路径为相对路径(如 reportfonts/simhei.ttf),这样就万无一失了,呵呵J
好了,做完上边的补充,让我们接着前面的问题往下进行,先把下面要解决的问题列如下:4. 如何执行SQL脚本进行查询?
5. 如何把做好的报表引入到应用程序中?
接下来让我们一个问题一个问题的解决它J
4.如何执行SQL脚本进行查询?
我们大家都知道,从数据查询必须要有查询语句,特别综合查询的时候可能sql语句会复杂的多,那么iReport是怎样让我们使用自己的查询语句进行输出的呢?我们在上一篇中曾提到过,呵呵J,希望你不会忘记,在菜单view下有Reprot query项,点击则会弹出如下属性页:

点击上图的“Save query to report”则会把这条SQL语句就会把这条查询语句“引入”到报表中了,如果你此时查看XML文件,则会发现如下片断:
<queryString><![CDATA[select * from users where name='Jplateau']]></queryString>
此时我们还以上篇文章开始的例子入手,让我们“加工”一下,如下图:

假设我们已经设置好连接数据,那么此时点击“运行”按钮

则会得到如下效果:

呵呵,得到了我们期望的效果,这时,可能你要问,如果我要在sql语句中使用参数呢,那么又该如何?其实我接下来马上要说这个问题,如果我们要以名称来进行模糊查询,传递的参数为name,那么期望的sql语句可能是下面这个样子:
Select * from users where name like ‘%name%’
其实在iReport中也可以很容易实现,记得我们在上一篇文档中曾说过参数的使用方法,因此我不多说,我只把最终的sql语句写给大家,相信大家一看就明白:
Select * from users where name like ‘%$P{name}%’
是不是很简单?J
5. 如何把做好的报表引入到应用程序中?
其实在问题4中,如果要运行带参数的查询报表的话,就会牵涉到问题5的,因此我在这里还是要引用问题4种的例子。此时我们就要引入一个jsp页面,假设是pdf.jsp,那么下面就是pdf.jsp的代码:
<%@ page import="dori.jasper.engine.*" %>
<%@ page import="java.util.*" %><%@ page import="java.io.*" %><%@ page import="java.sql.*" %>
<% File reportFile = new File(application.getRealPath("/reports/test.jasper"));
Map parameters = new HashMap(); parameters.put("name", "p"); Connection conn=null //以下忽略得到数据库连接过程//……//…… byte[] bytes = JasperRunManager.runReportToPdf( reportFile.getPath(), parameters, conn ); response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream ouputStream = response.getOutputStream(); ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); ouputStream.close();%>
还有一个必要的步骤就是把你下载的Jasperreport.jar放在你应用程序的lib下,好了,启动你的应用程序,运行dbf.jsp则会看到如下效果

怎么样,根据名称的模糊查询结果是符合我们的期望的,相信你已经掌握了上边的方法了。
当然上边我给出的例子都是最简单的,而且报表的排版也比较随意,相信一点,精美的报表可是细活啊,呵呵J,多练习吧。

总结
这篇系列文档总算写完了,总觉得有点随意的样子,不过还是希望能给一点帮助,文档中不乏有些浅尝辄止的地方,希望你不明白的地方或认为我阐述的不对的地方给我留言或写信。我的站点:http://plateau.sicool.com邮箱:plateau_t@sina.com
ps:在这篇系列文档中我给了jasperreport太少的篇幅,不是它不重要,虽然iReport可以为我们做到很好,但是对jasperreport的了解还是很重要的,我很少说明它的另外一个原因我在第一篇文档中也说了,其实jasperreport的配套文档是非常丰富,你可以到我的站点上下载它。再次感谢“开源”所给于我们的一切。
Jplateau 2003年12月27日星期六 写于广州
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: