3种Web报表软件的体系结构
07.02.2010 by admin - 0 Comment - 0Posted in web报表
今天有一位朋友问起有关Web报表软件的体系结构和性能问题,解释如下:
Web报表软件总的讲有三种体系结构。一种是纯Java报表,以润乾为代表;一种是控件方式,以数巨为代表;另一种是独立服务器方式的报表软件,以Crystal Report为代表。
1、控件方式
这种方式在浏览器端要安装一个ActiveX控件,在服务器端只负责取数据,报表的计算与生成都是在控件中进行的。采用这种方式的原因是它的报表功能往往都是采用Delphi实现的,包括许多产品都是采用相同的第三方组件。
控件方式的缺点在于:
1)部署:一个控件,要完成别人报表服务器所实现的大部分功能,体积可想而之。功能越强,控件的体积越大。这对于部署是一个很大的负担。不仅如此,而且,当报表系统升级时,用户都必须重新安装控件,Web报表软件的B/S结构在部署方面的优势荡然无存。(其实这种方式本身就是伪B/S)
2)性能:在PC端计算与在服务器端计算,对小报表可能差别不大,但对于大报表,显然差异非常大。并且,如果一个Web报表系统有多个用户都要使用,服务器方式所可以采用的定时计算、缓存等等都无法发挥作用。
所以,控件方式一般只适用于简单、小型报表。这里的简单,不仅是报表的样式简单,也包括计算量、报表规模上都比较简单。
2、独立服务器
这种方式安装一个独立(逻辑上)的报表服务器。它避免了控件方式的Web报表软件部署繁琐、升级不便的缺点,能够通过服务器有效地管理报表,很好地处理性能问题。但它部署起来也是比较麻烦的,实际很多这类Web报表软件产品也很难真正做到跨平台。尤其是涉及集群、连接池等问题,它就无法提供良好的可扩展性。
3、Java报表软件
首先它可以轻松实现Web报表的跨平台部署。对于ASP,.NET等非Java应用,它可以以报表服务器的方式提供Web报表服务,这时这种Web报表工具的工作方法是与Crystal Report之类的产品类似的,具有独立服务器相同的优点与缺点(这里所说的独立服务器是指逻辑上的,物理上仍然可以与其他服务器安装在一起)。而对于Java应用,则可以以类包的方式将报表软件嵌入到J2EE应用架构中,与应用系统形成无缝衔接。这时,它的优势就更加明显:
1) Java应用服务器的所有提高性能的手段,都可以在Web报表软件上充分发挥作用,如计算能力更强的服务器(对控件方式服务器起不了多大作用,独立报表服务器则很多难以在UNIX服务器上部署),负载均衡,连接池等等。
2) Web报表软件可以与应用程序更紧密地衔接,被应用程序更灵活地使用。
有人说,你不要总拿Unix说事,实际应用中很多应用服务器是采用PC Server的。确实是这样,但是(姑且不说许多Web报表工具并不能很好地支持Linux)不要忘记应用服务器层采用PC Server的原因是在于在这一层比较适合采用水平方向的扩展,即使用Cluster和负载均衡技术。对于Java报表软件,这一点太容易了,直接和应用部署在一起就可以,可以说是天生的,但对于独立服务器,这个就很麻烦了。
转自:http://elf8848.javaeye.com/blog/626808





















点击类别ID后,效果图如下:
从上面的两个图片中可以看出点击报表头时,类别ID从由小到大排序变为了从大到小排序!二:实现思路:快逸报表中数据集函数可以传入参数,从而控制对某一字段的排序,通过宏和参数以及超链接的结合使用,可以动态为数据集函数传入不同的参数,实现了点标题点击标题实现列表排序。三:实现步骤: 1:首先看报表模版以及参数和宏的设置下图是报表模版及参数设置:
下图为报表模版和宏的设置:

