1、CELL插件中如何实现客户端与服务器端交换数据用友华表的CELL插件是一款基于ActiveX技术的解决中国式报表显示和打印的第三方控件, 和其它第三方 ActiveX控件一样,用友华表 CELL插件只能运行在客户端,只能使用JAVASCRIPT、VBSCRIPT客户端语言操纵控件,进行直接处理客户端数据,而客户的数据都存放在服务器端,这势 必要求客户端的 ActiveX控件与服务器端进行数据交互.针对客户端ActiveX控件如何与服务器端进行数据交互,本文介绍了实现客户端与服务器端数据 交互必须的两个步骤如下:1、 将客户端CELL插件中的数据上传至服务器端的数据库方法:在客户端通过 Cell
2、的编程接口 SaveToBuffer得到数据保存在 XML,使用XMLHTTP 技术将数据传至服务器并保存在服务器数据库2、 将服务器端数据库中的数据显示在客户端的CELL插件中.方法:连接服务器数据库得到数据,通过Response对象将数据传送到客户端,再利用Cell的编 程接口 ReadFromBuffer展示在客户端.下面以简单示例说明如何具体使用CELL插件实现客户端与服务器端交换数据(示例采用A+JAVASCRIPT+VBSCRIPT 语言:注意:因为示例中用到 Cell插件的编程接口 (SaveToBuffer 和ReadFormBuffer) 因此需要使 用到VBSCRIPT语言
3、,具体请参见下面示例中的注意说明第一章:环境配置1.1硬件环境:操作系统:Microsoft Windows XP开发工具:Microsot Visual Studio 20051.2服务器配置:服务器运行服务器脚本,必须在服务器端安装WEB服务器。请安装IIS.1.3客户端配置:请使用IE 5.5及以上的版本.1.4创建工程:(1)新建工程:打开Microsot Visual Studio 2005创建新的项目工程.如下图:*. CelLVcb - licrosoft VisuaL Studio岳件© 編错g)視團世)网站 主威 调试工具 审口(!) 新建遡TJ 项目(I】Ctrl
4、+Shifl+S打开除)网站J文件CtrX+a11关砲从现有代码倉腔顶目(2)建立一个工程项目名称冈模檢:團運Visual Stndi o已安装的梗板iSF'.' NET"网站.塾ASF-HET VA服勞議6人网站初学若工具包Ji ASF. NET AJAX-Enabled tfel Site我的梗板储空网站ASP.NET Crystal Reports W. B .,.J按索联机模板.空_hSF.NET网站位置g;文件董毓v D:的览.语言:Yimd. C#1碣定n1 跖1建立工程完成后:会在Package Exp窗口下显示出新建的工程二3解决方案1(camebw
5、a亍项目)匕D ACelllebV二 App_DatsI- 日 Dffult. 4SJK百 Default.簪pic. z配置IIS:打开Internet信息服务,新建网站,别名设置Cellweb如图:文件世)操作查看迪帮助描迷伏态主机头名嬉默认网站正在运行哲Tiiternet信息服务-凰HBUFIDA-UWE工体地计算蔽 -网站-嬉默认网站L+ 妙 IISH»lp新逹Veb虚拟目录选择:选择”下一步”完成IIS的配置.(5)在Default.aspx页面中添加 CELL插件:直接将CELL插件的OBJECT标记添加至网页代码,如下图
注:如果用户升级 CAB包,先将原先服务器上放置7、的CAB包替换,再将 CodeBase属性中的Version设置为当前CAB包的版本号。用户再次访问时,IE会重新提示下载最新的 CAB包。第二章:实例详解前一章介绍了运行环境的配置,下面针对具体的示例程序进行详细分析 步骤1:保存客户端Cell插件上的数据到服务器数据库中步骤2:读取服务器数据库,将数据展示到客户端Cell插件上.步骤1:保存客户端Cell插件上的数据到服务器数据库中':完整工程资源管理器截图:解决方案费源管理器-解决方罕xCJ解决方案'忑口丹创才石个项目)-DACellTebX一 App_Dat»-aspx也 Default, aspx. csI
8、mydb. mdb-二KeadJBCell. asps:四spx. cstest, ell:Web. Config二 23l ttriteDBCftll. azpx.档 WrittDBCell- cs2.1打开报表模板在这里之所以在填充数据前要先有打开报表模板,一方面可以加快影响网页的运行速度;另一 方面,一旦更改报表样式后,就得修改程序代码,从而增加程序开发和代码维护的工作量;而在模 板中存放报表格式,查询和填充报表时先打开模板,上传数据和下传数据时只需传送实际的报表数 据,从而大大减少传送数据量和工作量;模板文件可以通过外部程序(可以使用CELL自带的报表设计器)设计,模板文件存放至服务器
9、端的某个虚拟目录下,使用CELL的OpenFile方法打开,文件路径可以是相对路径。(下载源码就到源码网:) 说明:OpenFile函数:在当前表格中打开 Cell文件。如果打开成功返回 1,返回值如果不等于 1,则表示 打开不成功,;此时还应注意如果是 WINXP或WIN2003的操作系统还应在服务器上进行MIME配置,具体可参见 CELL帮助中的“目录/FAQ/为什么打不开远程序文件” 一文。Default.aspx 页面定义了 Butto n1 的 on click 事件定义了 ope nfile()函数:
10、tton1” value="打开远程模板 ” onclick="OpenFile()">vscript type= "text/javascript" >Fun cti on OpenF ile()Var url= " http:/localhost/CellWeb/test.cll"docume nt.getEleme ntByld(DCellWeb1 ").Ope nFile(url,""说明:url为Cell模板文件放置在服务器上的路径,请参考示例
11、.运行openfile()函数截图:ABCDEFHIIL1 134567部门:I;办公室2006-10-1:编吕全勒医疗主旨生活津贴iW回末加班I童 乎长:息经理:越脣理祁:2.2 客户端 Cell 插件上(WriteDBWebCell()函数):Default.aspx 页面定义了 Butto n3 的 on click 事件定义了 WriteDBWebCell ()函数:
13、b WriteDBWebCell()dim Flag'利用Cell编程接口 SaveToBuffer将整个工作簿的内容以二进制(binary )的形式保存Flag=document.getElementByld("DCellWeb1" ).SaveToBuffer(buff)"MSXML.DOMDocumerjrt""Microsoft.XMLHTTP")falseif Flag>0 thenparseFile ="WriteDBCell.aspx"set xmldoc = createObject(
14、 set xmlhttp = createObject( xmldoc.async =falsexmldoc.resolveExternals =建立xml脚本节点Cell_Content保存buff.set roots = xmldoc.documentElementset xnode = xmldoc.createNode(1, "Cell_Content","")xnode.dataType ="bin.hex"xnode.nodeTypedValue=buffroots.appendChild(xnode)'使用 xm
15、lhttp 的 POS方法上传 buff 到 WriteDBCell.aspx 页面xmlhttp.open"P OST"parseFile, falsexmlhttp.send xmldoc'定义ReValue用于标识保存操作是否成功.ReValue = trim(xmlhttp.responseText)if ReValue= "1" thenmsgbox"保存成功!"elsemsgbox"失败!"end ifelseMsgBox"表格写入内存错误!"end ifend sub
16、9;2.4客户端填写报表并保存至服务器数据库.按照以上步骤,可按照实际的需求进行报表的填写并点击”保存数据”,触发WriteDBWebCell()函数函数定义在2.3中已经介绍,上传数据至页面WriteDBCell.aspx,WrteDBCell.aspx.cs 进行保存到数据库中的操作.具体代码如下:由于示例中使用到数据库mydb.mdb现在将数据库表结构截图如下:表T «O testBuffer *using System;using System.Data;using System.Configuration;using System.Collections;using Sys
17、tem.Web;using System.Web.Security;using System.Web.UI;using System.Web.Ul.WebControls;using System.Web.Ul.WebControls.WebParts;using System.Web.Ul.HtmIControls;using System.Data.OleDb;using SystemO;public partial class WriteDBCell : System.Web.UI. Pagetry/创建XmlDocumen接收Default.aspx 页面上传的数据.System.Xm
18、l.XmlDocument xmlDoc = new System.Xml. XmlDocument();xmlDoc.Load(Request.InputStream);string buff=xmlDoc.DocumentElement.SelectSingleNode( "Cell_Content" ).InnerText ;/ 定义方法 :WrieFile 保存数据 .if (WriteFile(buff)Response.Write("1" );elseResponse.Write("0" );catchResponse.W
19、rite("0" );private bool WriteFile( string buffer)try/ 创建数据库连接 .string sConn = " Provider=Microsoft.Jet.OLEDB.4.0;Data Source = d:CellWebmydb.mdb"OleDbConnection ObjsConn = new OleDbConnection (sConn);/ 定义 Sql 语句 .string sSql = "insert into test values('"+buffer+ &qu
20、ot;')" ;OleDbCommandObjcmd = new OleDbComman(dsSql, ObjsConn);ObjsConn.Open();/使用OleDbCommar将数据保存至数据库中.Objcmd.ExecuteNonQuery();ObjsConn.Close();return true ;catch ( Exception )throw ;手动填写报表数据,并进行保存.由于工程运行部分截图(IE页面过大,本截图展示了一部分望谅解.):部门:办公室编号蛙名到勤本薪全勤医疗职务主旨01王磊304000101100经理02高明302344101100职工0
21、3张伟303321101100职工04李兰301344101100职工05冯山30332110100职工06王鹏302213101100职工总经理:注意:(下载源码就到 源码网:)示例程序中,报表内容是手动填写的,因此在示例运行中,打开远程模板后,需要客户手动填写报表步骤2:读取服务器数据库,将数据展示到客户端Cell插件上.3.1 ReadDBWebCell()函数Defalut.aspx 页面定义了 Butto n2 的 on click 事件定义了 WriteDBCell()函数: 23、位 readDBCell.aspx 页面.set xmlhttp = createObject( "Microsoft.XMLHTTP")set xmldoc = createObject("MSXML.DOMDocumer)t"xmldoc.loadXML " 24、im(xmlhttp.responseText)' 使用 StringToByte 方法 , 读取数据展示到 Cell 插件中 .StringToByte(ReValue)end function'StringToByte 方法的定义 .Function StringToByte(mstr)set xmldoc = createObject("MSXML.DOMDocumen)t"set byteObj = xmldoc.createElement("byteObj" )byteObj.dataType = "bin.hex&q 25、uot; byteObj.nodeTypedValue = mstrBuff=byteObj.nodeTypedValue' 使用 Cell 插件的编程接口 ReadFromBuffer 将 3.2 中 readDBCell.aspx.cs 回送的数据库数据读取到 Cell 插 件中.document.getElementById( "DCellWeb1" ).ReadFromBuffer(Buff)end Function3.2 从服务器数据库中读取数据 ,并将数据发送回 Defalut.aspx 页面处理 . 通过 3.1 中 ReadDBWebCell() 函 26、数 , 定位到 readDBCell.aspx 页面 ,在 readDBCell.aspx.cs 进行读取 数据和回送数据的操作 , 具体代码如下 :using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using 27、System.Web.UI.HtmlControls;using System.Data.OleDb;using System.IO;public partial class ReadDBCell : System.Web.UI. Pageprotected void Page_Load( object sender, EventArgs e)try/ 创建数据库连接 .string sConn = " Provider=Microsoft.Jet.OLEDB.4.0;Data Source = d:CellWebmydb.mdb"OleDbConnection ObjsConn = new OleDbConnection (sConn);string sSql= "select * from test" ;OleDbConnection objConn = new OleDbConnection (sConn);objConn.Open();OleDbCom