我前一段时间开发一个B/S项目,需要用到打印功能,如是上网到处查找有关Web打印的控件(呵呵,我向来比较喜欢使用成熟的控件,这样用不着自己去开发,自己开发很多时候是费力不讨好,再说一个三五几百块的注册费用,俺还是付得起,自己去搞费上几天功夫,其工钱远不止这个数。),可是找来找去,挺让我失望的,真没想到一个Web打印有这么难吗,网上流传的商业Web打印控件,其复杂程度让我望而却步,不得不自己搞了一个Web打印控件,在项目中用起来挺顺心的,后来有几个朋友,也要用到Web打印的功能,我就把我这个控件发给他们,他们说用起来也挺不错的。
现在网上流传的Web打印控件,在我看来主要是分两种,一种是水晶报表派,一种是IE打印派。水晶报表派当然是以水晶报表为代表,这种的特点是先设计好报表文件,然后在程序中组织好数据源,调用报表文件,然后进行预览或打印。而IE打印派,国内的Web打印控件通常都是这一种,在用户客户端注册一个Activex控件,然后用JavaScript定义报表的格式,定义报表的数据内容(也可以通过URL读取),然后再用Windows的打印API进行预览或打印。
水晶报表作为微软推荐的报表工具,其功能强大,但是目前只能用于.NET平台,其通用版本的功能也有限制,比如不能直接打印,不能自定义纸张的大小等。而IE打印,我也下载过几个控件试用,发现其报表设计繁琐,既当爹又当妈的,既要用JavaScript定义报表的格式,又要组织报表的数据,仿佛一下子回到DOS时代,一个操作窗口,需要自己先计算好各显示的坐标,然后再一一的画出来,这样的报表设计用起来使人发狂,一二个报表还可以勉强对应,要是多做几个就累死人了,而且以后维护修改也很麻烦。
作为报表设计的核心,我想不论是C/S架构,还是B/S架构,无非就是两点,一是报表的数据源,二是报表的格式。无论报表多么复杂,都脱离不了这两点。作为报表的数据源,我们习惯用SQL语句产生,当然对于过分复杂的分析报表,有时候我们也不得不先产生临时表,通过较复杂的程序把数据组织好,再进行打印。报表的格式我们通常利用报表设计工具把报表设计好,然后作为文件保存。程序中打印报表,通常是先组织好数据集,然后调用报表文件,传递报表所需参数,最后进行报表的预览或打印。
C/S架构下的打印很成熟,用户一般只需单击按钮,就可以把报表预览或直接打印出来。报表的设计也很成熟,无论是古老的FoxPro,还是VB、Delphi都可以进行方便高效的报表设计,只要报表不是很复杂,工具熟练,一天做十几份报表都可以的。
我想作为B/S架构的报表也可以借鉴C/S架构的设计理念进行设计,坚持报表的数据源和报表的格式分开,用做C/S架构的报表工具来做B/S架构的报表,这样既可以做到C/S架构下报表设计的方便高效,又可以做到B/S架构的分布性。当然由于B/S架构的特殊性,现有的打印,特别需要用到自定义纸张大小和直接打印等功能,不得不采用Activex控件。
我按照用C/S架构的报表工具来设计B/S架构报表的理念,设计开发了自己的Web打印控件,为了适应中国式报表的划线,特意设计开发了6个设计按钮:缩放宽度最小、缩放宽度最大、缩放高度最小、缩放高度最大、水平首尾对齐、垂直首尾对齐,利用这6个按钮,则加上边框和对齐功能,就可以很高效很准确的划出表格线。
有了这个设计工具,我们就可以很高效的设计报表了,不再需要自己一笔一划的很原始的方式去画报表。但还需解决一个问题,就是服务端的数据和报表格式如何传递到客户端电脑。XML作为网络通用语言可以作为传递的载体,当然这其中要进行相应的转换,不同语言,不同数据库可能转换不一样,我在示例中详细列出了常用的语言和数据库如何进行转换,有兴趣的朋友可以下载回来,看一下就明白了。
我设计的这个Web打印控件当然也不是百分之百的完美,因为一次性把报表的数据传递给客户端,若数据过于庞大(我测试过打印50页报表,在2M的网络带宽也只要一二秒钟,因为数据量也只有一二百K,传送也会很快的。不过要是那种利用IE打印功能的所谓轻量级的打印控件,你就等着IE假死,再过一二分钟再有反应吧,呵呵。),则用户等待的时间过长,这个可以在程序中控制,检测数据超过多少页,提示用户分次打印就可以避免此问题。
报表控件本身有700多K,不过我觉得这个倒不是什么问题,就是2M的带宽也只需三四秒钟就可下载完,那些所谓的轻量级打印控件,也有200多K,只要报表控件好用,再大一点也无所谓,反正就下载一次而已。
报表控件跨浏览支持,支持常用的Chrome、火狐、IE、QQ浏览器、搜狗浏览器、360浏览器。
如有需要,请加入QQ群:218392762 或者请直接Q我:12988672 或者请加我的微信:dong0738
报表预览、编辑和下载的网址: http://www.lc-simple.com/PrintTest/