原文地址:
http://www.microsoft.com/china/community/Column/65.mspx
利用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浏览器中,直接在网页中运行。
效果示例图
打印预览
注意事项:
1. 如果采用.NET,客户端必须先安装.NET framework1.0运行环境,下载地址为:http://download.microsoft.com/download/.NETframesdk/Redist/1.0/W98NT42KMeXP/EN-US/dotnetredist.exe
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报表打印(转载)相关推荐

  1. 利用XML实现通用WEB报表打印 卢彦

    利用XML实现通用WEB报表打印(1) 卢彦 摘要 开发B/S结构的应用程序最头疼的问题可能就是报表打印了,由于只能采用浏览器来作为用户界面进行交互,所以不能精确控制客户端的打印机.而很多B/S结构的 ...

  2. 利用XML实现通用WEB报表打印(参考)

    原文地址: http://www.microsoft.com/china/community/Column/65.mspx 利用XML实现通用WEB报表打印 卢彦 方案适用性 . 1. 远程数据打印. ...

  3. ATGrid WEB报表打印控件/MIS报表控件

    ATGrid WEB报表打印控件/MIS报表控件 ATGrid报表控件/WEB插件[专业版],对EtCell进行了进行了全面的改革, 将会彻彻底底的解决你的报表问题,让你开发达到从未有过的轻松和喜悦- ...

  4. 几种web报表打印方案的比较

    web报表打印通常是系统的辅助部分,但是又必须解决,否则项目完成不了.下面来分析分析目前的几种常见的web报表打印方案. 一. 浏览器的菜单打印功能 这是最简单的,只需点击页面上的打印菜单,但是也是问 ...

  5. 利用JasperReport+iReport进行Web报表开发

    用JasperReport+iReport进行Web报表开发 序言 在非常多实际的项目里,报表都是当中十分重要的组成部分,比如把查询结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥 ...

  6. 利用itext包实现java报表打印_利用iText包实现Java报表打印

    在信息系统应用中,报表处理一直起着比较重要的作用.Java报表制作中最常使用的是iText组件,它是一种生成PDF报表的Java组件.本文讨论两种形式的PDF报表处理,一种是通过程序对象生成整个PDF ...

  7. 利用xml轻松读取web.config中的用户自定义节

    虽然vs.net2.0为我们提供了 ConfigurationManager.AppSettings["..."]; ConfigurationManager.Connection ...

  8. 明宇报表连接mysql_五种主流web报表对比:批量报表打印

    阅读提示: 文章中与FineReport软件使用的相关内容,基于软件的V7.0旧版本编写,不代表软件最新的使用方式. FineReport最新版免费试用:https://www.finereport. ...

  9. web报表开发技术专题八:总结

    以前上博客园时,我是最怕看到一二三四之类的系列文章的,没想自己也这样做了.实在是因为无法在一篇文章之中讲清如此多的东西,现在写了这些有关web报表开发的文章之后,还是觉得有很多方面没有涉及,基本上只是 ...

最新文章

  1. Java 线程同步 synchronized
  2. QT中个数据类型的转换
  3. HarmonyOS之bytrace命令的使用
  4. Java面试题中高级,javaif循环语句
  5. Java中Lambda表达式与方法引用和构造器引用
  6. wxpython 表格粘贴,wxpython在整个应用程序中剪切复制和粘贴
  7. Facebook悄悄参加星际AI大赛,然后输了 | 中国团队夺得第四
  8. 原生Servlet文件上传和下载Servlet多个文件上传
  9. 多变量微积分笔记10——二重积分的应用
  10. 中小型企业需用什么样的生产加工管理软件?
  11. 产品思维训练 | 为什么很多家喻户晓的品牌还要继续投广告?
  12. Git 工作常用命令行
  13. 毛玻璃效果的登录页面
  14. 柯布-道格拉斯效用函数下的pcr抽卡策略
  15. window服务如何通过程序如何打开谷歌浏览器并登陆指定网站_亚马逊如何看listing销量,亚马逊如何看销量排名...
  16. PC电脑装机知识分享
  17. 数据结构的基本概念习题
  18. 程序,人生,人生,程序。。。
  19. Visual Studio 2019 安装 MFC
  20. 【智能手表方案推荐】基于中科蓝讯BT8958B2 的 Smart Watch 方案介绍

热门文章

  1. LeetCode Power of Three
  2. 行为模式之Intepreter模式
  3. “玩转课堂”软件需求规格说明
  4. 05《软件需求模式》阅读笔记
  5. javascript中三个等号的意思
  6. 在Java中,采用类的默认构造函数构造对象的方法!
  7. C++中的 typedef Vec<uchar> Vec3b; 是何意?
  8. 文件不能断点 webstorm_详解python使用金山词霸的翻译功能(调试工具断点的使用)...
  9. 计算机控制系统的理论,计算机控制系统理论基础.pptx
  10. 带哨兵的冒泡排序_冒泡排序的优化以及快排过程及优化