赵丽颖和张艺兴唱的歌:Jasper使用小结

来源:百度文库 编辑:中财网 时间:2024/05/10 10:59:25

Jasper使用小结

jasper

 

     最近项目中要使用到单据的打印功能,于是采用了jasper来实现这个feature。由于之前没有开发过类似的功能,做的过程中也走了一些弯路,并且总结了一些经验,正好记录下来。

     一、为什么要使用报表工具进行打印

     首先,需要打印的内容是业务表数据的一部分,因此牵涉到数据查询,采用报表对SQL的支持进行查询是很方便的。

     其次,打印一般对格式要求很高,采用报表设计工具可以很直观的调整格式(当然,HTML编辑器也有类似功能)。尤其对于分页的报表,HTML并没有直接的对分页进行支持,因此可能出现由于页边距的打印设置问题,导致分页错乱。

     二、JASPER使用示例

     a) 报表设计器iReport

     iReport是Jasper Report自带的一个设计器,最牛逼的是,居然也支持Mac平台。各项拖拽操作都非常顺畅,而且可以显示虚线来对齐(和QQ拼音有兼容问题,容易导致Jasper崩溃)。

 

 

     b) 和Struts2进行整合

     官方文档:http://struts.apache.org/2.0.11.2/docs/jasperreports-tutorial.html 

     不过官方介绍的是以DataSource的形式传递数据,也就是在Action中进行查询,然后将查询结果传递给报表引擎。但是在后来的实践中,我觉得这样做不是很好。

     首先,你无法直接在iReport中预览列表结果,因为需要传递一个List对象(部署到服务器上再预览结果是很费事的);

     其次,在报表中,我们一般习惯写SQL语句。至少可以进行SQL的优化调整。报表对性能的要求与普通应用不一样,基本是固定的数据库查询,因此我认为使用SQL作为查询语句是非常合适的。

     下面介绍如何在报表中编写查询语句:

     i. 通过Struts传递数据库连接

 

 

     上面两个图中红色部分,就是如何将数据库连接传递给Jasper引擎的方法。有了数据库连接,我们就可以在iReport里直接写SQL了。当然,这是运行时数据库的连接传递方式。在iReport中,可以直接指定数据库连接,这个连接在运行时会被替换为Struts传递过来的Connection。

 

 

     点击上图中红色圆圈处,就可以编辑iReport所使用的数据库连接。

     ii. 我们再看一下iReport自带的Query Designer。

 

这个Query Designer非常智能,支持你从左侧拖拽表到右侧区域,勾选需要显示的列,以及拖拽关联字段建立表之间的关联关系,自动的生成SQL语句(强烈推荐使用)。

 

 

 

 

其实Jasper还可以支持很多其他的查询语言,包括HQL。我这里就不实验了。因为我觉得,报表还是处理关系数据,因此SQL肯定更合适一些。

     关于Jasper各个Band的功能这里不做介绍。不过这种区分对于报表开发是非常好的,体现了Jasper对报表技术要求的深入理解和良好设计。

     iii. 如何格式化数据:

 

 

 

    上图的红色部分,就是Jasper中的表达式语法。Jasper支持多种表达式语法,包括Java,Groovy等。尤其是支持java类的调用。可以看到上图中就是利用了java的format功能,拼成一个字符串。

     合理的利用表达式非常重要。因为这种用于显示的值,使用java这种强类型语言编写非常麻烦,有时候还要处理异常。而表达式非常适合这种情况,简单,高效,方便修改。因此千万不要将这种代码写在你的Action里,Action应该只负责数据的加载和保存等,不负责数据的显示。

     iv. iReport的预览功能

 

 

     

 

 

     点击上图的预览按钮,有可能出现下面的参数输入界面:

 

 

     这取决于你的报表是否需要参数。当然,大部分报表都需要传递查询参数。这里你可以输入一个有查询结果的参数值,以方便预览报表查询结果。

     v. 查询结果导出

     Jasper支持非常多的格式显示查询结果。包括常见的HTML,PDF,EXCEL等等。因此,Jasper也是一个很好的导出解决方案。

 

 

     你可以指定Jasper以什么格式输出结果,如上图所示(在Struts应用中)。

     下面我简单解释一下,为什么要使用PDF来显示查询结果,而不用常见的HTML。

     首先,HTML不支持分页。Jasper之所以可以使HTML报表产生分页的效果,是基于对高度的计算。但是这个计算显然会依赖于页边距的设置。如果页边距不同,那么就可能造成分页错误。而且各个浏览器对于页边距的默认值都是不一样的,因此很难做到通用(我们不可能给每个客户端调整一下页边距);

     但是PDF对于分页的支持是全面的,而且格式是通用的,在任何PDF浏览器中,都不可能产生串页的现象。而且现在PDF应该也是一个广泛接受的标准,客户机几乎不需要任何特别的设置(对于没有安装PDF阅读器的机器,可能需要安装一下)。

     总结到这里,以后有了新的想法,还会更新。下一步将尝试一下图表功能以及其他的报表工具,例如BIRT等。