Excel对象模型_Application接口Application属性用法及与CreateObject返回值差异咨询
关于VB.NET操作Excel互操作接口的问题解答
使用VB.NET创建Excel实例可参考如下代码:
Imports System Imports Microsoft.Office.Interop.Excel Imports Word = Microsoft.Office.Interop.Word Module Program '声明语句 Dim oXL As Microsoft.Office.Interop.Excel.Application Dim oWB As Workbook Dim oSheet As Worksheet Dim oWord As Word.Application Dim oDoc As Word.Document Sub Main(args As String()) 'Console.WriteLine("Hello World!") oXL = CreateObject("Excel.Application") oXL.Visible = True oXL.DisplayAlerts = True Console.WriteLine("CreateObject返回的类型: {0}", oXL.GetType()) oWB = oXL.Workbooks.Add oWord = CreateObject("Word.Application") oWord.Visible = True oDoc = oWord.Documents.Add Console.ReadLine() oXL.Quit() '不会弹出警告 oWord.Quit(False) '不会弹出警告 End Sub End Module
上述代码运行正常,官方文档中有两处相关说明:
使用Application属性返回Application对象。
经查证该Application属性是_Application接口的成员,对应文档对该接口的使用规范说明如下:
仅当你要调用的方法与COM对象的某个事件重名时,才使用这个基础接口。
以下是两个问题的解答:
问题1:什么场景下需要使用_Application接口的Application属性来返回Application对象?
- Office互操作库中的
Application接口是复合接口,同时继承了_Application(存放所有方法、属性定义)和ApplicationEvents4_Event(存放所有事件定义)两个接口。 - 正常情况下调用方法、访问属性或者绑定事件,直接用
Application类型的实例即可,编译器会自动匹配对应的成员。 - 只有当你遇到名称冲突的编译错误时才需要用到
_Application接口:比如某一个方法的名称和某一个事件的名称完全相同,编译器无法判断你要调用方法还是绑定事件,此时你可以将实例显式转换为_Application接口类型,再访问Application属性获取实例,即可避开名称冲突,正常调用方法和属性。 - 另外如果你是从Workbook、Worksheet等子对象获取对应的宿主Application实例,默认返回的就是
Application类型,只有出现编译歧义时才需要显式走_Application接口访问。
问题2:该属性返回的对象,与代码中oXL = CreateObject("Excel.Application")语句返回的对象是否存在差异?
- 二者没有本质差异,底层指向的是同一个Excel COM对象的运行时可调用包装(RCW)。
- 唯一的区别只是引用的接口类型不同:
CreateObject返回的实例默认可以直接转换为Application、_Application等任意兼容的互操作接口,不管用哪种接口引用,操作的都是同一个Excel实例,功能上没有任何区别。
内容的提问来源于stack exchange,提问作者Sougata
相关产品推荐
相关产品推荐

