不论您采用何种方式来开发Excel应用程序,了解Excel对象模型尤其重要,这些对象是您与Excel进行交互的基石。据不完全统计,Excel的对象模型中有270多个对象及超过5000多个属性和方法。通过这些对象及方法,您可以充分利用Excel来定制化您的插件。
Excel的所有对象、事件、方法和属性在这里不可能全部介绍完。本文简要介绍一下Excel的整体文档对象模型,以及一些比较重要的,平常开发中需要频繁接触到的对象、属性、事件及方法,如Application、Range对象等,使您对Excel的整个结构有一个简单的了解。后面在编程中遇到问题了,您可以快速定位知道需要设置或者调用哪个对象及其方法,然后根据关键字到Google或者MSDN上方便查找。本文大部分内容参照MSDN上的这篇文章Understanding the Excel Object Model from a .NET Developer's Perspective 如果您对英文没有问题,建议您直接去MSDN看原文。
一、Excel 对象模型简介在与Excel进行交互之前,了解Excel对象模型的整体结构非常重要,这使得我们对Excel有一种更整体全面的了解。下图是Excel的对象模型的整个层级结构。
根据这个图,我们打开一个Excel,可以有一种非常直观形象的了解。
图中可以看到,Excel对象模型基本模拟了UI界面:
一个Excel应用程序就是一个Application,全局的对象比如菜单,工具条都属于Application对象。
一个Application可以包含很多个Workbook(Workbooks)。具体而言就是,我们可以同时打开很多个工作簿(Workbooks),但某一时刻只有一个工作簿(Workbook)处于编辑状态,这个工作簿叫做活动工作簿(ActiveWorkbook);
一个Workbook可以包含很多个Worksheet(Worksheets)。具体而言就是,一个工作簿可以包含很多工作表(Worksheets),某一时刻只有一个工作表(Worksheet)处于编辑状态,这个工作表称之为活动工作表(ActiveWorksheet)。
一个Workbook还可以包含很多Shapes对象。工作表中还可以包含一些图表,标记,注释,控件等,这些都是浮在Sheet页上的,这些统称为Shapes,其中我们接触的最多的是图表(Charts)。
一个WorkSheet可以包含很多个Range对象。具体而言,一个工作表里面有很多个单元格,单元格范围用Range表示,Range可以是一个单元格,也可以是多个单元格。单元格都是嵌入到Sheet页中的。
更详细地Excel的对象模型图,如下,图中灰色的部分存在于office.dll中所有Office应用程序中都存在的对象。
以上是Excel文档对象模型的大概全部的对象模型。其中最重要的几个对象为Application,Workbook,Worksheet 和Range对象。下面就简单介绍下这些对象中的一些属性,方法及事件。
二 Application对象Application是根对象,代表着Excel应用程序本身,一切Excel中的其他对象都有它直接或者间接创建。 您可以回想到前面我们在Shared Add-in项目中创建Excel菜单和工具条时接触到的对象。我们首先是在Connect方法中保存了 application对象,然后在该对象上创建了MenuBar和Toolbar。Application对象有一些熟悉,事件和方法,在我们编程中经常会用到,现在就稍微讲一下:
2.1 Application中控制Excel状态和显示的方法和属性Application中控制Excel状态和显示的方法和属性有很多,表一中列出了常用的几个属性。有一个属性是需要重新启用后才可以生效的。
属性
类型
说明
Cursor
XlMousePointer 枚举
获取或者设置鼠标手势的形状
EditDirectlyInCell
Boolean
获取或者设置是否可以直接在单元格里面对数据进行编辑,如果为false,则只能在公示栏中对数据进行编辑
Interactive
Boolean
获取或者设置用户是否可以通过鼠标或者键盘与Excel进行交互
MoveAfterReturnDirection
xlDirection枚举
设置当用户敲回车时,在 MoveAfterReturn属性设置为true的情况下,下一个单元格移动的位置,默认为向下。
ScreenUpdating
Boolean
设置屏幕刷新属性,当设置为True时,每一个单元格的刷新时都会刷新整个屏幕,一般地在编程时,为了提升速度,在代码处理的过程中禁止屏幕刷新,待数据填充完成之后,再开启屏幕刷新.
StandardFont
String
获取或者设置Excel中显示的默认字体,重启后生效。
StandardFontSize
Long
获取或者设置Excel默认显示的字体大小,重启后生效。
StartupPath (read-only
String
返回Excel外接插件启动项的加载目录.
TemplatesPath (read-only)
String
返回Excel模板加载的路径,通常为Windows的特殊目录.
DisplayAlerts
Boolean
如果设置为true,在某些情况下,比如我们的代码删除一个sheet页,Excel会弹出提示框提醒用户。如果设置为false,则不显示提示框,Excel默认选择默认项。
上面列出的属性中,最可能用到的是ScreenUpdating属性,正确使用该属性能够大幅提高应用程序的性能。默认的,该属性为true,即每一次修改就会刷新整个界面,这会使得应用程序变慢,尤其是在往单元格填充大量数据的时候。所以一般的做法是,在填充数据之前保存ScreenUpdating属性,然后将ScreenUpdating属性设置为false,禁止屏幕刷新,然后填充数据,最后将之前保存的ScreenUpdating属性赋值回来。下面的代码演示了这一做法:
Boolean oldScreenUpdate = this.Application.ScreenUpdating;
try
{
this.Application.ScreenUpdating = false;
//to fill in a large range that time comsuming
}
finally
{
this.Application.ScreenUpdating = oldScreenUpdate;
}
2.2 Application中返回的对象
从Application对象中可以获取很多有用的对象。如ActiveCell返回当前活动的单元格;ActiveChart,返回当前选中的活动的图表;ActiveSheet、ActiveWindows分别返回活动的Sheet页和窗口;Selection属性返回当前选中的对象,可能是Range,Worksheet或者是一个窗体;Workbooks,Sheets,Charts返回当前Excel中所有工作簿,工作表,图表的集合。
通常,我们接触最多的是Application对象的Workbooks属性,该对象是当前Excel打开的所有的工作簿文件。一个Workbook就是一个.xls或者.xlsx文件。下面简单讲解Workbooks对象。
创建一个新的workbook对象
通过Applicaition的Workbooks对象的Add方法可以创建一个新的工作簿。
// Create a new workbook object
Excel.Workbook wb = this.Application.Workbooks.Add(Type.Missing);
关闭所有的workbook对象
通过调用close对象可以关闭所有的工作簿。
// Close all workbooks
this.Application.Workbooks.Close();
打开一个Excel文件
Open( FileName , UpdateLinks , ReadOnly , Format , Password , WriteResPassword , IgnoreReadOnlyRecommended , Origin , Delimiter , Editable , Notify , Converter , AddToMru , Local , CorruptLoad )
通过Open方法可以打开一个本地的Excel文件,Open方法有很多定制化参数,如果不需要制定的话,传入Type.Missing即可。
// Open an exist workbook
Excel.Workbook wbOpenExistFile = this.Application.Workbooks.Open(
"C:\\YourPath\\Yourworkbook.xls",
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
参数
名称必需/可选数据类型说明FileName可选VariantString. 要打开的工作簿的文件名。UpdateLinks可选Variant指定更新文件中外部引用(链接)的方式,如下面的公式 =SUM([Budget.xls]Annual!C10:C25) 中对 Budget.xls 工作簿中某个区域的引用。如果省略此参数,则提示用户指定链接的更新方式。有关此参数所用值的详细信息,请参阅"说明"部分。如果 Microsoft Excel 正在打开 WKS、WK1 或 WK3 格式的文件,并且 UpdateLinks 参数为 0,则不创建任何图表;否则 Microsoft Excel 将根据附加于该文件的图形生成图表。ReadOnly可选Variant如果为 True,则以只读模式打开工作簿。Format可选Variant如果 Microsoft Excel 打开文本文件,则由此参数指定分隔符。如果省略此参数,则使用当前的分隔符。有关此参数使用的值的详细信息,请参阅"备注"部分。Password可选Variant一个字符串,包含打开受保护工作簿所需的密码。如果省略此参数并且工作簿已设置密码,则提示用户输入密码。WriteResPassword可选Variant一个字符串,包含写入受保护工作簿所需的密码。如果省略此参数并且工作簿已设置密码,则提示用户输入密码。IgnoreReadOnlyRecommended可选Variant如果为 True ,则不让 Microsoft Excel 显示只读的建议消息(如果该工作簿以 "建议只读"选项保存)。Origin可选Variant如果该文件为文本文件,则此参数用于指示该文件的来源,以便正确映射代码页和回车/换行符 (CR/LF))。可为以下XlPlatform 常量之一: xlMacintosh 、 xlWindows 或 xlMSDOS 。如果省略此参数,则使用当前操作系统。Delimiter可选Variant如果该文件为文本文件并且 Format 参数为 6,则此参数是一个字符串,指定用作分隔符的字符。例如,可使用 Chr(9) 代表制表符,使用","代表逗号,使用";"代表分号,或者使用自定义字符。只使用字符串的第一个字符。Editable可选Variant如果文件为 Microsoft Excel 4.0 外接程序,则此参数为 True 时可打开该外接程序以使其成为可见窗口。如果此参数为 False 或被省略,则以隐藏方式打开外接程序,并且无法设为可见。本选项不能应用于由 Microsoft Excel 5.0 或更高版本所创建的外接程序。如果文件是 Excel 模板,则参数值为"True"时,会打开指定模板进行编辑。参数值为"False"时,可根据指定模板打开新的工作簿。默认值为"False"。Notify可选Variant当文件不能以可读写模式打开时,如果此参数为 True ,则可将该文件添加到文件通知列表。Microsoft Excel 将以只读模式打开该文件并轮询文件通知列表,并在文件可用时向用户发出通知。如果此参数为 False 或被省略,则不请求任何通知,并且不能打开任何不可用的文件。Converter可选Variant打开文件时试用的第一个文件转换器的索引。首先试用的是指定的文件转换器;如果该转换器不能识别此文件,则将试用所有其他转换器。转换器索引由FileConverters 属性返回的转换器行号组成。AddToMru可选Variant如果为 True ,则将该工作簿添加到最近使用的文件列表中。默认值为 False 。Local可选Variant如果为 True ,则以 Microsoft Excel(包括控制面板设置)的语言保存文件。如果为 False (默认值),则以 Visual Basic for Applications (VBA) 语言保存文件(VBA 通常为美国英语版本,除非从中运行 Workbooks.Open 的 VBA 项目是旧的国际化 XL5/95 VBA 项目)。CorruptLoad可选XlCorruptLoad可为以下常量之一: xlNormalLoad 、 xlRepairFile 和 xlExtractData 。如果未指定任何值,则默认行为是 xlNormalLoad ,并且当通过 OM 启动时不尝试恢复状态。
打开文本文件,数据库文件,XML文件
这些操作可以通过OpenText,OpenDatabase,OpenXml方法来实现,方法参数可能需要您详细指定。
返回指定的工作簿文件
有时候我们可能需要从当前的工作簿文件中,找到指定的工作簿文件进行操作。一般的我们可以通过Workbooks属性通过索引器传入index来返回,或者通过工作簿名称来返回。需要注意的是,工作簿没有保存前,不需要后缀,保存后需要带上后缀来进行访问,代码如下:
//Get an exist workbook form current workbooks
Excel.Workbook wbFind = this.Application.Workbooks[1];
// Before Book1 is saved:
wbFind = this.Application.Workbooks["Book1"];
// After Book1 is saved:
wbFind = this.Application.Workbooks["Book1.xls"];
2.3 Application中的方法
Application对象提供了一些方法,包括单元格的重新计算,撤销操作等。
Calculate方法:该方法强制所有打开的工作簿,特定的工作簿,或者指定的Range对象进行重新计算。
// Cell calculate
this.Application.Calculate();
// Or...
this.Application.Calculate();
// Or...
this.Application.get_Range("A1", "B12").Calculate();
Quit方法:如果要退出Excel,则可以调用Quit方法,如果DisplayAlerts设置为false,则不会弹出提示用户保存的对话框。
Undo:撤销用户界面上的最后一次操作,该撤销操作对代码执行的操作不起作用,并且只能撤销最后一次操作哦。
2.4 Application中文件操作方法DefaultFilePath 获取或者设置Excel默认加载和保存文件的路径
DefaultSaveFormat 获取或者设置Excel默认保存的文件格式,该格式是XlFileFormat枚举类型的对象。
RecentFiles 最近使用文件属性,返回一系列最近使用的文件名
FileDialog 属性,该属性返回一个FileDialog对象,他能够处理四种类型的文件操作,包括:选择文件并打开,选择文件路径并保存当前工作簿,选择目录和选择文件名。使用Dialog窗体,我们可以利用Office提供的各种文件处理能力。其文件类型通过指定FileDialog类型来实现,该类型是一个msoFileDialogType枚举,包含msoFileDialogFilePicker,msoFileDialogFolderPicker,msoFileDialogOpen和msoFileDialogSaveAs四个枚举值。FileDialog对象存在于Microsoft.Office.Core命名空间中。FileDialog的Show方法弹出一个对话框,如果返回-1表示拥护点击了OK按钮,如果是0表示拥护按下了Cancel按钮,如果使用msoFileDialogOpen或者msoFileDialogSaveAs枚举值,FileDialog的Execute方法会执行打开或者保存文件的操作。SelectedItems属性包含了一些列的字符串,它表示选中的一些列文件名称。下面代码演示了如何使用。
//using FileDialog to open an exist file
Office.FileDialog dlg = this.Application.get_FileDialog(
Office.MsoFileDialogType.msoFileDialogOpen);
dlg.Filters.Clear();
dlg.Filters.Add("Excel Files", "*.xls;*.xlw", Type.Missing);
dlg.Filters.Add("All Files", "*.*", Type.Missing);
if (dlg.Show() != 0)
dlg.Execute();
2.5 Application中其他一些有用的对象
Application中还有一些其他有用的对象,如WorksheetFunction,该对象包括了一系列静态或者共享方法,这些方法都是对Excel内置函数的包装。
WorksheetFunction 下面演示了WorksheetFunction的用法:
Excel.Worksheet ws = (Excel.Worksheet)this.Application.ActiveSheet;
Excel.Range rng = ws.get_Range("RandomNumbers", Type.Missing);
System.Random rnd = new System.Random();
for (int i = 1; i 保护工作表菜单开启,我们可以设置保护密码。默认情况下,会对所有的工作表中的单元格进行保护。如果您要对特定范围的单元格进行保护,可能需要使用 审阅->允许用户编辑区域实现。

在代码中,我们可以通过调用Worksheet的Protect方法来实现,该方法有很多参数进行配置。其方法签名如下:
// Worksheet protect method signature
WorksheetObject.Protect(Password, DrawingObjects, Contents,
Scenarios, UserInterfaceOnly, AllowFormattingCells,
AllowFormattingColumns, AllowFormattingRows,
AllowInsertingColumns, AllowInsertingRows,
AllowInsertingHyperlinks, AllowDeletingColumns,
AllowDeletingRows, AllowSorting, AllowFiltering,
AllowUsingPivotTables);
- Password参数,指定大小写敏感的保护密码,如果不设置,那么任何人都可以接触保护。
- DrawingObject参数,如果为true,则保护工作表内的图形对象,默认为false。
- Contents参数,如果为True则保护工作表中的所有单元格,默认为True,一般地,不需要进行修改。
- Scenarios参数,如果为True,则保护工作表内的方案,默认为True。
- UserInterfaceOnly,如果为True,则允许从代码中修改保护,而不是从用户界面上。默认值为False,即不能通过代码或者用户界面来对受保护的工作表进行修改。通常该修改只能对当前的会话有效。如果想要每一次都能对工作表进行操作,那么在每一次打开工作表的时候都需要通过代码进行设置。
- AllowFormattingCells参数,指定对工作表中对象的格式化权限。通常默认情况下,这些属性都是False。
下面是一个使用Protect方法对工作表进行保护的例子,该方法设置了保护密码,并仅允许对数据进行排序:
((Excel.Worksheet)this.Application.Sheets[1]).Protect(
"MyPassword", Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, true, Type.Missing, Type.Missing);
要取消保护,直接调用unprotect方法即可。
Object属性
Worksheet对象还有几个返回Object类型的属性。
Comments:在Excel中,我们可以在单元格中添加注释。我们可以通过Range对象的AddComment方法来实现:

下面的代码演示了如果注释存在,删除,然后添加注释。后面演示了如何通过代码演示和现实所有注释:
Excel.Range rng = this.Application.get_Range("Date", Type.Missing);
if (rng.Comment != null)
{
rng.Comment.Delete();
}
rng.AddComment("Comment added " + DateTime.Now);
// Display all the comments:
ShowOrHideComments(true);
Worksheet类提供了Comments属性,该属性返回一个Comments对象,该对象是一个集合,您可以便利该集合中的对象,Comment类提供的属性很少,用的最多的是Visible属性,用来显示或者隐藏注释;在一个就是Delete属性,用来删除注释,最后Text属性可以用来添加或者修改现有的注释。
添加完成注释之后,我们可能希望在工作表中显示注释。下面就是在当前活动工作表中显示或者隐藏注释的代码。
private void ShowOrHideComments(bool show)
{
// Show or hide all the comments:
Excel.Worksheet ws =
(Excel.Worksheet)this.Application.Sheets["Worksheet Class"];
for (int i = 1; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?