生活就好像一盒巧克力

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
第二章第三节 编程模型要点
     现在总结一下我们对电子表格组件的介绍,我将讲述(电子表格)控件编程模型的各个要点,以便您了解如何运用这个控件,以及当您需要编写脚本来实现不同的功能时该如何去做。本节不是编程模型的完全指南――那将会是另外一本书。在这里会介绍常用的属性和方法,每个属性和方法会附带一段简短的描述。如果需要了解编程模型的更多信息,可以参考Msowcvba.chm文件中的联机帮助,它位于Office目录的本地化目录下(对于英语语系的人来说,一般是Program Files\Microsoft Office\Office\1033目录)。
     如果您已经非常熟悉Excel的编程模型的话,您会发现它和电子表格组件的编程模型非常相似。
 
在脚本中使用枚举
     COM和OLE自动化允许组件定义枚举,每个枚举都是指定的一组常量,作用类似编程语言中的类型声明。可以将一个枚举用作属性或方法的参数,这使得如VB和VC这样的环境能够显示包含一个枚举中有效常量的语句完成下拉列表 (译者注:语句完成功能指开发环境会建议开发者如何完成一行代码,使开发者不需要记住对象的所有成员)。OWC和其它许多ActiveX控件一样,包含了一系列预定义的枚举。
     不过,在例如web页面或asp页面这样的脚本环境中,不存在类型的概念。因此,在现有的这些脚本语言中不能使用枚举成员名称,因为这些语言无法知道一个特定的常量(例如ssHAlignLeft)对应的是什么。这意味着您的VBScript或ECMA脚本代码会因为不能自描述的神秘数字而混乱不堪(译者注:指程序中大量的数字常量造成程序很难被读懂)。
     为了尽量解决这个问题,所有的owc组件都有一个名为Constants的顶级属性,在脚本语言中可以使用这个属性访问组件的各种枚举成员。例如,如果您需要在VBScript代码中使用ssHAlignLeft常量使一个单元的内容居左显示,您可以这样书写代码:
MyRange.HAlignment = Spreadsheet1.Constants.ssHAlignLeft
为了使用一个枚举常量,您可以把它当作Constants对象的一个属性来引用它,而对象将返回枚举成员的正确的值。
请注意,如果您计划在您的函数的多处使用常量对象,那么设置一个等于Constants对象的变量是很有用的,这样做既避免了不必要的打字,也能够提高性能。例如,您可以这样书写代码:
Set c = Spreadsheet1.Constants
MyRange.HAlignment = c.ssHAlignRight
MyRange.VAlignment = c.ssVAlignBottom
Constants对象只在没有枚举概念的脚本语言中有意义。如果您是在VB,VBA或C++中编写代码,请象平常那样直接使用枚举,不用理会Constants对象。
将数据输入组件
     之前我已经讲述了多个将数据输入组件的技巧。我现在将更详细的描述编程模型中的这些技巧。表2-1列出了与装载数据相关的属性和方法,所有这些属性和方法都通过电子表格对象的接口公布。
表 2-1. 装载数据相关的属性和方法。
属性或方法
描述
Spreadsheet.DataType
字符串类型的属性,告诉电子表格组件在多个用于装载数据的属性被设置时,应该使用哪个属性来装载数据,您赋给这个属性的值就是您应该用来装载数据的那个属性的名称――例如,将这个属性设置位HTMLURL,会使组件装载从属性HTMLURL中的URL处 获得的数据。
Spreadsheet.HTMLData
字符串类型的属性,可用来获得或设置HTML表格格式的电子表格内容。这种格式也包含了额外的属性和XML标签,这些属性和标签是用来保留重建电子表格模型所必须的信息(例如一个单元公式)的,不过它们不属于HTML3.2的表格格式。您可以将这个属性设置为包含了一个HTML表格的一个字符串,或者在需要保存时通过读取该属性值来获得电子表格完整的内容。
Spreadsheet.HTMLURL
字符串类型的属性,包含了一个URL,可以从这个URL处装载电子表格的数据。这个URL必须返回一个包含了表格的HTML文档。使用Excel 2000中来保存为HTML格式的电子表格可以使用这个属性来装载,这个属性也可以是一个从数据库中实时生成表格的ASP页面或CGI程序。
Spreadsheet.CSVData
字符串类型的属性,和属性HTMLData类似,不过它接受和返回的数据的格式是CSV。当需要从不能发布HTML格式的老系统中装载数据时这个属性很有用。
Spreadsheet.CSVURL
字符串类型的属性,和属性HTMLURL类似,不过它希望从URL处获得的数据格式是CSV格式的。就象HTMLURL属性一样,这个URL可以是一个从数据库中实时生成表格的ASP页面或CGI程序。
Spreadsheet.LoadText
 
