Получение вложенных объектов из собственных объектов Office в настройках уровня документа
Многие обработчики событий для событий Office получают собственные объекты Office, представляющие рабочую книгу, лист или документ, инициирующий событие. В некоторых случаях может возникнуть необходимость в выполнении определенного кода только в том случае, если рабочая книга или документ в настройке уровня документа инициирует событие. Например, в настройке уровня документа для Excel может возникнуть необходимость в выполнении определенного кода, когда пользователь активирует один из листов в настраиваемой книге, но не тогда, когда пользователь активирует рабочий лист в какой-либо книге, которая в это же время оказывается открытой.
При наличии собственного объекта Office можно проверить, был ли объект расширен до ведущего элемента или ведущего элемента управления в настройке уровня документа. Ведущие элементы и элементы управления ведущего приложения являются типами, предоставляемыми средой Среда выполнения Visual Studio Tools for Office и добавляющими функциональные возможности объектам, существующим внутри объектных моделей Word или Excel (называемых собственными объектами Office). Собирательно ведущие элементы и элементы управления ведущего приложения также называются расширенными объектами. Дополнительные сведения об этих элементах см. в разделе Общие сведения о ведущих элементах и элементах управления ведущего приложения.
Применение. Сведения этого раздела применяются к проектам уровня документа для следующих приложений: Excel 2007 и Excel 2010; Word 2007 и Word 2010. Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.
Основные сведения о методах GetVstoObject и HasVstoObject
Чтобы проверить собственный объект Office, необходимо использовать методы HasVstoObject и GetVstoObject в проекте.
Если необходимо определить, имеет ли собственный объект Office расширенный объект в текущей настройке, используйте метод HasVstoObject. Этот метод возвращает true, если собственный объект Office имеет расширенный объект, и 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. Например, метод GetVstoObject возвращает объект Microsoft.Office.Tools.Word.Document, если заданный объект Microsoft.Office.Interop.Word.Document, является основным объектом для документа в текущем проекте документа Word.
В проектах уровня документа нельзя использовать метод 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.
Примечание
Чтобы использовать методы GetVstoObject и HasVstoObject в проектах уровня документа, ориентированных на .NET Framework 3.5, необходимо добавить оператор using (для C#) или Imports (для Visual Basic) для пространств имен Microsoft.Office.Tools.Excel.Extensions или Microsoft.Office.Tools.Word.Extensions в начало файла кода.Методы GetVstoObject и HasVstoObject реализованы как методы расширения, и указанные операторы позволяют вызывать эти методы.
Пример. Определение, инициировано ли событие ведущим элементом
В следующих примерах кода демонстрируются методы HasVstoObject и GetVstoObject. Оба примера обрабатывают событие SheetActivate класса ThisWorkbook в проекте книги Excel. Первый пример определяет, были ли активирован один из ведущих элементов 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.
}
}
Следующий пример упрощает этот процесс, используя методы HasVstoObject и GetVstoObject параметра Sh. В этом примере показан вызов этих методов в проекте, ориентированном на .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)