置顶随笔
#
简表(JOR),是一款开源的报表工具,完全java实现,核心代码来自于国内一线报表工具品牌杰表.2008 。
提起开源的报表工具,不能不说说jaspereport,jasperreport作为著名的开源报表工具,在java程序员中一直享有盛名。但由于其设计主要是针对西式的简单报表,设计起复杂的中式报表来,有点力不从心,所以,在国内的项目中能成功应用的例子并不多。JOR,作为能做复杂报表的开源报表工具,可以弥补jasperreport的不足。
下载地址:
http://www.jatools.com/jor
java实现的olap服务器,完全自主产权,纯java实现. cube架构,性能优,占用空间小.
分析模型设计器
通过图片介绍java报表开发过程中,经常遇到的一些报表类型,统计图,及可视化的设计等.下面以 杰表.2008 为例介绍之.
一、支持报表类型
主从报表
套打报表
标签报表
分栏报表
计算比去年增长数
计算比去年同期增长数
补足空行的表格报表
多表合并.不同的数据集,做成一个相连的报表.
公式分组报表.按字段值,进行分类,分级
排行榜(Top N)报表
按汇总值大小排序的分组
多级分组
计算占比
显示排名
交叉表折页处理
层次不等的交叉表
行列并行分组的交叉表
多数据集的交叉表
静态表格中的公式计算
二、javabean数据源
使用java数组
假设项目组其他成员已经编写了一个Student类,如下图(a),该类定义四个方法,分别获取其姓名,年龄,性别,分数。由脚本构造一个包含三个Student对象的数组,如图(b),要求你做成下图(c)所示报表。
嵌套的java对象数据源
假设你有下图(a)所示的两个类Student和Person,你可以使用Student的getMembers()方法,取得该学生的家庭成员列表,每个家庭成员用一个Person对象表示,该对象包含与该学生的关系、姓名、性别等信息。
ResultSet数据源
指定sql查询一个报表
三、统计图与条码
插入统计图对象
设置统计图背景及立体效果
设置统计图输出格式为Flash
从统计图钻取另一个明细报表
你可以在统计图的某一个数据区放置一个超链接,使用户双击该区时,跳转到另一个子报表或网页,如,有一个柱形图,显示各产品的库存量,点击某个产品的柱面,就可以打开该产品相关的销售记录。
饼图
以时间为横轴的统计图
混合类型统计图
双轴统计图
创建甘特图
特殊统计图
创建条形码对象
日常生活中条形码随处可见,条形码用几何图形表示数据,并可以被专门设备识别。杰表可支持的13种条形码,分别是codabar、code39、code128、2of5、postnet、ean-128、ean-13、ean-8、upc-a、upc-e、royal-mail-cbc、pdf417、datamatrix,其中最后两种是二维条形码。
一维码 二维码
设置图片背景
显示数据库字段上的图片
三、特殊的报表效果
冻结窗口效果
点击表头排序
使用超链接子报表
当你浏览报表时,可能需要了解更详细的信息,比如,我们在浏览一个订单列表时,希望了解该订单中各货物的销售数量。这时,你可以在订单列表中,加一个超链接,使用户在点击该链接后,可以跳转到显示该订单明细的一个报表。
你可以在主表中,点击订单ID,即可浏览该订单出售的所有货物明细,如下图所示:
热点提示
复杂汇总
颜色警告
斑马条
创建页小计、页累计报表
四、可视化设计器
设计参数表单
杰表.2008配备了一个可视化参数表单设计器,使用这个设计器,你可以不离开报表设计器环境,轻松制作查询表单。表单设计器有丰富的web控件,检验,事件侦听,css样式机制,你也可以使用javascript脚本扩展表单功能,同时,也实现了常用的多个下拉框联动功能。
可视化的报表设计器
报表预览面板
本文试图对市面上流行的纯java实现的web报表工具,jasperreport 、 stylereport 、杰表、润乾报表、快逸、finererport为例,分析各报表工具采用的web打印技术的异同、优劣、及对用户需求的适应性,供大家参考。
打印是报表工具的基本功能之一,有些报表工具就是从一个专门的打印程序中发展而来,如用友华表。因为想当然地简单,所以,在报表工具选型时用户常常忽略这个问题,特别是有些报表工具厂商,明知自己的打印方案在满足某些需求时,存在缺陷,但没有尽明确告知义务,而故意事先做好花里胡哨的有关打印方面的文档,欺骗客户。我曾不至一次地听说,有些开发商选用的报表工具,其打印功能不能满足需求,不得不另外找打印工具的事情,实在是吃尽苦头。
报表打印在c/s时代,确实非常简单,vb,vc,Delphi,pb,都有很好用的打印api,有的甚至用报表控件方式,搞定打印更是分分秒的事情,但今天是b/s的天下,报表都是在网页浏览器中显示,但当今的浏览器打印功能一般非常弱(谁让你叫他“浏览”器呢?“浏览”就是让你用眼睛看,“打印”属于兼职),要做到精确分页打印,几乎不可能,所以当前的报表工具,一般不会让你使用浏览器的打印菜单来打印报表,都有自己的解决方案,这下可好,各报表工具厂商由是乎,八仙过海,各显神通,各家都说自己的好,对于web打印了解不深的客户,总有雾里看花的感觉。
归纳来说,当今java报表工具采用的打印技术不外乎三类:Applet打印、导出成pdf/excel打印、控件打印。用户选用的重点是:尽量选择插件小的打印软件,因为文件小意味着安装迅速,启动速度快。插件大小除了插件本身的大小外,还需要考虑支持软件的大小,如有些插件很小,支持软件却很大。
Applet打印
本文开始处提及的报表工具,除finereport外都支持Applet打印。之所以多数厂商支持Applet方式打印,因为Applet是java实现,与java后台、java报表设计器的兼容性较好,代码容易维护,实现也方便。然而,厂商省事,用户就得多事。Applet方式打印,用户最多的抱怨是需要安装jre(而当前的操作系统,一般不是默认安装的),虽然说,多数厂商已经做到可以自动安装jre,但对于10几M(JRE1.4有15M,JRE1.5为16M))的安装,这意味着用户需要较长时间的等待。
另一个问题是Applet配置复杂,使用不稳定。1995年,正是因为给人们无穷的视觉和脑力震荡的Applet ,使人们认识了java,认识了Games Gosling。所以在b/s早期,人们为了展现html的富客户效果,Applet是唯一之选。但现如今,Applet已经是昨日黄花,早已被ajax、flex取代,是什么原因?战略层面的东西,我也不太说得清楚,但作为程序员,经过几番折腾后,也不会愿意再用Applet了。如经常莫名其妙地出现“小应用程序,… notinited”的错误,还得清理ie缓存,对于Applet打印,还需要设置jre的安全策略等等。不是靠终端用户能完成的,这就必须额外地增加开发商的服务成本。
Applet打印,启动速度慢。Applet打印原理是,当你点击打印按钮时,浏览器启动Applet,Applet根据参数访问后台页面信息,后台返回页面,Applet加载页面后,调用jre的打印服务进行打印。这就意味着,每次打印都需要调用后台服务程序,就必然影响打印的响应速度。
Applet打印很安全,言下之意是ActiveX打印不安全,这是采用Applet打印的厂商津津乐道的,实际上,这是一个伪命题。Applet和ActiveX都是浏览器的插件,我们当然不希望下载插件后,该插件可以为所欲为,比如,删除你磁盘里的文件,或启动一个木马,从这点来说,Applet确实比ActiveX安全,因为Applet是在一个受限的环境里运行,而ActiveX是不受限的。所以,当你访问一个陌生的网站时,出于安全考虑,你可能会允许下载运行Applet,而阻止ActiveX。但当用户访问自己的网站系统,时,这种担心就没必要,这好比,当你与陌生人打交道时,很自然地会问自己,这人可信嘛?但如果你与家里人打交道,这个问题就不成其为问题了。
Applet打印,除了可以设置打印机,设置纸张页面大小等常规打印功能外,往往也集成与打印不相关的功能,比如,打印前修改(有人说,是为了做假帐方便,中国特色,国产报表工具一般都具备,jasperreport,stylereport不支持),按行分页,自由定位,这些本来由设计器完成的功能,挪到打印功能上来,来掩盖上面指出的Applet的种种不足。实际上,Applet功能强弱完全取决于Applet的大小,有些报表厂商甚至用Applet或web start 的方式,提供所谓的基于web的报表设计,前提是下载 40多M的jar包,实际上,这种方案远非一般意义上的纯web 的报表设计,完全是混淆概念。作为用户最希望常规的,他们熟悉的打印功能,不需要不相关的,理解困难的打印功能。
PDF/EXCEL打印
Pdf打印方式,就是用户点击打印后,浏览器会自动弹出adobe reader,再利用adobe的打印按钮进行打印,由于国外adobe reader安装非常普及,国外的java报表工具多提供这种打印方案,比如 stylereport,jasperreport,国内报表工具finereport也采用这种方式(让人不解),pdf方式打印的好处是能做到精确打印,而且报表预览与打印一气呵成。但不足是需要在客户的机子里,事先安装有adobe reader,作为程序员,一般不太会有问题,因为程序员可能经常要浏览一些pdf文档,多数已经装了adobe reader,但国内的终端用户,大多不知pdf是何物,更谈不上安装。
Pdf打印的另一个问题是必须弹出adobe reader,不能做到无预览打印,这可能由于pdf缺少相应api的缘故吧。
轻量级的ActiveX打印
这里之所以强调“轻量级”,目的是与传统意义上的ActiveX报表相区别。ActiveX技术可以说是报表工具家族里的没落贵族,c/s时代,报表工具一般都被做成控件形式,水晶报表就是如此,在b/s时代,报表工具里仍然能看到ActiveX的身影,但风光大不如从前,如数巨,明宇,用友华表,inforeport。用ActiveX实现报表的不足,在网上你能轻易找到,在此不再详述。ActiveX 报表虽深受诟责,但从打印功能来说,却都是近乎完美,处理得却非常好,非常稳定。
既然,ActiveX打印是长处,能不能扬长避短地使用ActiveX技术?有人提出这样的问题。于是,有些厂商,比如杰表,采用了浏览时用html,打印时用插件的方式。这种方案的需要解决的问题是,ActiveX打印控件,不能太大,否则报表工具成了ActiveX报表了。
与Applet相比,轻量级ActiveX打印具有以下优势:
1. 下载时间短,(大小是Applet的1/250);
2. 本地打印,打印时,不需要访问后台服务程序,不占用服务器资源;
3. 启动速度快,由于控件小,且本地打印,所以打印速度是优于以上两中打印方案,打印速度与你点击浏览器打印菜单相差无几。
采用轻量级的ActiveX打印的不足是,只有ie 5.5 及以上版本支持,其他版本的浏览器不支持。好在ie5.5浏览器已非常普及,在用户那里应该不是大问题。
杰表采用的打印方案,用一个jatoolsPrinter的控件,大小是60k,是经过数字签名的。这个打印控件采用ie特有的打印技术(templateprinter)实现打印功能,支持打印,预览,边距设置,重复打印,批量打印功能。
目前,jatoolsPrinter已经从杰表中独立出来,任何报表工具或第三方软件都利用该控件,实现web打印,推出至今,免费加收费用户上万。
下表总结三种方式的采用者及优劣对比,对于ie5.5客户来说,我们推荐使用ActiveX打印方案.
报表厂商列表
jasperreport
Stylereport
杰表
润乾
快逸
finererport
当我们使用报表工具,设计完一张报表时,我们同时必须为该报表设计一个查询条件表单,使得用户在浏览报表时,可以在网页中选取查询条件。在过去,设计表单是件令人沮丧的事情,这不仅要求你在报表设计器与开发环境之间来回切换,而且在设计表单时,还需要考虑系统的其他布局元素的关系,苦燥,繁琐,没有挑战性。更进一步,如果项目要求最终用户能够自己设计报表,天呐,他们可能喜欢用报表设计工具来设计报表,但绝对不愿意用网页设计工具来设计表单。
当然,也有一些报表工具,实现了参数表单的自动化,比如,按一定规则顺序排列参数项,但这种自动化,用户很难按其需求进行排版布局,所以不能彻底解决用户的问题。
现在,杰表.2008配备了一个可视化参数表单设计器,使用这个设计器,你可以不离开报表设计器环境,轻松制作查询表单。表单设计器有丰富的web控件,检验,事件侦听,css样式机制,你也可以使用javascript脚本扩展表单功能,同时,也实现了常用的多个下拉框联动功能。
杰表.2008表单设计器不仅是表单设计工具的替代品,更重要的是表单设计器解决了报表设计容易,部署难的问题。我们希望,利用集成的表单设计器,你只要在设计器中设计好参数表单,并将报表模板文件和表单模板文件置于某个位置,你的用户就可以在浏览器中,按条件浏览这张报表了,这中间不需要你再做任何其他事情。
有关表单设计的更多内容,点击这里
作为java程序员,大家可能都听说过,或用过birt, 据说,现在birt的东家actual,正式入驻中国市场,联想到前些天杰表.2008的推出,今年,注定是国内的报表软件市场不平静的一年。
birt的最大好处是开源,不足是水土不服,做起复杂报表来不方便,复杂报表主要说的是行上,列上有多个并列分组的交叉报表,国产报表工具大都关注复杂报表需求,而洋品牌的报表软件工具,如jasperreport,crystalreport,这方面关注不够,所以做起复杂报表来很吃力。
做什么事情必须先有观念,然后,付诸实现,做软件则更进一步,必须将这些观念结构化,即模型化。对复杂报表需求的处理,国内报表软件厂商时下,用得最多的是类excel报表模型,即以单元格为中心报表模型,最早产品化的,是用友华表,当然它不属于java阵营的,java阵营的现在有润乾,finereport,杰表4.0,类excel报表模型大家都觉得,功能很强,但最大问题是,学习起来不方便,不知道你在大学里,微积分考多少,如果你90分以下,那你最好别碰那东西。
杰表.2008采用的复杂报表模型,相对来说,比excel模型容易得多,比如下图是一个典型的复杂报表,该报表用于按不同分类方法
统计培训学员人数,该表列上存在多个分组(培训类型、累计培训时间、参加培训总人数、培训内容、渠道类型),分组之间不存在嵌套关系的,即分组是并列的。行上存在一个按学员
行政级别为依据的分组。
复杂报表的复杂性在于结构复杂,比如上图报表列上存在多个并列分组,不仅如此,行上也可能存在多个并行分组;不仅有多个并列分组,也可能各并列分组的嵌套数不一样;不仅各个分组来源于同一个
数据集,也可能来自多个不同的数据集。
尽管如此,我们仍然可以把复杂的交叉报表,看作下图所示的结构,表格包括A,B,C,D四部分,其中B,C是两个表格,决定了交叉表的结构。B表格非常特殊,第一,该表格向右生长的,而一般我们常见向下生长,如C 表格。第二,该表格有多个并列分组,而一般报表工具中,表格对象最外围只能有一个分组,尽管其嵌套数是可以多重的。
杰表.2008以上述结构分析为基础,引入了超级表格对象,该对象就是通过嵌入两个扩展方向不同的子表格,行头表和列头表,来完成交叉报表的结构性问题。两表均可以有任意多的并列分组,每个分组可以有
层次不同的嵌套。下图(a)是
设计面板中的超级表格对象,下图(b)是该对象子部件的层次关系,其中对象3就是行头表,对象4就是列头表。
杰表的超级表格对象结合杰表的DOM报表数据模型,可以演化出任意复杂的多源,多组交叉表,下面试举几例说明之。(点击进入查看)
列上并行分组交叉表
层次不等的交叉表
行列并行分组的交叉表
多数据集的交叉表
计算比去年增长数
计算比去年同期增长数
计算占比
显示排名
按照汇总值排序的交叉报表
交叉表折页处理
交叉表居中
一般java报表工具,允许用户使用java类来作动态数据来源,但这个类必须符合工具要求的接口,如JasperReport的JRDataSource接口,杰表的BeanDataset接口。这种方式确实为用户提供了一种在报表工具中使用java对象的途径,但同时,因为需要实现特定接口,额外地增加了编码工作。
有没有一种不需要实现接口直接使用java对象的办法呢?杰表.2008提供了这样的方法。
假设你有下图(a)所示的两个类Student和Person,你可以使用Student的getMembers()方法,取得该学生的家庭成员列表,每个家庭成员用一个Person对象表示,该对象包含与该学生的关系,姓名,性别等信息。注意,这两个类没有实现任何额外的接口。
如果你有一个Student对象,那么,在杰表.2008中,你就可以做成如上图(b)所示报表,上半部分列出该学生的本人信息,下面显示该学生的家庭成员表。更多内容请参照:
使用java对象作数据源
使用java数组
java数组节点访问
List,iterator数据源
嵌套的java对象数据源
ResultSet数据源
TableModel数据源
近年来,纯java的类excel报表工具异军突起,在国内报表工具市场中取得了初步成功。目前市场上主流的纯java类excel的报表工具有润乾、杰表4.0、finereport等。
类excel报表工具之所以受国人追捧,一方面是契合了国内用户喜欢用格子做报表的习惯,另一方面,由于扩展的类excel报表模型的推出,比如润乾的非线性多源分片模型,杰表4.0的超级cell模型,满足了用户编制复杂报表的需求。
然而,通过这几年的应用,类excel报表工具的问题也大量暴露出来,主要集中在易用性和性能两方面,根本原因在于类excel报表工具模型本身的不合理。用类excel报表模型去解决复杂报表需求,就像用十字锣丝刀去开启一字锣丝一样,虽然勉强能用,但终归不是问题的正解。
现在,因为复杂报表需求概念被炒得火热,几乎每一个报表工具厂商都声称自己能做中国式的复杂报表,但你若追问一句,你们的报表工具好使嘛?需要多长时间能掌握?我估计百分之百哑口。
选用报表工具的目的是为了提高开发报表模块的效率,如果报表工具学习起来困难,不易掌握,那么,虽然报表工具给你带来了设计报表的便利,但也同时给你制造了不必要的学习障碍。在it企业人才流动频繁的背景下,降低报表工具的学习难度,就等于降低项目的人工成本和风险,所以报表工具易用性是考量报表工具的一个重要指标。往极端了说,如果一个报表工具,需要有一个爱因斯坦的大脑才能使用,这样的报表工具不用也罢。
用户是上帝,当用户有很多报表工具产品可供选择之时,用户对我们报表厂商提出了更高的要求,他们不会再满足于问你能不能做,还会问你上手够不够快。面对如此新的市场要求,有些报表工具厂商没有引起足够重视,仍然延续着营销亢奋,研发萎靡的做法,一个概念卖到低,不能不令人忧虑。杰表团队坚信,一个好的产品只有持续地倾听市场的声音,并体现在我们提供的产品与服务上,才能取得持续的成功。
2003年,融合类excel模型的杰表推出市场,到2006年春,决定全面重写杰表框架,停止一切主动的市场营销活动。为什么要重写框架呢?我们需要找到一种更易使用的报表模型。因为经过多年的市场检验,我们意识到类excel报表报表模型,不管是杰表4.0的超级cell模型还是润乾的多源分片模型,都不能很好解决复杂报表问题。
类excel模型不易学习的根本原因是,没有一个可视化的数据模型。所以你需要在非线性、多源分片、轴这些豪华概念的面前,费尽脑力。另外,采用单元格即数据的做法,完全违反了MVC的软件哲学,使之报表工具的灵活性大受限制。总之,非线性多源分片技术确实很数学,但很不哲学。
2008年5月,经过持续两年的潜心研发,杰表.2008正式面市。杰表.2008采用可视化的dom驱动报表模型,采用MVC架构,从根本上解决复杂报表工具学习难的问题。下图是杰表.2008设计器中展现的可视化报表模型。更多内容参见 www.jatools.com
2009年10月15日
#
简表(JOR),是一款开源的报表工具,完全java实现,核心代码来自于国内一线报表工具品牌杰表.2008 。
提起开源的报表工具,不能不说说jaspereport,jasperreport作为著名的开源报表工具,在java程序员中一直享有盛名。但由于其设计主要是针对西式的简单报表,设计起复杂的中式报表来,有点力不从心,所以,在国内的项目中能成功应用的例子并不多。JOR,作为能做复杂报表的开源报表工具,可以弥补jasperreport的不足。
下载地址:
http://www.jatools.com/jor
2009年9月25日
#
java实现的olap服务器,完全自主产权,纯java实现. cube架构,性能优,占用空间小.
分析模型设计器
2009年9月2日
#
闲话少说,晒几个杰表.2008的ppt截图,希望有助于大家对报表工具的选择.
2009年6月22日
#
jni 类型
简单类型 primitive type
jni有8大基本类型, jboolean,jbyte,jchar,jshort,jint,jfloat,jlong,,jdouble
8位,16位,32位,64位,各两个(在win32平台中,其他平台不一定)
java类型与c++数据类型的映射关系是如下:
jboolean <--> unsigned char
jchar <--> unsigned short
jshort <--> short
jfloat <--> float
jdouble <--> double
这是在 jni.h里定义的,为啥缺了jbyte,jint,jlong的映射呢?
答案是:sun在实现java虚拟机时,考虑到虚拟机可能运行在不同的操作系统和不同的硬件平台上,比如,硬件平台有8位,16位,32位,64位的区别,为了更好地与硬件平台匹配,发挥最好的性能,将一些类型抽取出来,允许在不同的平台上有不同的表示(位数),我们姑且称之为硬件相关类型,jbyte,jint,jlong就属于硬件相关类型。
举列来说,如果你在32位机上,jint表示的是32bit的,而在64位机上,一般是64位即8个字节表示,也就是说,jbyte,jint,jlong在sun的虚拟机上,位数是不定的。
那位数不一定,怎么编译? sun的方法是增加一个机器相关的jni_md.h文件,这里的md是machine dependent(机器相关)的意思。在win32平台中,这三个类型的定义如下:
typedef long jint;
typedef __int64 jlong;
typedef signed char jbyte;
由此可见,在win32平台中,jint是32位的,jlong是64位,jbyte是8位的.
指针类型 reference type
reference 准确的译法,应该是引用,但引用实际上就是指针的一种伪装,只不过更接近人的思维罢了。如果说,"爸爸的爸爸"是一种指针概念,那"爷爷"就是一种引用概念。
jni把类型分为两大类,一个是简单类型,一个是引用类型,下面是引用类型
从上图似乎可以看出,所有引用类型,都从jobject 继承,jarray又被几个简单类型的数组继承.
但实际上这个对象层次,是一种假象,跟我们c++与java中看到的对象层次是有区别的,jobject与LPSTR(字符串指针),本质上没有区别:
1. jobject, jclass,jstring,...等,所有对象,是指针,不是对象本身,而指针是不存在继承关系的,“小狗”的指针,从“动物”的指针继承,这种说法不成立。
2. jobject,jclass,jstring 是一种指针,不存在任何操作方法,好比你不能 LPCSTR->strlen(),在jni中,也没有提供任何 jobject->something() 这种调用。
3. 对这些对象的操作必须依赖于 env对象的操作方法.
看一下,jni.h中对 这些引用对象的定义
class _jobject {};
class _jclass : public _jobject {};
class _jstring : public _jobject {};
...
typedef _jobject *jobject; //_jobject才是类定义,jobject 是否_jobject的指针
typedef _jclass *jclass;
typedef _jstring *jstring;
...
在这些下划线对象中,有什么成员变量,成员函数呢? 答案是你什么也不能得到,比如,你想知道,_jstring对象的字符串长度,你不能 _jstring.length(),得到,而必须env->GetStringLength(jstring) 来得到.
只给你一个对象的指针,不告诉你里面有什么,这样做的好处是实现与接口分离。
jvalue 这个类型,是一个union ,感觉很想com里的variant对象,不过没有指明类型的field
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
我现在还不知道,这个数据类型,什么时候用.
jfieldID是一个java类成员变量的id,这个id在c++中,实际是一个指向结构的一个指针, jmethodID 是成员方法的id, 不管是成员变量还是方法的id,在java类被加载进虚拟机后,是保持不变的。所以从考虑性能计,可以使用静态缓存的方法,先取出来,后面会讲到
字符串类型
这里说的字符串类型,是jni中char * 的格式,不是指 jstring/_jstring,jni也使用 char * 字符串指针,
好下所示:
jmethodID GetMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig);
但需要注意的是,这里的name,必须是UTF-8的编码,utf-8对于ascii字符,只占一个字节,最多不超过3个字节
2009年3月4日
#
通过图片介绍java报表开发过程中,经常遇到的一些报表类型,统计图,及可视化的设计等.下面以 杰表.2008 为例介绍之.
一、支持报表类型
主从报表
套打报表
标签报表
分栏报表
计算比去年增长数
计算比去年同期增长数
补足空行的表格报表
多表合并.不同的数据集,做成一个相连的报表.
公式分组报表.按字段值,进行分类,分级
排行榜(Top N)报表
按汇总值大小排序的分组
多级分组
计算占比
显示排名
交叉表折页处理
层次不等的交叉表
行列并行分组的交叉表
多数据集的交叉表
静态表格中的公式计算
二、javabean数据源
使用java数组
假设项目组其他成员已经编写了一个Student类,如下图(a),该类定义四个方法,分别获取其姓名,年龄,性别,分数。由脚本构造一个包含三个Student对象的数组,如图(b),要求你做成下图(c)所示报表。
嵌套的java对象数据源
假设你有下图(a)所示的两个类Student和Person,你可以使用Student的getMembers()方法,取得该学生的家庭成员列表,每个家庭成员用一个Person对象表示,该对象包含与该学生的关系、姓名、性别等信息。
ResultSet数据源
指定sql查询一个报表
三、统计图与条码
插入统计图对象
设置统计图背景及立体效果
设置统计图输出格式为Flash
从统计图钻取另一个明细报表
你可以在统计图的某一个数据区放置一个超链接,使用户双击该区时,跳转到另一个子报表或网页,如,有一个柱形图,显示各产品的库存量,点击某个产品的柱面,就可以打开该产品相关的销售记录。
饼图
以时间为横轴的统计图
混合类型统计图
双轴统计图
创建甘特图
特殊统计图
创建条形码对象
日常生活中条形码随处可见,条形码用几何图形表示数据,并可以被专门设备识别。杰表可支持的13种条形码,分别是codabar、code39、code128、2of5、postnet、ean-128、ean-13、ean-8、upc-a、upc-e、royal-mail-cbc、pdf417、datamatrix,其中最后两种是二维条形码。
一维码 二维码
设置图片背景
显示数据库字段上的图片
三、特殊的报表效果
冻结窗口效果
点击表头排序
使用超链接子报表
当你浏览报表时,可能需要了解更详细的信息,比如,我们在浏览一个订单列表时,希望了解该订单中各货物的销售数量。这时,你可以在订单列表中,加一个超链接,使用户在点击该链接后,可以跳转到显示该订单明细的一个报表。
你可以在主表中,点击订单ID,即可浏览该订单出售的所有货物明细,如下图所示:
热点提示
复杂汇总
颜色警告
斑马条
创建页小计、页累计报表
四、可视化设计器
设计参数表单
杰表.2008配备了一个可视化参数表单设计器,使用这个设计器,你可以不离开报表设计器环境,轻松制作查询表单。表单设计器有丰富的web控件,检验,事件侦听,css样式机制,你也可以使用javascript脚本扩展表单功能,同时,也实现了常用的多个下拉框联动功能。
可视化的报表设计器
报表预览面板
2008年8月8日
#
本文试图对市面上流行的纯java实现的web报表工具,jasperreport 、 stylereport 、杰表、润乾报表、快逸、finererport为例,分析各报表工具采用的web打印技术的异同、优劣、及对用户需求的适应性,供大家参考。
打印是报表工具的基本功能之一,有些报表工具就是从一个专门的打印程序中发展而来,如用友华表。因为想当然地简单,所以,在报表工具选型时用户常常忽略这个问题,特别是有些报表工具厂商,明知自己的打印方案在满足某些需求时,存在缺陷,但没有尽明确告知义务,而故意事先做好花里胡哨的有关打印方面的文档,欺骗客户。我曾不至一次地听说,有些开发商选用的报表工具,其打印功能不能满足需求,不得不另外找打印工具的事情,实在是吃尽苦头。
报表打印在c/s时代,确实非常简单,vb,vc,Delphi,pb,都有很好用的打印api,有的甚至用报表控件方式,搞定打印更是分分秒的事情,但今天是b/s的天下,报表都是在网页浏览器中显示,但当今的浏览器打印功能一般非常弱(谁让你叫他“浏览”器呢?“浏览”就是让你用眼睛看,“打印”属于兼职),要做到精确分页打印,几乎不可能,所以当前的报表工具,一般不会让你使用浏览器的打印菜单来打印报表,都有自己的解决方案,这下可好,各报表工具厂商由是乎,八仙过海,各显神通,各家都说自己的好,对于web打印了解不深的客户,总有雾里看花的感觉。
归纳来说,当今java报表工具采用的打印技术不外乎三类:Applet打印、导出成pdf/excel打印、控件打印。用户选用的重点是:尽量选择插件小的打印软件,因为文件小意味着安装迅速,启动速度快。插件大小除了插件本身的大小外,还需要考虑支持软件的大小,如有些插件很小,支持软件却很大。
Applet打印
本文开始处提及的报表工具,除finereport外都支持Applet打印。之所以多数厂商支持Applet方式打印,因为Applet是java实现,与java后台、java报表设计器的兼容性较好,代码容易维护,实现也方便。然而,厂商省事,用户就得多事。Applet方式打印,用户最多的抱怨是需要安装jre(而当前的操作系统,一般不是默认安装的),虽然说,多数厂商已经做到可以自动安装jre,但对于10几M(JRE1.4有15M,JRE1.5为16M))的安装,这意味着用户需要较长时间的等待。
另一个问题是Applet配置复杂,使用不稳定。1995年,正是因为给人们无穷的视觉和脑力震荡的Applet ,使人们认识了java,认识了Games Gosling。所以在b/s早期,人们为了展现html的富客户效果,Applet是唯一之选。但现如今,Applet已经是昨日黄花,早已被ajax、flex取代,是什么原因?战略层面的东西,我也不太说得清楚,但作为程序员,经过几番折腾后,也不会愿意再用Applet了。如经常莫名其妙地出现“小应用程序,… notinited”的错误,还得清理ie缓存,对于Applet打印,还需要设置jre的安全策略等等。不是靠终端用户能完成的,这就必须额外地增加开发商的服务成本。
Applet打印,启动速度慢。Applet打印原理是,当你点击打印按钮时,浏览器启动Applet,Applet根据参数访问后台页面信息,后台返回页面,Applet加载页面后,调用jre的打印服务进行打印。这就意味着,每次打印都需要调用后台服务程序,就必然影响打印的响应速度。
Applet打印很安全,言下之意是ActiveX打印不安全,这是采用Applet打印的厂商津津乐道的,实际上,这是一个伪命题。Applet和ActiveX都是浏览器的插件,我们当然不希望下载插件后,该插件可以为所欲为,比如,删除你磁盘里的文件,或启动一个木马,从这点来说,Applet确实比ActiveX安全,因为Applet是在一个受限的环境里运行,而ActiveX是不受限的。所以,当你访问一个陌生的网站时,出于安全考虑,你可能会允许下载运行Applet,而阻止ActiveX。但当用户访问自己的网站系统,时,这种担心就没必要,这好比,当你与陌生人打交道时,很自然地会问自己,这人可信嘛?但如果你与家里人打交道,这个问题就不成其为问题了。
Applet打印,除了可以设置打印机,设置纸张页面大小等常规打印功能外,往往也集成与打印不相关的功能,比如,打印前修改(有人说,是为了做假帐方便,中国特色,国产报表工具一般都具备,jasperreport,stylereport不支持),按行分页,自由定位,这些本来由设计器完成的功能,挪到打印功能上来,来掩盖上面指出的Applet的种种不足。实际上,Applet功能强弱完全取决于Applet的大小,有些报表厂商甚至用Applet或web start 的方式,提供所谓的基于web的报表设计,前提是下载 40多M的jar包,实际上,这种方案远非一般意义上的纯web 的报表设计,完全是混淆概念。作为用户最希望常规的,他们熟悉的打印功能,不需要不相关的,理解困难的打印功能。
PDF/EXCEL打印
Pdf打印方式,就是用户点击打印后,浏览器会自动弹出adobe reader,再利用adobe的打印按钮进行打印,由于国外adobe reader安装非常普及,国外的java报表工具多提供这种打印方案,比如 stylereport,jasperreport,国内报表工具finereport也采用这种方式(让人不解),pdf方式打印的好处是能做到精确打印,而且报表预览与打印一气呵成。但不足是需要在客户的机子里,事先安装有adobe reader,作为程序员,一般不太会有问题,因为程序员可能经常要浏览一些pdf文档,多数已经装了adobe reader,但国内的终端用户,大多不知pdf是何物,更谈不上安装。
Pdf打印的另一个问题是必须弹出adobe reader,不能做到无预览打印,这可能由于pdf缺少相应api的缘故吧。
轻量级的ActiveX打印
这里之所以强调“轻量级”,目的是与传统意义上的ActiveX报表相区别。ActiveX技术可以说是报表工具家族里的没落贵族,c/s时代,报表工具一般都被做成控件形式,水晶报表就是如此,在b/s时代,报表工具里仍然能看到ActiveX的身影,但风光大不如从前,如数巨,明宇,用友华表,inforeport。用ActiveX实现报表的不足,在网上你能轻易找到,在此不再详述。ActiveX 报表虽深受诟责,但从打印功能来说,却都是近乎完美,处理得却非常好,非常稳定。
既然,ActiveX打印是长处,能不能扬长避短地使用ActiveX技术?有人提出这样的问题。于是,有些厂商,比如杰表,采用了浏览时用html,打印时用插件的方式。这种方案的需要解决的问题是,ActiveX打印控件,不能太大,否则报表工具成了ActiveX报表了。
与Applet相比,轻量级ActiveX打印具有以下优势:
1. 下载时间短,(大小是Applet的1/250);
2. 本地打印,打印时,不需要访问后台服务程序,不占用服务器资源;
3. 启动速度快,由于控件小,且本地打印,所以打印速度是优于以上两中打印方案,打印速度与你点击浏览器打印菜单相差无几。
采用轻量级的ActiveX打印的不足是,只有ie 5.5 及以上版本支持,其他版本的浏览器不支持。好在ie5.5浏览器已非常普及,在用户那里应该不是大问题。
杰表采用的打印方案,用一个jatoolsPrinter的控件,大小是60k,是经过数字签名的。这个打印控件采用ie特有的打印技术(templateprinter)实现打印功能,支持打印,预览,边距设置,重复打印,批量打印功能。
目前,jatoolsPrinter已经从杰表中独立出来,任何报表工具或第三方软件都利用该控件,实现web打印,推出至今,免费加收费用户上万。
下表总结三种方式的采用者及优劣对比,对于ie5.5客户来说,我们推荐使用ActiveX打印方案.
报表厂商列表
jasperreport
Stylereport
杰表
润乾
快逸
finererport
2008年7月29日
#
当我们使用报表工具,设计完一张报表时,我们同时必须为该报表设计一个查询条件表单,使得用户在浏览报表时,可以在网页中选取查询条件。在过去,设计表单是件令人沮丧的事情,这不仅要求你在报表设计器与开发环境之间来回切换,而且在设计表单时,还需要考虑系统的其他布局元素的关系,苦燥,繁琐,没有挑战性。更进一步,如果项目要求最终用户能够自己设计报表,天呐,他们可能喜欢用报表设计工具来设计报表,但绝对不愿意用网页设计工具来设计表单。
当然,也有一些报表工具,实现了参数表单的自动化,比如,按一定规则顺序排列参数项,但这种自动化,用户很难按其需求进行排版布局,所以不能彻底解决用户的问题。
现在,杰表.2008配备了一个可视化参数表单设计器,使用这个设计器,你可以不离开报表设计器环境,轻松制作查询表单。表单设计器有丰富的web控件,检验,事件侦听,css样式机制,你也可以使用javascript脚本扩展表单功能,同时,也实现了常用的多个下拉框联动功能。
杰表.2008表单设计器不仅是表单设计工具的替代品,更重要的是表单设计器解决了报表设计容易,部署难的问题。我们希望,利用集成的表单设计器,你只要在设计器中设计好参数表单,并将报表模板文件和表单模板文件置于某个位置,你的用户就可以在浏览器中,按条件浏览这张报表了,这中间不需要你再做任何其他事情。
有关表单设计的更多内容,点击这里
2008年6月10日
#
作为java程序员,大家可能都听说过,或用过birt, 据说,现在birt的东家actual,正式入驻中国市场,联想到前些天杰表.2008的推出,今年,注定是国内的报表软件市场不平静的一年。
birt的最大好处是开源,不足是水土不服,做起复杂报表来不方便,复杂报表主要说的是行上,列上有多个并列分组的交叉报表,国产报表工具大都关注复杂报表需求,而洋品牌的报表软件工具,如jasperreport,crystalreport,这方面关注不够,所以做起复杂报表来很吃力。
做什么事情必须先有观念,然后,付诸实现,做软件则更进一步,必须将这些观念结构化,即模型化。对复杂报表需求的处理,国内报表软件厂商时下,用得最多的是类excel报表模型,即以单元格为中心报表模型,最早产品化的,是用友华表,当然它不属于java阵营的,java阵营的现在有润乾,finereport,杰表4.0,类excel报表模型大家都觉得,功能很强,但最大问题是,学习起来不方便,不知道你在大学里,微积分考多少,如果你90分以下,那你最好别碰那东西。
杰表.2008采用的复杂报表模型,相对来说,比excel模型容易得多,比如下图是一个典型的复杂报表,该报表用于按不同分类方法
统计培训学员人数,该表列上存在多个分组(培训类型、累计培训时间、参加培训总人数、培训内容、渠道类型),分组之间不存在嵌套关系的,即分组是并列的。行上存在一个按学员
行政级别为依据的分组。
复杂报表的复杂性在于结构复杂,比如上图报表列上存在多个并列分组,不仅如此,行上也可能存在多个并行分组;不仅有多个并列分组,也可能各并列分组的嵌套数不一样;不仅各个分组来源于同一个
数据集,也可能来自多个不同的数据集。
尽管如此,我们仍然可以把复杂的交叉报表,看作下图所示的结构,表格包括A,B,C,D四部分,其中B,C是两个表格,决定了交叉表的结构。B表格非常特殊,第一,该表格向右生长的,而一般我们常见向下生长,如C 表格。第二,该表格有多个并列分组,而一般报表工具中,表格对象最外围只能有一个分组,尽管其嵌套数是可以多重的。
杰表.2008以上述结构分析为基础,引入了超级表格对象,该对象就是通过嵌入两个扩展方向不同的子表格,行头表和列头表,来完成交叉报表的结构性问题。两表均可以有任意多的并列分组,每个分组可以有
层次不同的嵌套。下图(a)是
设计面板中的超级表格对象,下图(b)是该对象子部件的层次关系,其中对象3就是行头表,对象4就是列头表。
杰表的超级表格对象结合杰表的DOM报表数据模型,可以演化出任意复杂的多源,多组交叉表,下面试举几例说明之。(点击进入查看)
列上并行分组交叉表
层次不等的交叉表
行列并行分组的交叉表
多数据集的交叉表
计算比去年增长数
计算比去年同期增长数
计算占比
显示排名
按照汇总值排序的交叉报表
交叉表折页处理
交叉表居中
2008年5月29日
#
一般java报表工具,允许用户使用java类来作动态数据来源,但这个类必须符合工具要求的接口,如JasperReport的JRDataSource接口,杰表的BeanDataset接口。这种方式确实为用户提供了一种在报表工具中使用java对象的途径,但同时,因为需要实现特定接口,额外地增加了编码工作。
有没有一种不需要实现接口直接使用java对象的办法呢?杰表.2008提供了这样的方法。
假设你有下图(a)所示的两个类Student和Person,你可以使用Student的getMembers()方法,取得该学生的家庭成员列表,每个家庭成员用一个Person对象表示,该对象包含与该学生的关系,姓名,性别等信息。注意,这两个类没有实现任何额外的接口。
如果你有一个Student对象,那么,在杰表.2008中,你就可以做成如上图(b)所示报表,上半部分列出该学生的本人信息,下面显示该学生的家庭成员表。更多内容请参照:
使用java对象作数据源
使用java数组
java数组节点访问
List,iterator数据源
嵌套的java对象数据源
ResultSet数据源
TableModel数据源
2008年5月20日
#
近年来,纯java的类excel报表工具异军突起,在国内报表工具市场中取得了初步成功。目前市场上主流的纯java类excel的报表工具有润乾、杰表4.0、finereport等。
类excel报表工具之所以受国人追捧,一方面是契合了国内用户喜欢用格子做报表的习惯,另一方面,由于扩展的类excel报表模型的推出,比如润乾的非线性多源分片模型,杰表4.0的超级cell模型,满足了用户编制复杂报表的需求。
然而,通过这几年的应用,类excel报表工具的问题也大量暴露出来,主要集中在易用性和性能两方面,根本原因在于类excel报表工具模型本身的不合理。用类excel报表模型去解决复杂报表需求,就像用十字锣丝刀去开启一字锣丝一样,虽然勉强能用,但终归不是问题的正解。
现在,因为复杂报表需求概念被炒得火热,几乎每一个报表工具厂商都声称自己能做中国式的复杂报表,但你若追问一句,你们的报表工具好使嘛?需要多长时间能掌握?我估计百分之百哑口。
选用报表工具的目的是为了提高开发报表模块的效率,如果报表工具学习起来困难,不易掌握,那么,虽然报表工具给你带来了设计报表的便利,但也同时给你制造了不必要的学习障碍。在it企业人才流动频繁的背景下,降低报表工具的学习难度,就等于降低项目的人工成本和风险,所以报表工具易用性是考量报表工具的一个重要指标。往极端了说,如果一个报表工具,需要有一个爱因斯坦的大脑才能使用,这样的报表工具不用也罢。
用户是上帝,当用户有很多报表工具产品可供选择之时,用户对我们报表厂商提出了更高的要求,他们不会再满足于问你能不能做,还会问你上手够不够快。面对如此新的市场要求,有些报表工具厂商没有引起足够重视,仍然延续着营销亢奋,研发萎靡的做法,一个概念卖到低,不能不令人忧虑。杰表团队坚信,一个好的产品只有持续地倾听市场的声音,并体现在我们提供的产品与服务上,才能取得持续的成功。
2003年,融合类excel模型的杰表推出市场,到2006年春,决定全面重写杰表框架,停止一切主动的市场营销活动。为什么要重写框架呢?我们需要找到一种更易使用的报表模型。因为经过多年的市场检验,我们意识到类excel报表报表模型,不管是杰表4.0的超级cell模型还是润乾的多源分片模型,都不能很好解决复杂报表问题。
类excel模型不易学习的根本原因是,没有一个可视化的数据模型。所以你需要在非线性、多源分片、轴这些豪华概念的面前,费尽脑力。另外,采用单元格即数据的做法,完全违反了MVC的软件哲学,使之报表工具的灵活性大受限制。总之,非线性多源分片技术确实很数学,但很不哲学。
2008年5月,经过持续两年的潜心研发,杰表.2008正式面市。杰表.2008采用可视化的dom驱动报表模型,采用MVC架构,从根本上解决复杂报表工具学习难的问题。下图是杰表.2008设计器中展现的可视化报表模型。更多内容参见 www.jatools.com