专栏作品
利用XML实现通用WEB报表打印
卢彦
方案适用性
.
1. 远程数据打印。需要打印的数据并不在本地,必须进行远程读取。
2. 需要精确控制打印效果,包括页面格式,分页,附加条目,表格等。
3. 出于安全性考虑,不能直接连接到数据库。
方案原理
其实原理很简单,通过XML强大的自定义功能,我们便能方便的自定义出我们所有需要的格式控制标签,在服务器端进行动态编码后通过WEB服务器传到客户端,然后在客户端进行格式解析,根据服务器端定义的打印格式从客户端直接控制打印机打印出我们需要的报表。
技术选择
由于报表打印比较复杂,为了能够精确控制打印格式,不能采用WEB浏览器页面打印的方式进行报表打印工作,只能采取自编程控制客户端的打印工作。由于.NET framework的winform可以直接嵌入到网页中,我们在这里选用了该技术,但是请注意,我这么做并不代表.NET winform是唯一的选择,其实您可以采用任何客户端代替它,例如Java Applet或者ActiveX,甚至是一个普通的应用程序都能行。
不允许直接连接到数据库,因此只能采用XML文件进行中间数据交换格式,通过普通WEB服务器的默认80端口进行数据传输。事实上,我简直找不到其它更理想的方案了,当然,web service也许能算是一种,但是它采用的是SOAP传输数据,从原理上看,应该和我们采用的XML属于同种类技术。
再补充说明一下我为什么要采用.NET编写的受控组件,优点在于:
1. 它不需要进行客户端注册。相对于ActiveX的一个大优点。
2. 比ActiveX安全性高。在.NET Common Language Runtime的控制之下运行
3. 编写方便。我喜欢C#和Visual Studio .NET。
4. 有很强大的打印控制功能。利用.NET framework类库。
5. 直接支持XML技术。
6. 和IE兼容性高。同为Microsoft公司产品。
另外,需要注意一点就是,在.NET framework sp1和sp2中默认的安全级别是不能直接运行受控组件的,但是在.NET framework 1.1 beta中又改了回来,可以直接运行了。
服务器端您则可以采用现有的服务器系统和数据库,不需要新添加任何新硬件设备和新的.NET服务器管理人员,他们往往是些要求拿高薪的家伙。 :)
服务器的工作流程为:
1. 接受客户端的标准XML模版查询。
2. 需要根据查询要求将数据库数据格式转换成标准的XML数据格式。
3. 将XML数据通过80端口发送出去。
可行性分析
由于现在的大部分数据库都支持XML格式的数据查询和转换,如SQL Server 2000,Oracle 9i,IBM DB2等大型关系型数据库。只需要通过简单的设置就能直接进行XML数据转换工作。如果数据库不能支持直接XML数据转换,也可以籍由一些服务器端脚本程序进行脚本转换工作,比如JSP,ASP,PHP等等。
客户端也不需要任何特殊的设置工作,仅需要安装一个大小为21M的.NET framework分发包,然后直接打开网页就可以进行工作。也没有操作系统限制,从windows 98到windows xp都能很好的支持。
伸缩性和安全性
伸缩性
由于采用的是XML标准数据格式作为中间数据交换,因此本解决方案具有非常好伸缩性,例如,客户端的.NET控件可以采用JAVA APPLET、ACTIVX或者是VB,VC等编写的客户端应用程序直接替换。服务器也可以任意选择采用IIS或APACHE等WEB服务器。数据库也可以采用任意一种数据库。包括SQL Server,Oracle或者是Access等。这点上文已经谈到过,因为文章的长一点并不会使送给我的T恤大一号,这里再强调一遍只是为了加深读者对XML的跨平台性的认识。 :)
安全性
由于采用的是普通WEB服务器传送数据,因此可以直接采用SSL安全套接字等已经成熟的WEB加密技术。同时还可以对XML进行数据算法加密,在客户端再进行解密,保证了传输的安全性。
由于采用的是80端口,不需要再另外新增加专用端口,减少了安全漏洞的可能性,同时还能方便的穿过双方的的网络防火墙等保护设备。
方案设计图
格式定义
为了能自己控制打印的格式,我们定义了下列的格式标签,其中在命名上参考了HTML的命名办法,所以基本上熟悉HTML的都能一看就能明白标签的具体含义。如果您觉得这些标签的表达能力还不够强,您还可以自己定义一些更多更精确的格式标签。
主要标签说明:
text:文本字符串
属性:
x:打印输出的X坐标
y:打印输出的Y坐标
fontname:字体
fontsize:字体大小
fontcolor:颜色
b:是否为粗体
i:是否为斜体
u:是否有下划线
table:表
属性:
x:打印输出的x坐标
y:打印输出的y坐标
border:边框粗细
bordercolor:边框颜色
maxlines:每页最大行数
tr:行
属性:
height:高度
td:列
属性:
width:宽度
align:对齐方式
fontname:字体
fontsize:字体大小
fontcolor:字体颜色
b:是否粗体
i:是否斜体
u:是否下划线
bgcolor:背景颜色
next:下一页
tablehead:表头
tablebody:表项
tablefoot:表底
page:页设置
PrintWard:横/纵向打印
PageType:纸张类型
PageLeft:左边距
PageRight:右边距
PageTop:上边距
PageBottom:下边距
标签应用示例:
<root> <pagesetting> <Landscape>true</Landscape> <paperkind>A4</paperkind> <paperwidth>210</paperwidth> <paperheight>297</paperheight> <pageleft>0</pageleft> <pageright>0</pageright> <pagetop>0</pagetop> <pagebottom>0</pagebottom> </pagesetting> <reporttable> <text x="450" y="40" fontname="黑体" fontsize="24" fontcolor="Black" b="true" i="false" u="true">最新成交合同信息</text> <text x="70" y="100" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="true">制表时间:2002年0月10日</text> <text x="910" y="100" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="true">单位:元</text> <table x="65" y="130" border ="1" bordercolor="Black" maxlines="28"> <tablehead> <tr height="25"> <td width="90" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">合同号</td> <td width="90" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">产品名称</td> <td width="50" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">成交量</td> <td width="50" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">成交价</td> <td width="50" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">成交金额</td> <td width="50" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">挂单量</td> <td width="50" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">起始价</td> <td width="330" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">卖方</td> <td width="330" align="center" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">买方</td> </tr> </tablehead> <tablebody> <tr height="25"> <td width="100" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">20021010015</td> <td width="100" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">CNR</td> <td width="70" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">93</td> <td width="70" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">6680</td> <td width="70" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">621240</td> <td width="70" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">93</td> <td width="70" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">6680</td> <td width="200" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">湖北省国营新星拖拉机厂</td> <td width="200" align="left" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="false" bgcolor="White">中化国际贸易股份有限公司</td> </tr> ………. </tablebody> <tablefoot> </tablefoot> </table> </reporttable> </root>
注意事项:
a) 如果采用服务器脚本动态生成XML文档时,发送内容类型应该设置为text/xml(普通html页面为text/html),字符编码应该为UTF-8,否则会出现编码错误问题。
b) 应该严格按照XML规定的格式来生成文件,否则XML解析器将不会予以解析。
2. 客户端
可以采用任意应用程序来读取服务器端生成的XML文件,如果采用VB、DELPHI等桌面应用软件开发工具,则可以使用MSXML的COM解析器。推荐采用.NET,内部已经集成了XML解析器,直接就可以通过使用.NET类库调用。既可以做成桌面应用程序形式,通过远程调用;也可以嵌入到IE浏览器中,直接在网页中运行。
效果示例图
打印预览
注意事项:
2. 如果采用嵌入到网页中的形式,那么本程序需要编译成一个控件形式(一个扩展名为dll的文件),然后在网页中插入以下标记:
<object id="print" classid="http:print.dll#Print.UserControl1" Width="728" Height="460"></object>
将控件嵌入到一个静态或动态网页中。然后将该控件文件拷贝到和该网页相同的目录中(标记中Print.dll为生成的控件文件名,Print.UserControl1为该控件的命名空间NAMESPACE)。
总结
好了,文章到这里基本上就算完了。也许有人会觉得奇怪,你还没有讲清楚如何写具体的打印代码呢。其实,本文只是提出了一个关于WEB报表打印的解决方案,正如上文所说,如何去实现客户端的打印其实有很多种选择,再深入下去的话就超过了本文讨论的范围了。我希望本文能起到一个抛砖引玉的作用,能为大家提供一个问题的解决办法。当然,如果希望获得本文源码的朋友请与我联系:
nluyan@163.net,谢谢。
分享到:
相关推荐
利用XML实现通用WEB报表打印
利用XML实现通用WEB报表打印.doc
总结: 改压缩包 完全是自己整理 直接放入tomcat 或者另外服务器 就能使用, 数据库的链接只需要改动 WEN-INF下面的 reportConfig.xml 文件就行, 利用设计器 设计好后 把RAQ 文件直接放入 reportFiles 文件夹中就能...
DownloadFilesservicedownload.htm 软件介绍: 版本: V2.0源码版概述: 本程序为通用打印程序,单据、会计凭证、发票清单、报表、任意复杂表格、合并表格如工矿企业合同都可以由系统提供的几个默 认打印对象组合...
4.Report XP功能完善以后可以通过下载xml格式报表文件到本地打印或者通过applet读取服务器上的报表文件直接从浏览器打印 从而解决web应用的网络报表印刷问题 5.Beta版本程序提供常用的报表线条,矩形,文本框...
连接数据库,XML或文本文件,并利用电子表格通用性和功能来自动化格式,计算和分析数据。 ·传送真实的Excel文件报表 请不要只认为是打印静态数据或CSV文件到Excel中!动态生成真实的Excel文件,具有精确的列,...
14.2 利用jquery框架实现的经典运用 14.3 实现仿google suggest功能 14.4 google suggest功能的相关javascript代码 14.5 小结 第15章 在线文件上传和下载(struts 2.x+fileupload) 15.1 在线文件...
用户登录、邮件管理、报表设计、图片管理、在线投票信息发布和管理等通用功能模块,Blog和在线购物项目案例,C#应用程序的打包发布和安装,数据库以及项目案例的升级。 本书不仅适用于使用Visual C# 2005进行...
您也可以建立报表web接口与Servlet Engine 集成,也可以与JavaMail集成,以通过电子邮件传递报表。您可以编写基于Java 2的客户端应用程序,通过API来生成报表。 ·报表请求控制器 报表请求控制器管理外部客户端...
96.如何使用ASP实现Web数据统计和报表 97.如何在查询结果中搜索 第6章 数据验证 101.如何在ASP中使用正则表达式 102.如何验证字符串为空(示例一) 102.如何验证字符串为空(示例二) 102.如何验证字符串为空...
10.4 利用报表生成器设计报表 实例292 简单报表 实例293 分组统计报表 实例294 主明细报表 10.5 打印邮寄单 实例295 打印汇款单 实例296 打印信封标签 10.6 打印证件 实例297 批量打印工作证 实例298 批量...
10.4 利用报表生成器设计报表 实例292 简单报表 实例293 分组统计报表 实例294 主明细报表 10.5 打印邮寄单 实例295 打印汇款单 实例296 打印信封标签 10.6 打印证件 实例297 批量打印工作证 实例298 批量...
cc实例051 利用ListBox控件实现标签式数据选择 cc实例052 在ListBox控件间实现数据交换 cc实例053 列表项的提示条 2.4 ComboBox控件典型实例 cc实例054 将数据表中的字段添加到ComboBox控件...
cc实例051 利用ListBox控件实现标签式数据选择 cc实例052 在ListBox控件间实现数据交换 cc实例053 列表项的提示条 2.4 ComboBox控件典型实例 cc实例054 将数据表中的字段添加到ComboBox控件...
cc实例232 在VisualcC++中执行事务 cc实例233 在程序中执行SQL脚本 cc实例234 利用 SQL语句执行外围命令 第9章 SQL查询相关技术 9.1 通用查询 cc实例235 SQL语句的应用方法 cc实例236 SQL语句的模糊...
技术、报表与打印技术、网络通信技术、PHP与XML技术、安全技术、PHP高级应用技术以及综合应用等。《PHP程序开发范例宝典》共提供了453 个实例,每个实例都突出实用性,绝大部分实例都体现了PHP编程人员在实际项目...
SharpRewriter:javascript + xml技术利用#实现url重定向 采用XHTML和CSS设计可重用可换肤的WEB站点 asp.net的网址重定向方法的比较:面向搜索引擎友好 也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行...