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

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

如果您具有本机 Office 对象,则可以测试该对象是否已经扩展到文档级自定义项中的宿主项或宿主控件。 宿主项和宿主控件是 Visual Studio Tools for Office Runtime 提供的类型,这些类型向本身存在于 Word 或 Excel 对象模型中的对象(称为“本机 Office 对象”)添加功能。 宿主项和宿主控件也统称为“扩展对象”。有关宿主项和宿主控件的更多信息,请参见宿主项和宿主控件概述

**适用于:**本主题中的信息适用于以下应用程序的文档级项目:Excel 2007 和 Excel 2010;Word 2007 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

了解 GetVstoObject 和 HasVstoObject 方法

若要测试本机 Office 对象,请在项目中使用 HasVstoObjectGetVstoObject 方法:

在文档级项目中,不能使用 GetVstoObject 方法在运行时创建新的 Microsoft.Office.Tools.Excel.WorkbookMicrosoft.Office.Tools.Excel.WorksheetMicrosoft.Office.Tools.Word.Document 宿主项。 只能使用该方法来访问设计时在项目中生成的现有宿主项。 如果要在运行时创建新的宿主项,则必须开发应用程序级项目。 有关更多信息,请参见宿主项和宿主控件的编程限制在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿

使用 GetVstoObject 和 HasVstoObject 方法

调用 HasVstoObjectGetVstoObject 方法的方式取决于项目所面向的 .NET Framework 版本:

提示

若要在面向 .NET Framework 3.5 的文档级项目中使用 GetVstoObjectHasVstoObject 方法,必须将 Microsoft.Office.Tools.Excel.ExtensionsMicrosoft.Office.Tools.Word.Extensions 命名空间的 using(对于 C#)或 Imports(对于 Visual Basic)语句添加到代码文件顶部。 GetVstoObjectHasVstoObject 方法作为扩展方法实现,使用上述语句可以调用这些方法。

示例:确定宿主项是否引发了事件

下面的代码示例演示了 HasVstoObjectGetVstoObject 方法。 两个示例都处理 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.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet2.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet3.Base
    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.Base;
    else if (Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet2.Base;
    else if (Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet3.Base;

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

下一个示例通过使用 Sh 参数的 HasVstoObjectGetVstoObject 方法简化了这个过程。 此示例演示如何在面向 .NET Framework 4 的项目中调用这些方法。

Private Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object)
    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
        Globals.Factory.HasVstoObject(interopWorksheet) Then
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet)
    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 && Globals.Factory.HasVstoObject(interopWorksheet))
    {
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet);
    }

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

下面的示例演示面向 .NET Framework 3.5 的项目中的相同任务。

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.
    }
}

请参见

参考

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

概念

宿主项和宿主控件概述

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

扩展方法 (Visual Basic)

其他资源

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