可以将一个被分隔的文本文件载入电子表格的方法。与CSV格式不同的是,这个文本文件可以使用任何字段分隔符。Range对象也可使用LoadText方法和它的兄弟方法ParseText,来将文本载入电子表格的一个指定的区域中。LoadText方法可以指向一个您本地文件系统中的文件或指向一个URL。
 
 
 
 
 
 
使用区域
     电子表格组件中最常使用的编程接口是Range对象。很多方法都返回Range对象,当需要对一个区域的各单元进行修改,格式化,排序和设置自动筛选时,都会用到Range对象。表2-2显示了在你建立电子表格组件的解决方案时应该了解的Range对象的属性和方法。
表 2-2. Range对象主要的属性和方法。
属性或方法
介绍
Spreadsheet.Range
该方法接受一个区域引用(例如A1:B2或A:B),返回一个Range对象。因为一个区域可以只有一个单元,因此您也可以传入单个单元的引用(例如A1)。该方法也可以接受两个不同的单元引用,而返回一个含盖这两个单元的区域。
Range.Address
该属性返回一个区域的地址(例如,A1:B2)。
Range.Cells
当我首次看到这个函数时,我非常迷惑,因为它被定义为返回另一个Range对象。不过,您可以将该属性当作多个单元的一个集合,也就是说您可以使用For Each循环访问其中的每一个单元。该属性也可以以二维数组的形式来访问。例如,MyRange.Cells(1,3).Value会返回区域中行1,列3的值。电子表格和工作表对象也有Cells属性,因此您可以使用它代替前面提到的Range方法来访问指定单元。
Range.Column, Range.Row
这些属性指出区域中首行和首列的编号。当您在一个区域的行和列中进行迭代时,如果需要知道当前位于哪行哪列,这个属性非常有用。
Range.Columns, Range.Rows
虽然在名称上和前两个属性非常相似,但是这对属性返回的是Range对象包含的行或者列的集合。Range.Columns.Count和Range.Rows.Count可以告诉你当前区域中行和列的数目。
Range.HTMLData
该属性和Spreadsheet.HTMLData属性相似,不过Range对象的这个属性是只读的。使用它可以快速获得一个给定区域中数据的HTML表格的表现形式。
Range.Value
该属性获得或设置区域的值。虽然帮助文件说在区域由多个单元构成时Range.Value会返回一个二维变量数组,但实际上当前版本中这是没有实现的。不过,Range.Value可以接受一个二维数组的变量,来将数据输入区域中,当你需要使用文字值设置一个或多个单元值,或者是需要获得一个单元的无格式的值时,可以使用这个属性。(译者注:无格式的值指没有经过格式化的值。)
Range.Formula
该属性读写一个单元的公式字符串。当您需要获得或设置区域中一个或多个单元的公式时可以使用这个属性,记住在公式的开始使用等号(=)。
Range.Text
Range.Text属性返回Range.Value属性的格式化版本。当您需要在消息框或另一个用户界面元素中显示格式化的值时这个属性很有用,该属性值就是您在添加AutoFilter对象的过滤条件时传入的值。(译者注:也就是说,过滤是根据一个单元格的表面值进行过滤的)
 
