Cell应用大全

更新时间:2024-03-05 12:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

华表Cell组件/插件使用大全

四川通信科研规划设计有限责任公司软研中心 叶建生

用友华表公司的Cell组件/插件从最初开发到现在已经时5年之久,用户已达到4000多,国产组件能达到如此的水平,不能不说他们付出了辛勤的劳动,取得了骄人的成绩。笔者使用Cell组件/插件技术开发已经有两年多的历史,从3.X用到现在的5.X,其间有一些心得和体会,不敢独享,特此贡献出来与Cell开发者共同研讨。

本文首先介绍Cell的一些基本使用方法,然后介绍这些年来笔者使用Cell的各种方法和一些建议。前面一部分是面向刚接触Cell的朋友的,非常简单,甚至远远比不上华表自带的Samples,之所以加上它是因为它是本文后面部分的基础。后面一部分谈了一些关于使用Cell的专题,它是笔者在多个项目开发过程中逐渐总结、摸索出来的。如果你觉得前面的部分太过浅显,可以直接跳到第二部分。

Cell从3.X到5.X,接口发生的变化非常大。一些属性的写法和用法少有相同。到笔者开始撰写本文为止,华表正在推广的Cell最新版本是5.1,因此,本文所指Cell组件/插件技术均针对此版本,文中的大部分源代码均基于Cell插件5.1.1031。如果你使用的是不同版本,请参阅帮助文档的相关部分。

1. Cell组件/插件的基本使用方法

1.1 Cell组件/插件的安装

使用Cell组件/插件(以下均简称Cell),第一步是得到Cell。华表的官方网址是www.cellsoft.cc,可以到上面去下载一个试用版,当然,如果你是正版用户,你一定已经得到该产品光盘、说明书和一张写有序列号的使用许可证。 第二步是安装Cell。运行下载的安装文件即可,不需要执行下列步骤。

另外一个方法是将Cell的几个ocx文件和dll文件拷贝到本机某目录下,然后在命令提示行中输入 regsvr32 CellCtrl5.ocx (Cell组件) 或 regsvr32 CellWeb5.ocx (Cell插件) 即可。 Cell的文件中,如果使用Cell组件,则必须将CellCtrl5.ocx、Chart10.dll和12个以H开头的Dll文件拷贝到本机可搜索路径下,使用Cell插件需将CellWeb5.ocx和Chart10w.dll拷贝到相应目录。另外有个文件RWXls.ocx是用来读写Excel文件的,如果你不需要这个功能,也可以没有这个文件。当然,你最好有Cell的帮助文件CellCtrl.chm,这样你查起Cell的属性、事件和方法时才不至于很费劲。

安装完毕,即可在各种开发工具中使用。

1.2 Cell组件/插件的简单使用

1.2.1 在Delphi/C++Builder中的使用方法

在Delphi/C++Builder中使用Cell,需要首先导入这个ActiveX控件。以Delphi6为例,在C++Builder中的使用方法相同。如下图所示。

执行Install后,会在ActiveX面板上看到CELL组件的图标。这时新建一个工程并新建一个窗体,就可以往上放Cell组件了。

你可以放一个按钮在窗体上,再放一些操作Cell的代码体验一下。例如:

Cell1.SetCols(10,0); Cell1.SetRows(10,0); Cell1.MergeCells(1,1,10,1); Cell1.SetCellAlign(1,1,0,36);

Cell1.S(1,1,0,’哈哈,我可以随心所欲调用Cell组件了!’); Cell1.D(1,2,0,256);

1.2.2 在JSP/ASP/ASPX/HTML中的使用方法

对于B/S结构的程序,要使用Cell插件。Cell插件的使用方法与Cell组件大致相同。需要注意的是它是一个ActiveX控件,运行在客户端,不能用服务器端代码来访问和调用。

为了使客户端在使用Cell插件时能自动下载并安装OCX,需要为Cell插件指定CODEBASE属性。如:

其中的链接指向cab的位置(可以指向任一可访问地址)。你可以从华表的官方网站上(http://www.cellsoft.cc/ufhbsite/chinese_ver/downcenter.asp)下载这个cab文件,然后放到某一虚拟目录下。

不管是Jsp还是Asp/Aspx,它们使用Cell插件与在Html中使用都是一个原理:使用javascript或vbscript客户端代码来调用。安装Cell插件后,有个例子叫”华表网络版(采用Cell插件开发)”,里面各种方法的调用差不多都很齐全。这里列出一个非常简单的页面代码。

CellWeb Test

CLASSID=\CLSID:3F166327-8030-4881-8BD2-EA25350E574A\ CODEBASE=\cellweb5.cab\OBJECT>

cell.SetCols(10,0); cell.SetRows(10,0); cell.WndBkColor=16777215; cell.S(1,5,0,\中文字符\cell.D(2,6,0,255);

1.2.3 在DotNet中的使用方法

DotNet环境中使用Cell,要看应用程序的种类。如果是Windows应用程序,首先需要引入Cell控件。

在“工具箱”的某一种类(如“windows窗体”)中单击鼠标右键,选择“自定义工具箱”,弹出下图所示对话框:

在对话框中选中Cell50Control并单击确定,工具箱中就加上了Cell组件。

新建一个窗体并在窗体中加入Cell组件,即可在程序中调用(这里不再列出源代码)。 如果是Web应用,就是ASPX应用,直接使用1.2.2的方法。当然,也可以与使用Cell组件一样的方法把CellWeb5添加到你的Web窗体工具箱中。设计Web窗体时,可以直接将Cell插件拖放到窗体上。

2. Cell组件/插件使用的高级话题

2.1 使用Cell组件/插件查询数据库中的数据

Cell组件/插件(以下简称为Cell)提供了直接连接数据库查询数据的方法RSDefDBSet。它能连接数据库并查询数据。示例代码如下(Javascript):

var dbset = cell.RSDefDBSet(\Security Info=True;User

ID=sa;Initial Catalog=Northwind;Data Source=localhost\\\

if (dbset == -1) {

alert(\定义数据集失败\

}

return;

cell.RSLinkSet(1,1,0,dbset,1,10,10,3); cell.RSAccess(1,1,0,5); cell.RSDeleteSet(dbset);

这段代码的意图是定义数据集,并链接到表格区域,然后再展开数据(具体的方法参考请参见Cell插件的联机帮助)。

但是,通过这种方法查询数据时,由于连接字符串写在script中,安全性并且数据展现方式不够丰富,往往不能满足用户的要求。手工查询数据再展现到CELL中就成为必要的工作。本文不讨论如何在开发工具中连接数据库并查询数据。要将数据写入Cell中,只需要反复调用SetCellString和SetCellDouble(在Cell插件中可以使用S和D)即可。需要说明的是,当数据有多行时可能要插入多行,这时可以调用Cell的InsertRow方法,而它在插入一行时,会将上一行的格式应用为插入行的格式,这样就可以只设置一行的格式,在它后面插入的行都会使用相同的格式(包括字体、字号、颜色等等)。

2.2 用XML作为辅助模板

为每个报表写一段程序是很辛苦的事。我们可以写一个程序,通过它读取事先定义模板,并生成报表结果。这样,用户提出新的报表需求时,只需要新做一个模板即可,不需要改程序。

模板的设置方式可以有很多种。较为复杂的要求是需要记录每个单元格的格式整个表格的设置(如打印参数等),这时就需要将Cell文件保存下来作为模板,再辅以数据连接等配置文件。简单的方式可以使用XML文档作为辅助模板,通过分析XML来得到结果。

XML模板的定义方式也可以有很多种。可以在模板中记录单元格的格式、数据、公式等等。下面的例子只为说明问题,所以只记录了格式模板的位置(即首先需要打开哪个文件)、数据的位置(即该数据展现到表格中时的纵、横坐标位置)以及为了生成xml数据的字段标识。

这是xml模板的DTD定义:

xmlns CDATA #REQUIRED X (#PCDATA) #REQUIRED Y (#PCDATA) #REQUIRED Name (#PCDATA) #REQUIRED

这是作为例子的一个XML模板:

http://localhost/WebReport/test1.cll

下图说明本例的结构及各元素之间的关系:

需要说明的是,以下代码可正常运行于Internet Explorer6.0,如果运行时出错,可能是IE版本太低的缘故。

对于客户端(即浏览器端)而言,当用户打开报表页面时,客户端xml数据岛到Web服务器端请求生成xml数据,得到数据后,通过Javascript对xml文档对象的处理,解析求得Cell模板的位置。然后在Cell插件中打开Cell模板,并遍历xml文档中的Datas节点,分别将每个数据填入相应的单元格。下面列出源代码的主要部分:

[XMLCell.html]

Cell报表

CLASSID=\CLSID:3F166327-8030-4881-8BD2-EA25350E574A\OBJECT>

实际上,因为Cell提供了操作变量的若干方法,因此可以通过Cell的变量来求得在xml中指定的X、Y坐标。这样xml的结构就大大简化了。本文不另举例说明,感兴趣的读者不妨自己去试试。

对于服务器端而言,它接受客户端的请求,通过查询数据库生成包含数据的xml,并将结果作为Response传回至客户端。下面的代码使用的是asp技术,其它如jsp/php/aspx等等使用的方法相同,只是代码语法不同而已。

[ReportXml.asp]

<%Response.ContentType = \xml\

dim xmldoc dim str

set xmldoc = CreateObject(\xmldoc.async = false

str =Server.mappath(Request(\xmldoc.load str if xmldoc.xml <> \

'在此处理xml文件,例如根据Request的参数修改xml节点的值

'通常需要查询数据库以生成xml '因不同的报表要求不一样,此处从略 end if

Response.Write xmldoc.documentElement.xml Set xmldoc=nothing

%>

xml文件中的Name属性是用来方便查找数据方便而设的。 下面是页面运行时的截图:

这样我们就完成了通过xml模板+Cell模板+服务端代码=>报表结果的代码实现。 但这样就有个问题出现。在ReportXml.asp中,文中已被省略的代码部分很显然是根据报表的不同而不同的,所以需要添加新报表时,还得添加一段代码到ReportXml.asp里面去。

有没有办法彻底解决这个问题?答案是肯定的。方法之一是将这段代码保存到xml模板中去,而在ReportXml.asp中处理这些代码,诸如处理SQL查询等等。而如何灵活生成这样的xml模板并采用什么方法来处理,正是我们这些程序员需要思考、摸索实践的问题。笔者虽然在几个项目中有一些现在的方案,为了不束缚读者的思维及版权原因,不在此处详述。

当然,你可能也看到了,这里处理的报表需要每一单元格指定一个数据,它不适合多记录式的报表。不过没关系,下面的这个例子提供了一种方法来做这件事。

本例的结构与上例相同。不同的是它们使用的xml框架和处理方式。 这是XML模板的DTD:

本文来源:https://www.bwwdw.com/article/p7oa.html

Top