从NET开发人员的角度理解Excel对象模型三.doc_第1页
从NET开发人员的角度理解Excel对象模型三.doc_第2页
从NET开发人员的角度理解Excel对象模型三.doc_第3页
从NET开发人员的角度理解Excel对象模型三.doc_第4页
从NET开发人员的角度理解Excel对象模型三.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从 NET开发人员的角度理解Excel对象模型 三从.NET开发人员的角度理解Excel对象模型(三)2010-05-05 10:24Application事件除了Application类提供的所有其他方法之外,您还将发现有一大组事件可用。虽然不可能以任何一种一致的方式演示所有事件,但是单单根据名称,就可以比较清楚地知道它们的用途。下面几部分描述了这些事件的一个子集,并讨论了在您自己的应用程序中最可能使用的事件。提示传递给Office应用程序中的事件处理程序的参数会让人感到与用在本机.NET事件中的参数不同。通常,.NET事件处理程序总是接收Object变量(该变量引用引发事件的对象)和第二个参数(该参数从EventArgs基类继承而来,包含关于事件的额外信息)。没有这样定义良好的事件设计模式用于Office应用程序,因此每个事件处理程序都接受任意数目的参数(由最初的开发人员定义)。表行为Application对象提供了各种与表(包括图表和工作表)相关的事件。下面的列表包含关于许多这样的事件的信息:当任何一个表被激活时,SheetActivate都会发生。Excel将一个包含对被激活的表的引用的Object变量传递给事件处理程序。提示正如Excel中传递一个引用表的Object的任何情况一样,在可以使用这个引用之前,您需要将引用强制转换成一个正确类型(Worksheet或Chart,视具体的情况而定)的变量。然而,如果您已经禁用了Visual Basic.NET中的Option Strict设置,您可以利用晚期绑定。在您键入时,您将仍然不能利用IntelliSense,这使得编写代码变得更加困难。本文档中所有在Sheets集合内使用项的示例都显式地将结果强制转换成所需要的特定类型的表(Worksheet或Chart)。在Excel提供默认的双击处理之前,当任何表被双击时,SheetBeforeDoubleClick都会发生。Excel将下列参数传递给事件处理程序:一个包含对表的引用的Object变量、一个包含离双击位置最近的单元格的Range对象、一个允许您取消默认事件处理的Boolean值(默认为False)。(此事件没有出现在图表中。)提示所有在它们的名称中包括单词Before的事件都允许您取消默认的事件处理。传递给您的事件处理程序的参数通常名为Cancle,具有默认值False。如果将这个参数设置为True,Excel将不会执行事件的默认处理。在Excel提供默认的右键单击处理之前,当任何表被右键单击时,SheetBeforeRightClick都会发生。Exce将下列参数传递给事件处理程序:一个包含对表的引用的Object变量、一个包含离右击位置最近的单元格的Range对象、一个允许您取消默认事件处理的Boolean值(默认为False)。(此事件没有出现在图表中。)当任何表被重新计算时,SheetCalculate都会出现。Excel将一个包含对重新计算的表的引用的Object传递给事件处理程序。当任何工作表中的单元格发生变化(通过用户或者通过运行代码)时,SheetChange都会发生。Excel将一个Object变量(包含对表的引用)和一个Range变量(引用改变的范围)传递给事件处理程序。当任何表单被停用时(即当它不再有焦点时),SheetDeactivate都会发生。只有当焦点转移到同一工作簿内的另一个表时,这个事件处理程序才会运行。Excel将一个包含对已经停用的表的引用的Object变量传递给事件处理程序。当您单击任何工作簿内的任何超级链接时,SheetFollowHyperlink都会发生。Excel将一个引用包含此链接的表的Object变量和一个包含对您所单击的链接的引用的Hyperlink对象传递给事件处理程序。(示例项目使用了这个事件,从而在示例内提供了导航。)当工作表上的选择改变时,SheetSelectionChange会发生(该事件没有出现在图表中)。Excel将一个引用选择发生改变的表的Object变量和一个引用新选择的Range变量传递给事件处理程序。(注意,在最初的选择发生改变之前,Excel没有传递关于最初的选择的信息。)注这一部分中的每个事件也可用作Workbook类提供的事件。如果该事件是由Application对象提供的,则它可以被Excel内当前打开的任何一个表引发。当它是由Workbook对象提供的,则该事件只有在它影响特定工作簿中的一个表时才会发生。此外,您还将发现Worksheet类提供的相同事件。在这种情况下,事件名不包含单词Sheet(例如,您将会找到FollowHyperlink而不是SheetFollowHyperlink,等等),并且事件处理程序不传递对表的引用-这种信息隐含在接收事件的对象中。另外,事件及其使用方法和参数与此处您所看到的事件相同。Window行为Application对象(和相应的Workbook对象)提供了各种处理Window对象的行为的事件。下面的列表描述了这些事件:当任何窗口被激活时,WindowActivate都会发生。Excel将下面两个参数传递给事件处理程序:一个是Workbook对象,这个对象引用提供窗口的工作簿;一个是引用被选择的窗口的Window对象。与其他激活事件一样,这个事件也是只有在Excel内的焦点移动时才激发。切换到另一个应用程序,然后再回到Excel时,不会引发此事件。当任何窗口被停用时,WindowDeactivate都会发生。有关更多信息,请参阅WindowActivate事件描述。当任何工作簿窗口重新调整大小时,WindowResize都会发生。Excel将一个引用提供窗口的工作簿的Workbook对象和一个引用大小重新调整的窗口的Window对象传递给事件处理程序。注由Workbook类提供的事件中,事件处理程序不会接收对Workbook的引用-这种信息隐含在引发此事件的对象中。Workbook Application对象提供了各种当您与任何Workbook对象交互时都会发生的事件。这些事件过程中的每一个都接收Workbook变量,该变量指示参与事件的特定工作簿。下面的列表描述了可用事件的一个子集:当创建一个新的工作簿时,NewWorkbook会发生。Excel将一个引用新的工作簿的Workbook变量传递给事件处理程序。(此事件只由Application类提供。)当任何工作簿被激活时,WorkbookActivate都会发生。Excel将一个引用被激活的工作簿的Workbook变量传递给事件处理程序。(与其他的激活事件一样,只有在您从一个工作簿切换到另一个工作簿时这个事件才发生。)当一个打开的工作簿刚好在默认事件处理之前关闭时,WorkbookBeforeClose会发生。Excel将一个引用将要关闭的工作簿的Workbook变量以及一个允许事件处理程序取消默认事件处理(即保持工作簿打开)的Boolean值(默认为False)传递给事件处理程序。警告如果您草率地将Cancel参数设置为True,而不考虑任何条件,则所有的工作簿将永远不会被关闭。当工作簿内的打印刚好在默认事件处理之前开始时,WorkbookBeforePrint会发生。Excel将一个引用包含打印内容的工作簿的Workbook变量以及一个允许事件处理程序取消默认事件处理(即跳过请求的打印)的Boolean值(默认为False)传递给事件处理程序。当刚好在默认事件处理之前保存工作簿时,WorkbookBeforeSave会发生。Excel将一个引用保存的工作簿的Workbook变量以及一个允许事件处理程序取消默认事件处理(即取消保存)的Boolean值(默认为False)传递给事件处理程序。当任何工作簿被停用时,WorkbookDeactivate都会发生。Excel将一个引用已经停用的工作簿的Workbook变量传递给事件处理程序。(与其他的激活事件一样,这个事件只有在您从一个工作簿切换到另一个工作簿时才会发生。)当将新的表添加到工作簿时,WorkbookNewSheet会发生。Excel将一个引用工作簿的Workbook变量和一个引用新表的Object变量传递给事件处理程序。当一个工作簿打开时,WorkbookOpen会发生。Excel将一个引用新打开的工作簿的Workbook变量传递给事件处理程序。注Workbook类提供了自己的一组事件,与您在此处看到的事件非常相似。所有以Workbook开头的事件在没有该委托(Activate而不是WorkbookActivate,等等)的情况下出现在Workbook类的事件列表中。Workbook类事件处理程序不接收Workbook变量作为参数;该信息隐含在引发这个事件的对象中。此外,Workbook类还提供了其他Application对象事件的镜像,但是只为单个工作簿捕获它们,这与为所有的工作簿捕获这些事件形成了对比。本文档的剩余部分将不讨论事件,因为您现在已经了解了一些您最有可能会使用的事件。Workbook类正如您可能想象到的那样,Workbook类代表了Excel应用程序内的一个单一的工作簿。在这一部分,您将会了解这个类的一些成员,包括那些最常使用的属性和方法。提示许多Application类的成员也作为Workbook类的成员加以介绍。在这种情况下,其属性适用于特定的工作簿,而不适用于活动工作簿。这一部分所要讨论的成员远比上一部分中讨论的少,主要因为您对许多提到的成员已经有所了解。Workbook类的属性Workbook类提供了大量的属性(大约90个),并且有许多属性处理多数开发人员从不会考虑到的特殊情况;例如,AutoUpdateFrequency属性返回共享工作簿的自动更新的分钟数;如果工作簿使用1904日期系统(一种日期顺序方案,它将1904年1月2日作为对应于值1的日期,通常使用于Macintosh计算机),Date1904属性会返回True值;PasswordEncryptionAlgorithm属性可以让您设置用于加密密码的确切算法,等等。这一部分只是介绍您最可能用到的Workbook对象属性,而不是试图全面介绍其众多属性。通常的规则是:如果您需要工作簿的某一行为,而其他人可能已经请求该行为,实际上最可能的情况是一个属性允许该行为,而通常由一个方法提供该行为。在您向一个工作簿中添加自己的代码之前要仔细检查文档。以下列表描述了一些最常使用的Workbook属性:Name、FullName、Path(字符串,只读):这些属性分别返回不同版本的工作簿名称。FullName返回完整路径名称,包括工作簿文件名。Name只是返回名称部分,而Path则只返回路径部分。单击示例工作簿中的Name Information链接来运行以下代码,并返回信息,如图5所示:Visual Basic ThisApplication.Range(WorkbookName).Value=_ ThisWorkbook.Name ThisApplication.Range(WorkbookPath).Value=_ ThisWorkbook.Path ThisApplication.Range(WorkbookFullName).Value=_ ThisWorkbook.FullName/C#ThisApplication.get_Range(WorkbookName,Type.Missing).Value2=ThisWorkbook.Name;ThisApplication.get_Range(WorkbookPath,Type.Missing).Value2=ThisWorkbook.Path;ThisApplication.get_Range(WorkbookFullName,Type.Missing).Value2=ThisWorkbook.FullName;图5.使用Workbook属性检索名称的有关信息。Password(字符串):获取或者设置和工作簿相关的密码。如果您指定了一个非空的密码,工作簿的HasPassword属性也会返回True。您可以检索Password属性,但是它的值总是*。单击示例工作簿中的Set Password链接来运行以下代码,它可以根据您是提供文本还是只提供空字符串来设置或清除工作簿密码。这个示例使用示例项目中名为Password的窗体,它提供一个文本框和一个Password属性:Visual Basic Private Sub SetPassword()Dim frm As New Password If frm.ShowDialog=DialogResult.OK Then ThisWorkbook.Password=frm.Password End If frm.Dispose()End Sub/C#private void SetPassword()Password frm=new Password();if(frm.ShowDialog()=DialogResult.OK)ThisWorkbook.Password=frm.Value;frm.Dispose();PrecisionAsDisplayed(布尔值):如果为True,则Excel使用以十进制显示的数字进行计算。如果为False(默认值),则Excel使用所有可用的十进制数进行计算,甚至包括那些根本没有显示的部分。图6显示此属性设置成True的示例工作簿。第C列中的每个值都是第B列中值的副本,但是第C列中的数字格式已经设置成了只显示两个十进制位。要注意到,如果将PrecisionAsDisplayed属性设置成True,求和就会不一样,因为经过四舍五入后实际值会不同。如果您单击PrecisionAsDisplayed=False链接,求和又一样了。单击会调用以下过程,传递True或False值(取决于您所单击的链接):Visual Basic Private Sub TestPrecisionAsDisplayed(_ ByVal IsPrecisionAsDisplayedOn As Boolean)ThisWorkbook.PrecisionAsDisplayed=IsPrecisionAsDisplayedOn End Sub/C#private void TestPrecisionAsDisplayed(bool IsPrecisionAsDisplayedOn)ThisWorkbook.PrecisionAsDisplayed=IsPrecisionAsDisplayedOn;图6.将PrecisionAsDisplayed属性设置成True,Excel只使用显示的十进制数进行计算。ReadOnly(布尔值,只读):如果工作簿以只读的方式打开,则此属性返回True值。此时如果您无法将数据保存到工作簿,那么您可以在应用程序中采取其他不同操作。Saved(布尔值):用来获取或设置工作簿的保存状态。如果用户已经对工作簿的内容或结构进行了修改,则Saved属性就为True。如果试图关闭工作簿或者退出Excel,将会出现一个警报提示您保存工作簿(除非您已经将Application.DisplayAlerts属性设置成False)。如果您在代码中将Saved属性值设置成False,Excel就会认为您的工作簿已经保存,并且不会再次提醒您保存。使用Document属性正如其他的Office应用程序一样,Excel允许您在保存工作簿的同时保存文档属性。Excel提供了许多内置属性,并且您也可以添加自己的属性。选择文件|属性来显示如图7所示的对话框,并且您也可以选择自定义选项卡来创建和修改自定义属性。图7.使用此对话框设置文档属性。通过Workbook类的BuiltInDocumentProperties属性来使用内置属性,并通过CustomDocumentProperties属性来使用自定义属性。这些属性都返回一个DocumentProperties对象,它是DocumentProperty对象的一个集合。通过集合内的名称或者索引可以使用集合的Item属性来检索特定的属性。在Excel文档中有全部的属性名列表,但是有一个检索列表的简单方法:当您单击示例工作簿中的Document Properties链接时会运行下面的过程(参见图8)。该过程调用DumpPropertyCollection方法列出所有内置属性和它们的当前值,然后对自定义属性也重复进行这一过程。此外,该过程还单独修改Revision Number属性,并且创建一个新的自定义属性:Visual Basic Private Sub DisplayDocumentProperties()Dim prp As Office.DocumentProperty Dim prps As Office.DocumentProperties Dim rng As Excel.Range=_ ThisApplication.Range(DocumentProperties)Dim iAs Integer Try ThisApplication.ScreenUpdating=False Try prps=DirectCast(_ ThisWorkbook.BuiltinDocumentProperties,_ Office.DocumentProperties)Set the Revision Number property:prp=prps.Item(Revision Number)prp.Value=CType(prp.Value,Integer)+1Dump contents of the collection:DumpPropertyCollection(prps,rng,i)Catch ex As Exception MessageBox.Show(ex.Message)End TryWork with custom properties:Try prps=DirectCast(_ ThisWorkbook.CustomDocumentProperties,_ Office.DocumentProperties)DumpPropertyCollectio n(prps,rng,i)Catch ex As Exception MessageBox.Show(ex.Message)End TryAdd acustom property:TryDelete the property,if it exists.prp=prps.Item(Project Name)prp.Delete()CatchDo nothing if you get an exception.End Try TryAdd anew property.prp=prps.Add(Project Name,False,_ Office.MsoDocProperties.msoPropertyTypeString,_White Papers)Catch ex As Exception MessageBox.Show(ex.Message)End Try Finally ThisApplication.ScreenUpdating=True End Try End Sub Private Sub DumpPropertyCollection(_ ByVal prps As Office.DocumentProperties,_ ByVal rng As Excel.Range,ByRef iAs Integer)Dim prp As Office.DocumentProperty For Each prp In prps rng.Offset(i,0).Value=prp.Name Try If Not prp.Value Is Nothing Then rng.Offset(i,1).Value=_ prp.Value.ToString End If CatchDo nothing at all.End Try i+=1 Next End Sub/C#private void DisplayDocumentProperties()Office.DocumentProperty prp=null;Office.DocumentProperties prps=(Office.DocumentProperties)ThisWorkbook.BuiltinDocumentProperties;Excel.Range rng=ThisApplication.get_Range(DocumentProperties,Type.Missing);int i=0;try ThisApplication.ScreenUpdating=false;try/Set the Revision Number property:prp=prpsRevision Number;prp.Value=Convert.ToInt32(prp.Value)+1;/Dump contents of the collection:i=DumpPropertyCollection(prps,rng,i);catch(Exception ex)MessageBox.Show(ex.Message,ThisApplication.Name);/Work with custom properties:try prps=(Office.DocumentProperties)ThisWorkbook.CustomDocumentProperties;DumpPropertyCollection(prps,rng,i);catch(Exception ex)MessageBox.Show(ex.Message,ThisApplication.Name);/Add acustom property:try/Delete the property,if it exists.prp=prpsProject Name;prp.Delete();catch/Do nothing if you get an exception.try/Add anew property.prp=prps.Add(Project Name,false,Office.MsoDocProperties.msoPropertyTypeString,White Papers,Type.Missing);catch(Exception ex)MessageBox.Show(ex.Message,ThisApplication.Name);finally ThisApplication.ScreenUpdating=true;private int DumpPropertyCollection(Office.DocumentProperties prps,Excel.Range rng,int i)foreach(Office.DocumentProperty prp in prps)rng.get_Offset(i,0).Value2=prp.Name;try if(prp.Value!=null)rng.get_Offset(i,1).Value2=prp.Value.ToString();catch/Do nothing at all.i+=1;return i;提示前面的代码示例DisplayDocumentProperties使用了Microsoft.Office.Core程序集中的几个枚举和类型。示例代码包含一个Imports/using语句,它将文本Office设置成这个命名空间的缩写,就像设置Excel缩写一样。项目模板会自动设置Excel缩写。而您需要自己添加Office语句。图8.内置的文档属性注尽管在这里您使用的是Excel及其对象,但是实际上是Office提供了可用的内置文档属性列表,并且Excel没必要实现所有的属性-如果试图访问一个未定义属性的Value属性,就会触发一个异常。示例过程包含应付这种情况(如果会出现的话)的简单异常处理。使用样式和Word文档很相似,Excel工作簿允许您将指定的样式应用于工作簿内的区域,并且Excel提供了许多预定义的(尽管并不非常引人注目)样式。使用格式|样式菜单项,会显示一个对话框,它允许您交互式地修改样式,如图9所示。图9.利用此对话框交互式地修改样式。单击样式对话框中的Modify会显示单元格格式对话框,如图10所示。图10.使用单元格格式对话框修改样式。单元格格式对话框显示了您在格式化单元格时可以使用的所有选项,该对话框中可用的所有选项同样可以在代码中使用。您可以使用Workbook对象的Styles属性来与工作簿交互,并对工作簿内的范围应用样式。通过使用Workbook对象的Styles属性,您可以创建、删除和修改样式。单击示例工作簿中的Apply Style来运行以下过程,它创建了一个新的样式(如果您已经运行了这段代码,则使用已有的样式),设置该样式的各个方面,并将其应用到一个区域:Visual Basic Private Sub ApplyStyle()Const STYLE_NAME As String=PropertyBorderDim rng As Excel.RangeGet the range containing all the document properties.rng=GetDocPropRange()Dim sty As Excel.Style Try sty=ThisWorkbook.Styles(STYLE_NAME)Catch sty=ThisWorkbook.Styles.Add(STYLE_NAME)End Try sty.Font.Name=Verdanasty.Font.Size=12 sty.Font.Color=ColorTranslator.ToOle(Color.Blue)sty.Interior.Color=ColorTranslator.ToOle(Color.LightGray)sty.Interior.Pattern=XlPattern.xlPatternSolid rng.Style=STYLE_NAME rng.Columns.AutoFit()End Sub/C#private void ApplyStyle()const String STYLE_NAME=PropertyBorder;/Get the range containing all the document properties.Excel.Range rng=GetDocPropRange();Excel.Style sty;try sty=ThisWorkbook.StylesSTYLE_NAME;catch sty=ThisWorkbook.Styles.Add(STYLE_NAME,Type.Missing);sty.Font.Name=Verdana;sty.Font.Size=12;sty.Font.Color=ColorTranslator.ToOle(Color.Blue);sty.Interior.Color=ColorTranslator.ToOle(Color.LightG

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论