输入XML文件的名字,或者点击右边的”选择”按钮,选择xml文件,也可以直接输入xml文件的名字,如下图
然后确定。编辑框中只需要录入XML文件名,可以是绝对路径名,也可以是相对路径名。如果是相对路径,设计器中相对于”配置/选项”中的应用资源路径,WEB发布时,相对于web.xml中配置的ReportFileHome属性中的路径。 第三步,使用设置好的xml数据集设计报表 单元格输入内容如下 A1:ID B1:姓名 C1:性别 D1:出生日期 E1:城市 A2:ds1.select(ID) B2:ds1.name C2:ds1.sex D2:ds1.born E2:ds1.city 单元格内容输入完成,然后把其他没有用到的单元格删除。 至此,报表已经完成。发布报表,启动tomcat,然后在IE中浏览报表。浏览效果如下
如果数据集的类型是xml文件,就可以用上面的制作方法制作报表。
从上图可以看到这是一个多维交叉分组报表,上表头是地区/城市,左表头是日期。 如果想动态改变一下报表的样式,左表头变成地区和城市的分组展现,上表头变成年份和月份的分组展现,并且只通过一张报表,这就需要用文章标题中提到的:利用参数实现行列变换的方法了。 实现思路: 1. 设计单元格表达式根据参数不同而变化,从而实现样式跟随表达式变动。 2.点击一个超链接按钮通过url强制传参给报表中的单元格,从而控制报表的样式。 本文就以此报表为础,做一个可以行列互换的功能(上表头和左表头互换),实现报表在web页面上样式改变。 第一步:设计器中选择配置-参数 给报表增加一个参数,我们把这个参数叫做转换参数,顾名思义,这个参数就是控制行列转换用的。
第二步:修改单元格表达式,让单元格接受参数
我们把C2单元格的表达式修改为: =if(@arg1==’1′,ds1.group(year(订购日期),false,订购日期!=null)+”年”,ds1.group(货主地区,false,货主地区!=null))。 此表达式的意思是:当参数arg1的值为1时,C2单元格的表达式为ds1.group(year(订购日期),false,订购日期!=null)+”年”,否则默认为ds1.group(货主地区,false,货主地区!=null)。 关于快逸报表中if()函数的用法请参考快逸帮助文档中的相关介绍。 据这个逻辑,依照地区与城市之间的关系,年份和月份之间的关系,把单元格的表达式做如下修改: C3:=if(@arg1==’1′,ds1.group(month(订购日期),false)+”月”,ds1.group(货主城市,false)) A4:=if(@arg1==’1′,ds1.group(货主地区,false,货主地区!=null),ds1.group(year(订购日期),false,订购日期!=null)+”年”), B4:=if(@arg1==’1′,ds1.group(货主城市,false),ds1.group(month(订购日期),false)+”月”)。 第三步:修改交叉表头并在其中设置超链接
红色框中的交叉表头区是整张报表的关键,既要在行列转换的时候做到文字跟随变化,又要充当转换控制的按钮。 修改此单元格的表达式为:=if(@arg1==’1′,”分布,运货费,时间”,”时间,运货费,分布”) 然后在此单元格的属性中:
加入超链接属性: if(@arg1==null,”/reportJsp/showReport.jsp?raq=/交叉报表.raq&arg1=1″,”/reportJsp/showReport.jsp?raq=/交叉报表.raq”)
这个超链接的作用就是点击这个单元格,赋予arg参数值,然后通过超链接中的url把参数传递到jsp中的报表里,通过对参数值的判断,来确定超链 接中的url,这样就可以来回转换,防止只能转换一次的情况出现。(超链接也可以设置在其他单元格中,本文中这样做是为了美观且容易理解) 接下来,我们把报表发布到页面上去看效果:
点击设置了超链接的表头单元格后,url自动转换为/reportJsp/showReport.jsp?raq=/交叉报表.raq& arg1=1,强制把参数arg=1传给报表的各个单元格,单元格表达式发生变化,报表样式也随之变化,于是实现了行列互换的效果:
此时,如果想转换到前一种样式,只需再点击一次表头单元格即可。 在这个报表中,我们运用了很多颇具技巧性的方法,例如参数结合超链接的运用,if()函数的运用,往往一些看似很复杂的报表,通过一些技巧性的做法都是可以迎刃而解的。