讨论创建基于WSE的报表打印服务及其实现

报表打印|创建|报表打印

摘要:
看过卢彦先生的关于WEB报表打印实现文章的人,一定会为里面所提供的解决方案击节叫好,本文试图给大家展现一个更灵活的打印作业流水,并具有一定的实用性。建议大家在阅读本文之前先阅读卢彦先生的两篇文章,同时本文采用了微软的WSE(1.0)作为辅助工具,对此感到陌生的朋友,建议先参考一些概念性的文章,我在文章的最后列了一些参考资料和所需工具,大家可自行体会。

--------------------------------------------------------------------------------

目录
引言
软件原理
程序实现
注意事项
总结
参考资料

--------------------------------------------------------------------------------

引言:
WSE提供了一个非常方便的功能,就是支持附件的传输,尽管我们可以采用别的方式来达到这个目的,比如直接的返回byte型的数据,但是对于大多数应用而言,直接返回一个附件,如一张图片更为实在些,请大家不要误会我文章的标题,以为创建一个WEBSERVICE就可以方便地实现了打印了,我们的软件原理和最终打印的方式跟卢彦先生里提到的并无多大区别,我们只是利用了WebService的强大的穿透性,来使这个方式更为灵活,更易于应用和拓展,本文所采用的代码全部用C#编写。

--------------------------------------------------------------------------------

软件原理:
本文采用了XML形式的数据,客户端将需要打印的数据和一些基本的参数,如图象大小,图象形式等传送给服务器端,而服务器端则根据客户端的要求生成特定的一张或多张图片返回给客户端,由客户端的打印程序统一处理,看了这个逻辑我们就可以发现:所有的业务规则完全在服务器端运做,而客户端只需要少量的代码就可以实现报表的打印。这样就避免了各种升级所带来的烦恼,当实际运用中要求增加一种或多种图表的时候,我们所需要做的只是增加或者修改服务器端的业务规则,而客户所要做的只是告诉我们要打印这种图表就可以了。
本文采用了一些简单的XML数据,仅供示范用,客户端的Demo数据如下:
<?xml version="1.0" encoding="utf-8"?>
<Root PrintType="line" Width="450" Height="500" Title="Print Demo">
<Child Text="1" Value="100" Color="Black">
</Child>
<Child Text="2" Value="60" Color="Orange">
</Child>
<Child Text="3" Value="30" Color="Red">
</Child>
<Child Text="4" Value="40" Color="Gray">
</Child>
<Child Text="5" Value="90" Color="Blue">
</Child>
<Child Text="6" Value="60" Color="Green">
</Child>
</Root>

其中PrintType就是客户端要求的打印类型。
程序实现:
服务器端代码
本系统也同样采用了Abstract Factory的设计模式,以利于服务器端方便的扩展,此处就不再赘述。
新建一个Web服务项目,添加抽象基类,实现类,解析类,建成后的界面如下所示:
需要加入对Microsoft.Web.Services命名空间的引用

其中
PrintBase.cs是基类
Parser.cs是解析类
LinePrint.cs是实现具体图象的类
基类代码:
public class PrintBase
{
public PrintBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public virtual Stream DrawImage()
{
return null;
}
}

解析类代码:
public class Parser
{
public Parser()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public static PrintBase CreateElement(DataSet ds)
{
PrintBase pb = null;

string l_strPrintType = ds.Tables["Root"].Rows[0]["PrintType"].ToString();

switch(l_strPrintType)
{
case "line":
pb = new LinePrint(ds);
break;
default:
pb = new PrintBase();
break;
}
return pb;
}

}

实现类的代码:
由于此处代码较长,我只贴出部分代码供参考,大家可以根据自己的实际情况进行图形的绘制。
/// <summary>
/// 重载画的规则
/// </summary>
/// <returns>图象Stream</returns>
public override Stream DrawImage()
{
_ChartSize = new SizeF(float.Parse(ds.Tables["Root"].Rows[0]["Width"].ToString()),
float.Parse(ds.Tables["Root"].Rows[0]["Height"].ToString()));

Bitmap b = new Bitmap((int)_ChartSize.Width,(int)_ChartSize.Height,
PixelFormat.Format32bppArgb);

//初始化
_Graphics = Graphics.FromImage(b);

//以下省略,请自行绘制

//存储返回
MemoryStream s = new MemoryStream();
b.Save(s,ImageFormat.Png);
return s;
}

我个人一直比较喜欢用DataSet操作小型的XML数据,大家请按自己喜好调整,此处展示的方法将直接供Web服务类调用。
Web服务类的代码:
[WebMethod]
public bool CreateImage(DataSet ds)
{
bool l_bStatus = true;

try
{
PrintBase pb = null;

pb = Parser.CreateElement(ds);

Stream s = pb.DrawImage();

SoapContext sc = HttpSoapContext.ResponseContext;

sc.Attachments.Add(new DimeAttachment("image/png",TypeFormatEnum.MediaType,s));

}
catch
{
l_bStatus = false;
}

return l_bStatus;
}

至此,我们服务器端的代码就基本完成了,下面我们来看客户端所需要做的工作,我在此处建立了一个WinForm工程来做演示用,实际运用中,则采用卢彦文章里提到的usercontrol就可以了。
客户端代码:
private void butto

