从文档级自定义项中的本机 Office 对象获取扩展对象

更新: 2008 年 7 月

适用于

本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。

项目类型

  • 文档级项目

Microsoft Office 版本

  • Excel 2007

  • Word 2007

有关更多信息,请参见按应用程序和项目类型提供的功能

Office 事件的很多事件处理程序接收表示引发事件的工作簿、工作表或文档的本机 Office 对象。在某些情况下,您可能希望仅当文档级自定义项中的工作簿或文档引发了事件时才运行某些代码。例如,在 Excel 文档级自定义项中,您可能希望在用户激活自定义项中的某个 Microsoft.Office.Tools.Excel.Worksheet 宿主项时运行某些代码,而不是在用户激活恰好同时打开的另外某个工作簿中的工作表时运行这些代码。

从 Visual Studio 2008 Service Pack 1 (SP1) 开始,在获取本机 Office 对象时,可以测试该对象是否已经扩展至文档级自定义项中的宿主项或 Microsoft.Office.Tools.Excel.ListObject 宿主控件。

宿主项和宿主控件是 Visual Studio Tools for Office 对象,这些对象向本身存在于 Word 或 Excel 对象模型中的对象(称为“本机 Office 对象”)添加功能。宿主项和宿主控件也统称为“扩展对象”。有关宿主项和宿主控件的更多信息,请参见宿主项和宿主控件概述

使用 GetVstoObject 和 HasVstoObject 方法

若要测试本机 Office 对象,请使用以下本机 Office 对象之一的实例的 HasVstoObject 和 GetVstoObject 方法:

如果只是要确定本机 Office 对象是否在自定义项中有扩展对象,请使用 HasVstoObject 方法。如果本机 Office 对象具有扩展对象,此方法将返回 true,否则将返回 false。

如果要获取扩展对象,请使用 GetVstoObject 方法。此方法将返回 Microsoft.Office.Tools.Excel.ListObjectMicrosoft.Office.Tools.Excel.WorkbookMicrosoft.Office.Tools.Excel.WorksheetMicrosoft.Office.Tools.Word.Document 对象(如果本机 Office 对象具有其中的一个)。否则,GetVstoObject 返回 null。例如,如果 Microsoft.Office.Interop.Word.Document 是 Word 文档项目中的文档的基础对象,则 Microsoft.Office.Interop.Word.Document 对象的 GetVstoObject 方法将返回 Microsoft.Office.Tools.Word.Document

不能使用文档级解决方案中的 GetVstoObject 在运行时创建新宿主项。只能使用该方法来访问设计时在项目中生成的现有宿主项。有关更多信息,请参见宿主项和宿主控件的编程限制

在应用程序级项目中,可以使用 GetVstoObject 方法在运行时生成新的宿主项。有关更多信息,请参见在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿

说明:

若要使用 GetVstoObject 和 HasVstoObject 方法,必须将 Microsoft.Office.Tools.Excel.ExtensionsMicrosoft.Office.Tools.Word.Extensions 命名空间的 using(对于 C#)或 Imports(对于 Visual Basic)语句添加到代码文件顶部。GetVstoObject 和 HasVstoObject 方法作为 Visual Studio Tools for Office 运行时中的扩展方法实现,使用上述语句可以调用这些方法。

确定宿主项是否引发事件

下面的代码示例演示了 HasVstoObject 和 GetVstoObject 方法。两个示例都处理 Excel 工作簿项目中 ThisWorkbook 类的 SheetActivate 事件。

第一个示例确定是否有一个 Microsoft.Office.Tools.Excel.Worksheet 宿主项是通过将 Sh 参数与每个默认宿主项的 InnerObject 属性进行比较来激活的。

Sub ThisWorkbook_SheetActivate1(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing

    If Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet1
    ElseIf Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet2
    ElseIf Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet3
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate1(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;

    if (Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet1;
    else if (Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet2;
    else if (Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet3;

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

下一个示例通过使用 Sh 参数的 HasVstoObject 和 GetVstoObject 方法简化了这个过程。

Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
    Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet = _
        CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)

    If interopWorksheet IsNot Nothing AndAlso _
        interopWorksheet.HasVstoObject() Then
        vstoWorksheet = interopWorksheet.GetVstoObject()
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
    Microsoft.Office.Interop.Excel.Worksheet interopWorksheet = 
        Sh as Microsoft.Office.Interop.Excel.Worksheet;

    if (interopWorksheet != null && interopWorksheet.HasVstoObject())
    {
        vstoWorksheet = interopWorksheet.GetVstoObject();
    }

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

请参见

概念

对文档级自定义项进行编程

宿主项和宿主控件概述

在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿

扩展方法 (Visual Basic)

参考

扩展方法(C# 编程指南)

修订记录

日期

修订历史记录

原因

2008 年 7 月

新增主题。

SP1 功能更改。