web报表打印系统解决方案.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《web报表打印系统解决方案.doc》由会员分享,可在线阅读,更多相关《web报表打印系统解决方案.doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流web报表打印系统解决方案.精品文档.web打印/套打 自从开发web程序以来,web打印就一直是困饶大家的大问题。基于web的打印,难度在于要将浏览器中呈现的html,精确地打印到票据中,而且能够实现对分页位置的控制。下面就IE浏览器所能采用的打印解决方案,来个汇总分析。一、 浏览器的打印功能菜单 这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:1 不能精确分页。 浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。 2 不能准确地控制边距及打印文字。
2、3 不能解决连续打印。 比如,不是仅打印一张票据,而是连续一次打印若干个票据。二、 使用webbrowser控件+ javascript 这实际上,是浏览器打印功能菜单的一种程序调用,与打印功能菜单没什么两样。分页的问题仍然存在,只不过,可以让用户不用去点菜单,直接在网页中的一个按钮,或一个链接里面调用罢了。三、 使用print css 这是一种最理想的实现web套打的方法。这种方法通过在html文档中,嵌入打印相关的css样式,来实现对html文档输出打印的控制,比如设置纸张大小,纸张纵横方向,打印边距,分页等。显而易见,这种方式成本小,不需要下载任何插件,而且跨平台性非常好。print c
3、ss推出已经有些时日,但遗憾的是,至今没有一个厂商的浏览器很好地实现了这些标准,这使得程序员目前还不能利用print css进行实际的开发。关于打印css,参见: http:/css- 四、 使用pdf文件 用这种方式,就是从服务器端下载一个pdf文件流,在IE中用adobe插件打开,然后用adobe的打印菜单进行打印,虽然这种方案,也能实现精确套打,但需要下载adobe插件。这是国外报表工具经常推荐的一种打印方法,但在pdf不那么普及的中国,这种方案不是最好选择。 五、 采用纯ActiveX 这种方案就是下载一个控件,票据的数据不再以html方式呈现,而是呈现在ActiveX中。这种方案的优
4、点是打印的精确度高,分页的可控性好,但缺点也是很明显的,嵌入ActiveX控件破坏了web应用的整体html风格,且这样的控件比较大(一般超过1M,下载颇费时间)。六、 采用Applet方式 采用Applet方式,分页或精确打印,都可以做到完美,但缺点也很明显,表现在:1安装Applet成本巨大。需要下载十几M的文件。 Applet本身可能并不大,但运行Applet所需的jre一般至少10几M(jre1.4.2 , 15.45M)。用户需要极大的耐心,来进行打印。 2打印报表时,需要重新向服务器检索数据,效率低。 因为Applet方案,一般采用html方式呈现数据,打印时Applet必须向服务
5、器检索同一张票据的数据,看上去,是打印了当前页的票据,实际上,Applet根本不会用当前html页的数据来打印,而是向服务器下载数据到Applet中来打印。也就是说,打印的话,必须两次请求,一次html呈现,一次用来打印。 七、 轻量级的ActiveX打印方式轻量级的ActiveX打印方案的优点是:1. 效率高; 可以直接打印指定的html文档,不必向后台再次提起请求。 2. 能做到精确打印,分页; 3. 功能丰富, 可以利用该控件,实现对当前票据文档的打印,预览,及多个html文档的连续打印。4. 下载量小, ActiveX只有75K。 e表就是采用第七种方式来实现报表的打印。e表内置了一个
6、用c+写的轻量级的ActiveX控件来精确地控制客户端的打印机。一举解决web打印问题。近期因为专注于用c# 实现web报表,积累了一些经验和心得,也写过一篇介绍文章,也有网友提出没有说清楚。现觉得想用单篇文章来说明web报表开发难免会大而空,落不到实处。因而便想到每篇文章只关注web报表开发中一方面,由多篇文章而形成一个web报表开发的系列文章,这些web报表开发的系列文章无先后次序,主从之分。每篇文章只是以一种视角来看待web报表开发而已。大家可以只选自己感兴趣的部分来看,这样也能节约大家的时间。这便是web报表开发技术专题的由来。废话少说,今天便从小小的序号说起吧!web报表开发技术专题
7、一:序号问题在中国式报表中,常常会见到单元格中有 1,2,3,4 .成一行或一列排列。这便是序号。显然这些序号值在数据源中是不存在的,需要web报表开发工具根据一定的规则运算出来。报表中的序号问题常常被一些通用的web报表开发工具所忽略,有时常常会因为一个序号无法生成而被迫要写代码,使web报表开发的效率受到大大的限制。凡是总须研究,才会明白。下面就来看看中国式报表中的序号大体有哪些样式?* 固定序号:即在表格中固定好的序号值,不会随数据内容的多少而变化。这种最简单了,直接在表格上输入序号值就可以了。* 动态序号:即序号值是不固定的,是根据数据源中的数据而定的。比如:记录数为8条,则序号为从1
8、至 8。* 汉字序号:因为我们是中国人,序号常常用一,二,三,四等等来表示,这就需要必须能将数字序号转换成汉字序号。有时还会在序号的基础上加上括号(如:(1)或顿号(如:一、)等等。* 序号横向排列:序号有时会纵向排列,也常常会要求能横向排列。* 多列序号:分组报表是最常用的报表之一,由此就有根据每个分组字段都会有一个顺序号的问题。* 跨行的序号:分组报表往往会在其中有小计行,而如果这些小计行中不能要序号,就要求序号要跳过这些小计行。* 序号的延伸-序列值:有时报表中会有甲乙丙丁等序列值,这也可以看成是序号的一种吧。文字未免有些空洞,下面以几张图的形式来说明一下:在这个报表中,共有三列序号:总
9、序号,地区序号,产品序号,总序号是直接从1开始的序号值,地区序号是对于每个地区来说从1开始的序号值,产品序号是对于每个地区的每个产品来说是从1开始的序号值。这是一个典型的多列序号的报表。在这个报表中,红色字的序号是跨小计行的,即小计行中是没有序号的。这是典型的跨行的序号的报表。同时在此报表的第二行兰色字的序号是横向排列的。即有多少个地区就有多少个序号值。这是典型的动态序号和序号横向排列的报表。在这个报表中,有汉字序号:一,二等,也有(1)的序号形式。也有序号的嵌套及多个层次的问题。上述是我想到的web报表中的序号的形式,还希望大家补充。上面给出了在中国式报表中的序号的可能的形式,相当于web报
10、表开发的序号方面的需求。下面给出在e表中是如何设计并实现这些序号需求的。 在e表中解决上述复杂的序号问题还是靠提炼这些需求,总结出需要设置的报表公式,然后由用户根据自己的需要组合这些公式来实现的。当然,这些公式并不仅仅是为了解决序号的问题而特别设置的。上次从一个小小的序号开始了web报表开发技术专题,这回来讲一讲web报表开发工具的核心-数据集的变换。 1 为什么说web报表开发工具的核心是数据集的变换 数据集的变换,即报表的数据运算变换的能力。一个报表由两部分组成:数据及样式。数据一般都是从数据集而来的。样式无非就是一些静态的文字线条图片而已。对于一个web报表开发工具来说,实现样式是比较单
11、一的。而数据方面则大有门道。报表上的数据流程一般是先由SQL语句或一个程序来得到数据集,然后将数据集中的数据展现到含有静态样式的报表文件上,从而得到一个真正的报表。如何设计将变换后的数据集中的数据展现到含有静态样式的报表文件上,是每一个web报表开发工具首先必须考虑好的问题。这是web报表开发工具的主框架。它设计的好坏将直接影响web报表工具的开发效率。所以说:web报表开发工具的核心是数据集的变换。 2 数据集变换的相关问题有: A 多数据集时是否必须要设置之间的关联关系 一般来说在一个报表上常需要多个数据集给数,当一个报表上有多个数据集时是否必须要设置这多个数据集之间的关联关系,如需要设置
12、关联关系,哪么在web报表开发工具的内部程序就好做了,只需要根据关联关系来将多个子数据集中的数据展现到含有静态样式的报表文件上,这种方式不好的地方在于当报表内容和数据库物理表中的数据差异大时,往往需要写复杂的SQL语句或编程来准备数据集中的数据。而如果不需要设置这多个数据集之间的关联关系,则需要web报表开发工具内部协调好多数据集在报表上的展现。 B 数据集中的数据在报表上展开时能否变换(排序,过滤) 当一个数据集中的数据在报表上展开时是否可以再排序,设置条件过滤,以及一个数据集中的数据是否可以在报表上多次展开(当然是在不同的位置)。 C 数据集的运算函数.(带条件的sum等) 一般来说,肯定
13、需要提供全面的数据集的运算函数,如对某个字段sum,同时应可以加上条件。 D 报表计算的主流程是以数据集中的记录来循环计算还是以单元格上的公式来循环计算? 大凡写过报表开发工具的人都清楚,报表计算的过程是必须最先确定清楚的问题。这个也是评判一个web报表工具的能力的最重要的一点。以数据集中的记录来循环计算的好处是实现起来简单,报表计算的速度快;但坏处是牺牲了报表计算这一块的柔性化能力,将应对复杂报表的重担全压在生成数据集中的数据这一块了。以单元格上的公式来循环计算实现起来复杂,要处理好单元格的引用关系以及计算次序。但这种计算模式有利于应对复杂的中国式报表。 E 数据集中的数据在报表上如何放置?
14、 显然是希望数据集中的数据可以在报表上随心所欲地放置。但要达到此点需要web报表工具内部要做很多的协调工作。自然就希望将数据集中的数据限制在某些区域放置,实际上就是把报表分成明细区,分组区,标题区等等,但显然这样会大大限制web报表工具的开发能力。 F 数据集中的数据在报表上的展开次序。 一种做法是标识好哪个是主数据集(即最先展开)?哪个是子数据集(即跟随主数据集而展开)。这是条带状报表工具的常用做法。另一类做法是数据集中的数据随所在的单元格展开。而在单元格上设置主单元格,子单元格。这个是新一代web报表开发工具-润乾报表finereport( for java)和e表(for .net)的做
15、法。 3 现有报表工具的做法早期的报表工具在数据处理手段上相当单一,一般做法都是依赖于SQL语句或者存储过程,将需要的数据返回给报表系统,而报表系统能够做的仅仅是一些简单的四则运算,或通过固定函数取最大最小值等。近年来,一些报表开发工具在数据集的变换方面进行一些改良。比如数巨报表就加上了数据微引擎技术,以应对复杂的中国式报表。这种做法是在数据集上增加一层运算层,以提高数据的柔性化能力。其实质是对传统的条带状的报表工具的改良。象润乾报表finereport ( for java)以及e表(for .net),是采用全新的数据处理模式。下面详细地介绍一下e表的报表运算原理。下面演示一个简单列表的扩
16、展过程,为了说明方便,去掉单元格的样式部分的同步:A 准备开始计算时如下图:B 计算了 ds1.get(semployeeid) 公式后。即将semployeeid的值算出来了,同时复制了多行。C 计算ds1.semployeename 公式后。D 以此类推,直到整个表都计算出来。下面演示一个分组报表的扩展过程,为了说明方便,去掉单元格的样式部分的同步:A 准备开始计算时,如下图:B 计算了 ds1.group(sarea,false) 公式后。如图所示将B3单元格的值计算出来了,同时在B3单元格中会保留一个当前组的指针,通过它能得到整个组的数据。如第一个是上海组,即ds1数据集中sarea=
17、上海的数据。(注意:一个组的数据是指一个二维表的数据,不光是一行的数据)同时也复制了多行。C 计算一个 ds1.get(id) 公式后如图所示,第一个 ds1.get(id) 就计算出来了,它的计算过程和简单数据列表的示例中的get函数的计算过程一样,只是指取sarea=上海 这一组的合同号来扩展,纵向扩展时左边的单元格拉大。D 以此类推,就得到了如下的报表。由上述可以看出,e表的报表运算主流程是以单元格上的公式来循环计算的,而不是以数据集中的记录来循环计算的。它采用多个单元格自由扩展而得到报表的思路,大大的增强了数据集的变换能力。使报表运算的柔性化能力达到了全新的高度。4 示例. 上述都是些
18、报表运算原理方面的设计问题。下面还是来看看两个示例吧!这是一个动静相结合的横向分片的报表示例,它要web报表开发工具具有支持分片能力,即一个报表无论多复杂,都可以分成一片片来分别处理,片数的增加报表的工作量不能呈指数增加。上述这个员工简历如果去掉下边的主要工作经历的话,就是一个标准的主从表了。但现在因为有两个从表同时循环展开。这就要求数据集在报表上展开时能够再进行数据的处理了。想详细看看这两个示例的朋友可以到北京方成公司的网站上在线试用或下载到本地试用。 5 一个梦想 比如拿到一个报表,先看看分哪几块,每一块的数据来源如何,块与块之间的联系。能象人脑的思维一样来设置报表文件,定义数据集,设置简
19、单的公式便可做出报表,只有这样的报表开发工具才能真正地把程序员解放出来。 6 小结 本专题主要讲web报表开发工具的数据运算原理,即数据集的变换。大凡原理一类东西,总难免大而空。但它又确实是一个web报表开发工具的核心所在。按个人的感觉,基于条带状的报表开发工具必将慢慢的退出中国市场。相关链接: 上一个专题讲了报表数据运算原理方面的取舍。一个报表是由行和列组合而成的,因而一定要从报表运算原理上达到行和列方向上计算模式是一样的才好。即行列对称。不能象条带状报表工具一样,在行方向上的计算能力大大强于列方向上的计算能力。最好让行与列方向上的计算是统一的,不要为列方向上设立特定的交叉表计算模式。实际上
20、交叉表即是列方向上的分组报表而已。一个行列对称的web报表工具就不用专门考虑如何做交叉表了,只要将分组报表做好,交叉表也就做好了。所以本专题将深入地探究一下报表的分组问题。 数据分组,就是相同值放在一起。比如按部门分组,就是将部门字段相同的记录放在一起。对于标准的分组比较简单,因为SQL语句中就提供GROUP命令。但现实中有时会有一些不规则分组的情况。下面列举一下:1 随机分成多个区间,比如年龄字段分成:0到15,15到30,30到40,40到50,50以上。如下图所示:当然这种分成多个区间的情况也可以通过写复杂的SQL语句来实现,考虑到SQL语句还要实现其它一些逻辑,所以这样的话会大大的加大
21、写SQL语句的工作量。实际上这种分多个区间的不规则分组还是有些规律的。所以最好还是象e表这样专门做一个函数来解决这种情况比较好。下面列出这个函数的说明: scope 函数说明: 根据完全划分进行分组 语法: datasetName.scope( selectExp, listExp, filterExp, eqExp, ascExp ) 参数说明: selectExp 取值表达式 ListExp 返回同valueExp数据类型相同的数组,要求其中元素从小到大排列 filterExp过滤表达式 eqExp 返回布尔值的表达式,缺省为false,表示与元素比较时不包含等于 ascExp 返回布尔值
22、的表达式,缺省为true,表示listExp返回的数组按从小到大排,否则为从大到小排 特别说明: ascExp为true(即listExp从小到大排列)时,eqExp为true时,与元素比较时采用=,eqExp为false时,采用=,eqExp为false时,采用 示例:ds1.scope(age,15,30,40,50)2 前面枚举几个固定值,最后来一个其它。比如产品分组为:CPU,内存,硬盘,其它。即其它类中的内容为除CPU,内存,硬盘这三个之外的所有内容。这也是中国式报表中的一种常见的不规则分组。3 地区分组时,象这样:北京,河北,山东,其中:青岛,江西。即在山东后面要加上一个青岛,其它
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- web 报表 打印 系统 解决方案
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内