格式化
在将数据载入电子表格后,您可能需要通过编程来控制格式化。每个单元都有自己的字体,对齐方式,边框,颜色和数字格式属性,所有这些特征都可以使用表2-3中的属性来设置。
表 2-3. 用于格式化的属性。
属性
描述
Range.NumberFormat
字符串类型的属性,控制单元中数字的格式。您可以引用现有的格式名称来使用众多的内置格式(例如Currency)。也可以创建自定义格式(例如,#,###,使1000显示为1,000)。
Range.Font
返回一个许多组件都能使用的常用的Font对象。Range.Font允许设置Font对象的的多个属性,例如Name,Size,Bold,Italic,Color和Underline。请注意,如果需要,可以在Font.Color属性中使用IE的颜色名。
Range.Halignment, Range.Valignment
这两个属性控制区域的各单元水平和垂直方向上的文本对齐方式。每个属性中定义了各自可以使用的对齐方式的枚举值。
Range.Borders
该属性返回一个Borders对象,可以通过它来设置每个单元边框的各个特性,如边框线的线粗,样式及颜色。
 
组件级的外观和行为
许多属性和方法会影响整个电子表格组件。表2-4列出了定制的解决方案中最有趣的属性和方法。
表 2-4. 影响整个电子表格的主要属性。
Property
Description
Spreadsheet.AllowPropertyToolbox
控制是否显示属性工具箱(译者注:指“命令和选项”窗口)。如果该属性设置为False,属性工具箱在工具条上的图标和在右键菜单上的菜单项会被禁止。可以随时使用这个属性来禁止缺省的格式化用户界面,并提供您自己的格式化界面。
Spreadsheet.AutoFit
决定控件是否处于”自动适应”模式。请查看前面章节中关于AutoFit的细节来了解这个特性是如何工作的。
Spreadsheet.Dirty
当控件中有任何修改,任何单元被改变后,这个属性会被置为true以通知您这个改变。通常使用Dirty属性来判断是否需要保存内容。请注意这是一个read/write属性,因此可以通过重置它来使电子表格又变”干净”。You commonly use the Dirty property to determine whether you need to save the contents in some way.
Spreadsheet.DisplayColHeaders, Spreadsheet.DisplayRowHeaders
控制是否显示行头和列头。这两个属性的缺省值是True。通常,您可以在需要使用您自己的代码来对电子表格界面进行完全控制时将这两个属性设置为False。
Spreadsheet.DisplayGridlines
控制是否显示网格线。缺省是要显示的,如果在定制解决方案中,要在需要单元分隔线的地方使用边框,则常关闭这个属性。
Spreadsheet.DisplayPropertyToolbox
控制是否显示属性工具箱。将属性置为true则显示,置为false就会隐藏。
Spreadsheet.DisplayTitleBar
控制是否显示标题栏。缺省是显示标题栏的。可以使用下面介绍的TitleBar属性来修改标题栏上的内容和格式。
Spreadsheet.DisplayToolbar
控制是否显示工具条。缺省是显示。
Spreadsheet.EnableAutoCalculate
控制电子表格模型如何重算。如果这个属性被置为false,电子表格模型不会自动重算;必须调用工作表对象的Calculate方法,才能看到改变输入后的新结果。在计划修改一系列的输入,并且希望只有在完成所有的修改后,才重算模型时,这个属性非常有用。这个属性缺省为True――模型会在电子表格被修改时自动进行重算。
Spreadsheet.ScreenUpdating
缺省情况下,电子表格在屏幕上的显示总是反映最新的数据,不过如果计划执行大量的操作,而不希望电子表格在每一个操作之后都会因为更新而闪烁。可以将这个属性置为Fasle。将这个属性重新设回True会触发一个彻底的重绘动作。
Spreadsheet.Selection
返回当前选择的对象。可以使用VBA或VBScript中的TypeName函数来判断这个对象的类型。
Spreadsheet.TitleBar
使您可以访问电子表格的标题栏,可以改变标题栏的文本和格式。
Spreadsheet.ViewableRange
控制电子表格实际可见的部分。请查看前面关于ViewableRange和AutoFit的介绍,以了解这个属性是如何工作的。
 
排序和过滤
表 2-5 列出了在电子表格组件中排序和过滤数据时可以使用的属性和方法。
Table 2-5. 具有排序和过滤功能的属性和方法。
属性或方法
介绍
Range.Sort
根据给定的列和排序方法对区域进行排序。
Worksheet.AutoFilter
该属性返回一个AutoFilter对象,该对象可用来设置当前过滤器的细节。
AutoFilter.Filters
该属性返回当前自动过滤区域的过滤器集合。一个过滤器对象应用于自动过滤区域中的一列,过滤器对象的下标和对应区域中列的下标相对应。
AutoFilter.Apply
该方法应用一个新的自动过滤。在设置完过滤条件后,必须调用这个方法来实际应用过滤器。
Criteria.FilterFunction
该属性控制符合过滤条件的项是包括在过滤器中,还是被排除在过滤器之外。如果是包含,则过滤器仅包含符合过滤条件集合的项,而如果是排除,则过滤器包含除了哪些符合过滤条件集合的项之外的所有项。
Criteria.ShowAll
该属性决定是否显示所有的数据。当设为True时,该属性重置过滤器来显示所有的数据。当设为False时,假如没有任何过滤条件,将不显示任何数据。
Criteria.Add
该方法将一个新的过滤条件添加到过滤器中。
Range.AutoFilter
该方法针针对一个给定的区域打开AutoFilter开关。首先调用这个方法,然后使用Worksheet.AutoFilter属性(如上所述)访问过滤器并设置过滤条件。
 
保   护
     如果需要保护电子表格的某部分,使您的用户不能修改单元内容或改变单元格式,您需要使用控制保护功能的各属性。表2-6列出了常用的具有保护功能的属性,并给出如何使用每一个属性的简短的描述。
请注意,保护设置即通过用户界面应用到用户交互中,也应用到代码中执行的操作中。因此如果您在一个保护选项被启用的情况下需要删除一行,您必须在执行删除操作前将Protection对象的Enabled属性设置为False,并在完成操作后,将Enabled属性设回True以便返回到受保护的状态。
表 2-6. 常用的具有保护功能的各属性。
属性
描述
Worksheet.Protection
返回一个Protection对象,可以使用它设置各种保护选项,从而启用各种全局操作(例如:插入和删除行)。
Protection.Enabled
控制一般情况下是否启用保护。在需要使用保护选项或锁定单元格时,首先设置选项或者锁定单元格,然后将这个属性设为True。当需要在代码中执行操作时,可以将该属性设为False来暂时禁止保护功能。
Protection.AllowInsertingColumns, Protection.AllowInsertingRows, Protection.AllowDeletingColumns, Protection.AllowDeletingRows
允许或禁止在电子表格中插入、删除列或行。例如,如果AllowInsertingRows被设为False,则电子表格会禁止所有用来插入一行的命令,包括哪些编程模型中的命令。
Protection.AllowSizingAllColumns, Protection.AllowSizingAllRows
允许或禁止调整列或行的大小。例如,如果AllowSizingAllRows被设为False,电子表格就不会允许用户调整行的大小,也不会允许您通过代码来这样做。
Protection.AllowSorting
允许或禁止在电子表格中排序数据。将AllowSorting设为False会禁止用户对任何区域中的内容进行排序。
Protection.AllowFiltering
允许或禁止使用自动筛选功能。将这个属性设为False会禁止用户启用自动过滤功能。
 
撤  消
表2-7 列出了当您控制电子表格组件的撤消机制时会用到的有关的属性和方法。
表 2-7. 控制撤消机制相关的属性和方法。
属性和方法
描述
Spreadsheet.BeginUndo
一个使您可以将一系列的操作看作一个撤消操作的方法。例如,如果您调用BeginUndo方法,然后执行了三个不同的排序动作,或改变了许多单元,您可以一下撤消所有这些操作。
Spreadsheet.EndUndo
一个标记您的逻辑撤消单元的结束的方法。在调用BeginUndo方法和调用EndUndo方法之间执行的所有操作会被当前一个单一的单元来撤消。
Spreadsheet.EnableUndo
该属性控制撤消功能是否可用。缺省是可用的。您可能需要暂时禁止这个功能,以便节约内存或在代码中执行大量的操作。
 
有用的事件
电子表格的顶级对象公布了大量的事件,比OWC库中的任何其它控件都要多。表2-8列出了一些关键的事件,当围绕电子表格组件开发定制解决方案时您很可能会需要使用它们。
几乎所有电子表格控件中的事件都向事件处理函数传递一个类型为SpreadsheetEventInfo的单一参数。SpreadsheetEventInfo是一个COM对象,您可以使用它来获得事件被触发时应用程序状态的各种信息,包括什么被选择了,那个区域被影响了,鼠标的位置在哪里,那个键被按下,等等。这反映出DOM中事件信息的处理方式。
使用一个对象来作为事件参数的最重要的原因,是因为需要支持JavaScript中的撤消事件的功能。JavaScript中传递给事件的参数总是值传递的,除非参数是对象的指针。换句话说,如果OWC小组将事件设计为附加一个ReturnValue参数,脚本可以通过将这个参数设置为True来撤消事件,那么在JavaScript中因为参数的值传递方式这不会正常工作。然而,如果脚本将一个对象的ReturnValue属性设置为True,触发事件的控件则会正确的发现它。因此,如果您需要撤消一个事件(大部分以”Before”开头的事件是可以被撤消的),请将SpreadsheetEventInfo对象的ReturnValue属性设为False。
表 2-8. 有用的事件
事件
描述
Spreadsheet.Change
只要电子表格中的一个或多个单元被改变,该事件就会被触发。可以使用SpreadsheetEventInfo对象的Range属性来判断被改变的区域。
StartEdit, EndEdit, CancelEdit
当一个单元将要被编辑,正要结束编辑,或正要撤消编辑时触发。您可以在EndEdit事件处理函数中执行数据校验,并通过将SpreadsheetEventInfo对象的ReturnValue属性设为True来拒绝输入的新值。使用SpreadsheetEventInfo对象的EditData属性可获得单元的新值。为了编辑的需要,可以在StartEdit事件中使用另一个元素来代替显示的值。例如使用一个TrueType字体来显示一个特殊的符号,而不是使用文字的描述。
BeforeCommand, Command
在正要执行一个命令之前和刚执行完一个命令后触发――例如排序;过滤;插入或删除行或列;显示帮助;和剪切,拷贝或粘贴这样的动作――被执行时。在Msowcvba.chm文件中或在您的对象浏览器中查看SheetCommandEnum常量的列表,可以知道在这些事件中可以捕捉的所有命令。同样的,如果需要撤销一个事件的缺省行为,您可以将BeforeCommand事件中的ReturnValue属性设置为False。例如,您可能希望当用户点击电子表格工具条上的帮助按钮时显示您自己的帮助页面。
获得版本信息
有时您需要查看正在使用的控件的版本,以便能够利用新特性的优势,或者使用变通的代码来解决一个较早版本中的问题。大部分的软件程序都会在主要的版本之间发布SR版本,因此您常常需要检查您的代码正在交互的版本是否就是您所期望的版本。
为了帮助您完成这些工作,我们为owc库中的每一个控件添加了表2-9中的属性。您可以使用这些属性来判断您的代码正在操作的控件的版本,并执行适当的动作。
表 2-9. 所有Office Web 组件都具有的版本信息属性。
属性
描述
MajorVersion
一个long型的整数值,指示组件的主版本号。对于Office 2000版本来说,这个数字是9。
MinorVersion
一个字符型的值,指示组件的次版本号。对于Office2000版本来说,这个数字是0,如果在下一个主版本发布之前,发布了任何小版本,这个数字会增加。请注意,为了处理出现例如”a”这样的版本号的情况,MinorVersion是一个字符串值。最好对这个值进行相等的比较操作,而不要进行大于或小于的比较操作。
BuildNumber
一个字符型的值,指示组件的编译数目。编译数目会随着组件DLL的每一次编译而增加。Office 2000版本的这个数值在写作这本书时还不可用,这也是一个字符型的数值,因此,它可以处理在发布一个次版本时版本号中被加入了一个字母的情况。
Version
一个字符型的数值,返回整个版本数值。当需要显示版本号时可以使用这个属性,但是在需要判断一个版本是否就是您需要的那个版本时请使用其它的属性。
posted on 2006-06-19 15:31  yiriqing  阅读(616)  评论(0编辑  收藏  举报