我是在一个星期以前接触iReport 和 Jasperreport的,下载最初它们并没有吸引我的兴趣(或信任),主要是他们的版本的问题(我一直不敢用版本都不到1.0的工具软件,目前它们的版本:iReport0.2.2,Jasperreport0.5.0),不过听说有人在用他们,于是就仔细看了一下(因为在java应用程序的web打印方面我一直都是采用浏览器打印,非常痛苦,所以宁可信其有不可信其无,呵呵……)
一个星期下来,我针对项目中关于报表的一些需求点进行了尝试,发现他们都可以解决,真实大快人心,于是今天把他们推荐给各位。
其实我们做报表用的只是Jasperreport,iReport是一个Jasperreport的可视化开发工具(不要看它的界面有些简陋,我们要的操作他都可以帮我们轻松搞定。),当然iReport还有其他的用处,不过这里不做阐述。
目前几乎还没有中文的介绍他们整合开发的文章,尽管如此我也不准备非常详细的介绍它们,在这里我仅将我的一些经验写出来,不乏有些地方浅尝辄止,如果想细致的研究它们还请阅读它们被套的英文文档。
Jasperreport的配套文档非常详细,该文档是收费的,不过网上有流传的电子版本,本人有幸得到一份,如果你需要可以到本人站点(http://plateau.sicool.com)获得,在此感谢Jasperreport的为开源世界做出的贡献。
相反iReport的文档不多,也许作者认为其足够简单J,我也是经过无数的探索才有些开发的经验。
好了,让我们进入上述两者整合开发报表的历程……
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吧J
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,也曾出现不少关于它的可视化的编辑器,呵呵J
如果在iReport以前,如果你要做报表,你要华上很长时间来熟悉Jasperreport的文档,熟悉文档的一个用途就是编写那个xml文件,现在你只要他熟悉文档的时间来熟悉iReport就可以了。
3. IReport初探
先来看一下这个(rich and very simple to user GUI)吧:
如果以前你有过用vb或其他的开发工具开发报表的经验的话,这个界面乍一看应该很熟悉的,如果碰巧你又熟悉java语言,哇,那么你用iReport应该易如反掌啊,呵呵J
在上一篇文档里我们初步介绍了iReport和Jasperreport,基本上我们已经对它们有了一个最初的认识,在今天这篇文档里,我将深入的对iReport这个工具进行说明。
接着上篇文档的结尾,如果我们成功运行iReport的话,可以看到如下的主界面:
点击“新增” 按钮可以创建一个新的空报表,考虑到生成后的XML文件编辑的时候可以显示中文,请在xml encoding选项上GB2312(没有选项自己手动输入),如下图:
当设置玩必要的选项点击完成可以得到一个空白的报表,如下图:
好了,输入一段文本,很简单,点击创建“静态文本”按钮 ,然后在报表任何一个工作区(如title,pageheader,detail,pagefooter summary等等)输入,如输入“今天天气不错!”
在属性框页可以对输入的内容进行属性控制,如字体,颜色,大小,以及其他的属性,报表中任何的元素(静态文本,线,框等等)都有自己的属性页,一般双击任何元素都可以弹出该元素的属性页,属性页如下图:
完工,一个最简单的报表就生成了,iReport配有运行环境,如下快捷按钮:
左边的按钮是运行静态报表(无需数据库环境),右边的是运行动态报表(这时需要设置数据库连接,数据库的连接载下面介绍)
那么经过上遍的努力,很显然我们将要运行的静态报表,那么点击左边的按钮就可以看到下面的pdf,如图:
当然上遍的例子是最简单,呵呵J
下面我将采用问答的方式进行逐步讲解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 } |
其实这些不说明好像不知道如何办,一单说明了,它们也是很好用的也很简单的。多用吧J
3. 如何定义字体以及如何使用自定义的字体(如黑体、楷体或者比较艺术化的子体)?
因为考虑到使用亚洲字体,因此你需要下在额外的jar包iTextAsian.jar,如果iReport下载包中含有此jar包,此步骤可免。
目前在iReport中使用中文字体,好像只有宋体一种,如果想用其它的字体(如黑体、楷体等)需要另外的方法,这在下面介绍,下面介绍如何使用常用的中文字体“宋体”的设置方法,在问题2中我们看到引入字体的选项,点击“Report fonts”可以看到下面属性页:
好,如上边的设置就已经设置好宋体,以后在报表的任何地方都可以引用该字体,如下面我们要把我们在上边的例子中的元素“今天天气不错!”改为用宋体,如下:
这样只要我们在Report font选项中选中songti 那么下面的属性自动继承,呵呵,方便吧J
好,下面讲述如何使用宋体以外的中文字体,如:黑体、楷体或其他的艺术化的字体。
也很简单,不过好像目前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><![CDATA[黑体]]></text>
</staticText> |
大家可以看到黑体的pdfFontName=””是空的,于是我尝试把系统黑体的TTF文件路径(C:\WINNT\fonts\SIMHEI.TTF)写到这个地方,哈哈,居然成功了。
于是我得到这样一个结论,目前如果你在报表中使用其它的字体,首先要做上面图中所做的属性设置,然后手动把字体的TTF文件写到pdfFontName=””,虽然麻烦了点,不过这招挺管用,呵呵J
让我们先回顾一下上一篇文档中已经阐述的问题:
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