从文档级自定义项中的本机 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 对象,请在项目中使用 HasVstoObject 和 GetVstoObject 方法:
如果要确定本机 Office 对象是否在自定义项中有扩展对象,请使用 HasVstoObject 方法。 如果本机 Office 对象具有扩展对象,此方法将返回 true,否则将返回 false。
如果要获取本机 Office 对象的扩展对象,请使用 GetVstoObject 方法。 此方法将返回 Microsoft.Office.Tools.Excel.ListObject、Microsoft.Office.Tools.Excel.Workbook、Microsoft.Office.Tools.Excel.Worksheet 或 Microsoft.Office.Tools.Word.Document 对象(如果指定的本机 Office 对象具有其中一个对象)。 否则,GetVstoObject 返回 null。 例如,如果指定的 Microsoft.Office.Interop.Word.Document 是 Word 文档项目中的文档的基础对象,则 GetVstoObject 方法将返回 Microsoft.Office.Tools.Word.Document。
在文档级项目中,不能使用 GetVstoObject 方法在运行时创建新的 Microsoft.Office.Tools.Excel.Workbook、Microsoft.Office.Tools.Excel.Worksheet 或 Microsoft.Office.Tools.Word.Document 宿主项。 只能使用该方法来访问设计时在项目中生成的现有宿主项。 如果要在运行时创建新的宿主项,则必须开发应用程序级项目。 有关更多信息,请参见宿主项和宿主控件的编程限制和在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿。
使用 GetVstoObject 和 HasVstoObject 方法
调用 HasVstoObject 和 GetVstoObject 方法的方式取决于项目所面向的 .NET Framework 版本:
在面向 .NET Framework 4 的项目中,请使用 Globals.Factory.GetVstoObject 或 Globals.Factory.HasVstoObject 方法,并传入要测试的本机 Word 或 Excel 对象(如 Microsoft.Office.Interop.Word.Document 或 Microsoft.Office.Interop.Excel.Worksheet)。
在面向 .NET Framework 3.5 的项目中,请在 Excel 和 Word 主互操作程序集中以下任一类型实例上访问这些方法:
提示
若要在面向 .NET Framework 3.5 的文档级项目中使用 GetVstoObject 和 HasVstoObject 方法,必须将 Microsoft.Office.Tools.Excel.Extensions 或 Microsoft.Office.Tools.Word.Extensions 命名空间的 using(对于 C#)或 Imports(对于 Visual Basic)语句添加到代码文件顶部。 GetVstoObject 和 HasVstoObject 方法作为扩展方法实现,使用上述语句可以调用这些方法。
示例:确定宿主项是否引发了事件
下面的代码示例演示了 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.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 参数的 HasVstoObject 和 GetVstoObject 方法简化了这个过程。 此示例演示如何在面向 .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.
}
}
请参见
参考
概念
在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