时间: 2025-01-31 05:50:43

讨论创建基于WSE的报表打印服务及其实现的相关文章

MS CRM 2011 创建基于Fetch的报表 -- 进阶版

在之前的文章中,我介绍了如何创建基于Fetch的报表,并使用数据预筛选功能.在这篇文章中,我们使用一个比较复杂的FetchXML来完成一个更有实际意义的报表. 在这个报表中,显示相关客户,客户的订单,以及订单的产品信息.报表使用了三个inner join,account inner join order inner join orderdetail inner join product. (1) 利用CRM的高级查找创建FetchXML 下载Fetch XML: <fetch version=&qu

MS CRM 2011 如何创建基于Fetch的自定义报表,并使用数据预筛选(Pre-Filtering)

在前一篇文章中,我向大家介绍了如何创建基于SQL的自定义报表.由于CRM http://www.aliyun.com/zixun/aggregation/16846.html">Online只支持基于Fetch的报表,所以我在这篇文章中再向大家介绍一下如何创建基于Fetch的报表,并使用数据预筛选功能. (1) 打开Business Intelligence Development Studio,创建一个新的report server 项目; (2) 在项目管理器中,右键单击Reports

《iOS 6高级开发手册(第4版)》——2.9节秘诀:创建基于URL的服务

2.9 秘诀:创建基于URL的服务 iOS 6高级开发手册(第4版) Apple的内置应用程序提供了多种可以通过URL调用访问的服务.可以要求Safari打开Web页面,让Maps显示一幅地图,或者使用mailto:风格的URL开始在Mail中撰写一封信件.URL模式指出现在冒号之前的URL的第一部分,比如http或ftp. 这些服务可以工作,因为iOS知道如何将URL模式匹配到应用程序.以http:开头的URL将在Mobile Safari中打开.mailto:URL总会链接到Mail.你可能

Dreamweaver 入门:创建基于表格的页面布局

dreamweaver|创建|页面 本文章介绍如何在 Macromedia Dreamweaver 8 中创建基于表格的页面布局.页面布局将确定您的页面在浏览器中会如何显示,例如,显示菜单.图像和 Macromedia Flash 内容将如何放置.表格是用于在 HTML 页上显示表格式数据以及对文本和图形进行布局的强有力的工具.您可以使用表格快速轻松地创建布局.在本教程中,您将在一个新的 Dreamweaver 文档中创建若干表格.这些表格的行和单元格实际上用作您将在以后添加的内容的"容器框&q

在WEB应用中报表打印的实现

web|报表打印 WEB应用中报表打印的实现 随着世界范围内Internet环境的形成,全球正进入一个以网络为中心的计算时代.Web模型是在传统的C/S模型的基础上发展起来的一种新的Browser/Server计算模式.Browser/Server模型简化了C/S中的客户端,客户端只需装上操作系统.网络协议软件及浏览器:而服务器端则集中了所有的应用逻辑,开发.维护等几乎所有工作也都集中在服务器端.这时的客户机被称为瘦客户机,服务器被称为肥服务器.而WEB应用中的客户端的报表打印则没有C/S模型那

逸创云客服:一款基于SaaS的云端企业服务工具

"SaaS先锋"系列是CSDN云计算频道打造的,致力于免费报道国内SaaS细分市场包括OA.CRM等领域的先锋企业,在前几期报道中,我们分别报道了纷享销客.Worktile.dayHR,市场反响热烈,众多SaaS初创企业纷纷加入我们的行列.今天为大家推荐的企业是来自美丽的天府之国成都,逸创云客服是一款基于SaaS的云端企业服务工具,用于企业对外的客户支持服务(售后服务)以及对内员工支持服务,近日已获得九合创投数百万人民币天使投资. 我们对客服系统的普遍第一反应就是在线聊天或者电话呼叫的

在DevExpress程序中使用条形码二维码控件,以及进行报表打印处理

在很多业务系统里面,越来越多涉及到条形码.二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码.二维码的标签,直接在流程中进行扫描处理,仅仅在界面勾选一些处理选项即可,极大提高工作效率,降低出错的几率.本篇随笔介绍如何在基于WInform的DevExpress程序中对条形码.二维码的处理,包括界面展示,报表打印等常规的处理. 1.DevExpress的条形码操作及报表打印 在15.1以上的DevEpxress版

使用jsp实现word、excel格式报表打印

excel|js|word|报表打印 因为ms word和excel的文档都支持html文本格式,因此可以先用word或excel做好模版,另存为Web页,然后将该html改成jsp,将数据部分动态填入即可,不用很辛苦的调整格式 word页面只要在jsp头设置如下指令:<%@page contentType="application/msword;charset=GBK" %> excel如下:<%@page contentType="application

使用WebSphere Application Server Feature Pack for Web 2.0创建基于Ajax的

使用WebSphere Application Server Feature Pack for Web 2.0创建基于Ajax的动态Web应用程序 简介 与 Web 2.0 相关的技术,比如 Asynchronous JavaScript XML (Ajax).Web 远程和 Web 消息传递等,在当今的 Web 应用程序中变得日益流行.与传统 Web 应用程序相比,基于 Ajax 的应用程序 可以提供更好的响应性和交互性.在那些并入了 Ajax 架构的 Web 应用程序中 ,用户不需要等待整个