Поделиться через


Расширение документов Word и книг Excel в надстройках уровня приложения во время выполнения

Можно использовать надстройку уровня приложения для выполнения указанных ниже настроек документов Word и книг Excel.

  • Добавление управляемых элементов управления в любой открытый документ или лист.

  • Преобразование существующего объекта списка на листе Excel в расширенный объект ListObject, который предоставляет события и позволяет выполнить привязку данных с помощью модели привязки данных Windows Forms.

  • Получение доступа к событиям на уровне приложения, которые предоставляются Word и Excel для определенных документов, книг и листов.

Для использования данных функциональных возможностей необходимо во время выполнения создать объект, который расширяет документ или книгу.

Сведения в этом разделе Применяется. применяется в проекты уровня приложения для следующих приложений: Excel 2010; слово 2010.Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.

Создание расширенных объектов в надстройках

Расширенные объекты являются экземплярами типов, предоставляемых средствами среды выполнения Visual Studio office, которые добавляют функции к объектам, непосредственно под названием существуют в объектных моделях слова или собственный объектами office Excel.Чтобы создать расширенный объект для объекта Word или Excel, используйте метод GetVstoObject.При первом вызове метода GetVstoObject для указанного объекта слова или Excel, он возвращает новый объект, расширяющий указанный объект. При каждом вызове метода и указан один и тот же объект слова или Excel, он возвращает один и тот же расширенный объект.

Тип расширенного объекта имеет такое же имя, как тип собственного объекта Office, но этот тип определен в пространстве имен Microsoft.Office.Tools.Excel или Microsoft.Office.Tools.Word.Например, если вызвать метод GetVstoObject для расширения объекта Microsoft.Office.Interop.Word.Document, метод возвращает объект Microsoft.Office.Tools.Word.Document.

Методы GetVstoObject предназначены для использования преимущественно в проектах уровня приложения.Кроме того, можно использовать эти методы в проектах уровня документа, но тогда поведение объектов несколько отличается и имеет меньшее число применений.

Чтобы определить, создан ли уже расширенный объект для определенного собственного объекта Office, воспользуйтесь методом HasVstoObject.Дополнительные сведения см. в разделе Определение наличия расширенного объекта Office.

Cc442981.collapse_all(ru-ru,VS.110).gifСоздание ведущих элементов

При использовании метода GetVstoObject для расширения объекта уровня документа (т.е. Microsoft.Office.Interop.Excel.Workbook, Microsoft.Office.Interop.Excel.Worksheet или Microsoft.Office.Interop.Word.Document) возвращаемый объект называется ведущим элементом.Ведущий элемент — это тип, который может содержать другие объекты, включающие в свою очередь другие расширенные объекты и элементы управления.Ведущий элемент похож на соответствующий тип в основной сборке взаимодействия Word или Excel, но обладает дополнительными функциональными возможностями.Дополнительные сведения о ведущих элементах см. в разделе Общие сведения о ведущих элементах и элементах управления ведущего приложения.

После создания ведущего элемента, его можно использовать для добавления управляемых элементов управления в документ, книгу или лист.Дополнительные сведения см. в разделе Добавление управляемых элементов управления в документы и листы.

Создание ведущего элемента для документа Word

  • В следующем примере кода показано, как создать ведущий элемент для активного документа.

    If Globals.ThisAddIn.Application.Documents.Count > 0 Then
        Dim NativeDocument As Microsoft.Office.Interop.Word.Document = _
            Globals.ThisAddIn.Application.ActiveDocument
        Dim VstoDocument As Microsoft.Office.Tools.Word.Document = _
            Globals.Factory.GetVstoObject(NativeDocument)
    End If
    
    if (Globals.ThisAddIn.Application.Documents.Count > 0)
    {
        Microsoft.Office.Interop.Word.Document nativeDocument =
            Globals.ThisAddIn.Application.ActiveDocument;
        Microsoft.Office.Tools.Word.Document vstoDocument =
            Globals.Factory.GetVstoObject(nativeDocument);
    }
    

Создание ведущего элемента для книги Excel

  • В следующем примере кода показано, как создать ведущий элемент для активной книги.

    Dim NativeWorkbook As Microsoft.Office.Interop.Excel.Workbook =
        Globals.ThisAddIn.Application.ActiveWorkbook
    If NativeWorkbook IsNot Nothing Then
        Dim vstoWorkbook As Microsoft.Office.Tools.Excel.Workbook =
            Globals.Factory.GetVstoObject(NativeWorkbook)
    End If
    
    Microsoft.Office.Interop.Excel.Workbook nativeWorkbook = 
        Globals.ThisAddIn.Application.ActiveWorkbook;
    if (nativeWorkbook != null)
    {
        Microsoft.Office.Tools.Excel.Workbook vstoWorkbook = 
            Globals.Factory.GetVstoObject(nativeWorkbook);
    }
    

Создание ведущего элемента для листа Excel

  • В следующем примере кода показано, как создать ведущий элемент для активного листа в проекте.

    Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
        Globals.ThisAddIn.Application.ActiveSheet
    If NativeWorksheet IsNot Nothing Then
        Dim vstoSheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    End If
    
    Microsoft.Office.Interop.Excel.Worksheet nativeWorksheet =
        Globals.ThisAddIn.Application.ActiveSheet;
    if (nativeWorksheet != null)
    {
        Microsoft.Office.Tools.Excel.Worksheet vstoSheet = 
            Globals.Factory.GetVstoObject(nativeWorksheet);
    }
    

Cc442981.collapse_all(ru-ru,VS.110).gifСоздание элементов управления ведущего приложения ListObject

При использовании метода GetVstoObject для расширения объекта Microsoft.Office.Interop.Excel.ListObject метод возвращает объект Microsoft.Office.Tools.Excel.ListObject.Объект Microsoft.Office.Tools.Excel.ListObject обладает всеми функциональными возможностями исходного объекта Microsoft.Office.Interop.Excel.ListObject, но он также имеет дополнительные функциональные возможности, например возможность связывания с данными с использованием модели привязки данных Windows Forms.Дополнительные сведения см. в разделе Элемент управления ListObject.

Создание элемента управления ведущего приложения для ListObject

  • В следующем примере кода показано, как создать Microsoft.Office.Tools.Excel.ListObject для первого Microsoft.Office.Interop.Excel.ListObject в активном листе в проекте.

    Dim sheet As Microsoft.Office.Interop.Excel.Worksheet =
        Globals.ThisAddIn.Application.ActiveSheet
    If sheet.ListObjects.Count > 0 Then
        Dim listObject As Excel.ListObject = sheet.ListObjects(1)
        Dim vstoListObject As Microsoft.Office.Tools.Excel.ListObject =
            Globals.Factory.GetVstoObject(listObject)
    End If
    
    Microsoft.Office.Interop.Excel.Worksheet sheet =
        Globals.ThisAddIn.Application.ActiveSheet;
    if (sheet.ListObjects.Count > 0)
    {
        Excel.ListObject listObject = 
            sheet.ListObjects[1];
        Microsoft.Office.Tools.Excel.ListObject vstoListObject =
            Globals.Factory.GetVstoObject(listObject);
    }
    

Добавление управляемых элементов управления в документы и листы

После создания объекта Microsoft.Office.Tools.Word.Document или Microsoft.Office.Tools.Excel.Worksheet в документ или на листы можно добавить элементы управления, которые расширяют объекты.Для этого необходимо использовать свойство Controls объекта Microsoft.Office.Tools.Word.Document или Microsoft.Office.Tools.Excel.Worksheet.Дополнительные сведения см. в разделе Добавление элементов управления в документы Office во время выполнения.

Можно добавить элементы управления Windows Forms или элементы управления ведущего приложения.Элемент управления ведущего приложения — это элемент управления, предоставляемый средой выполнения Visual Studio Tools for Office (cреда выполнения), который упаковывает соответствующий элемент управления в основной сборке взаимодействия Word или Excel.Элемент управления ведущего приложения предоставляет все возможности, лежащие в основе собственного объекта Office, но он также вызывает события и может быть связан с данными с помощью модели привязки данных Windows Forms.Дополнительные сведения см. в разделе Общие сведения о ведущих элементах и элементах управления ведущего приложения.

ПримечаниеПримечание

Нельзя добавить элемент управления XmlMappedRange на лист или в документ элемент управления XMLNode или XMLNodes, с помощью надстройки.Данные элементы управления ведущего приложения невозможно добавить программными средствами.Дополнительные сведения см. в разделе Программные ограничения ведущих элементов и элементов управления ведущего приложения.

Cc442981.collapse_all(ru-ru,VS.110).gifСохранение и удаление элементов управления

При добавлении управляемых элементов управления в документ или на лист, элементы управления не сохраняются при сохранении и последующем закрытии документа.Все элементы управления ведущего приложения удалены, чтобы только основные собственные объекты office будут слева позади.Например, Microsoft.Office.Tools.Excel.ListObject будет Microsoft.Office.Interop.Excel.ListObject.Все элементы управления Windows Forms также удаляются, но оболочки ActiveX для элементов управления остаются в документе.Для очистки элементов управления или повторного создания элементов управления при последующем открытии документа необходимо включить в надстройку код.Дополнительные сведения см. в разделе Сохранение динамических элементов управления в документах Office.

Получение доступа к событиям уровня приложения в документах и книгах

Некоторые события документа, рабочей книги и листа в собственных объектных моделях Word и Excel вызываются только на уровне приложения.Например, событие DocumentBeforeSave вызывается при открытии документа в Word, но данное событие определено в классе Microsoft.Office.Interop.Word.Application, а не в классе Microsoft.Office.Interop.Word.Document.

При использовании в надстройке только собственных объектов Office необходимо обработать эти события уровня приложения и затем написать дополнительный код для определения, является ли документ, который вызвал событие, одним из настроенных.Ведущие элементы предоставляют данные события на уровне документа; таким образом упрощается обработка событий для конкретного документа.Можно создать ведущий элемент и затем обработать событие для этого ведущего элемента.

Cc442981.collapse_all(ru-ru,VS.110).gifПример, в котором используются собственные объекты Word

В следующем примере кода показана обработка событий уровня приложения для документов Word.Метод CreateDocument создает новый документ и затем определяет обработчик событий DocumentBeforeSave, который предотвращает сохранение документа.Поскольку данное событие уровня приложения вызывается для объекта Microsoft.Office.Interop.Word.Application, то обработчик событий должен сравнить параметр с Doc объектом document1 для установления, представляет ли объект document1 сохраненный документ.

Private document1 As Word.Document = Nothing

Private Sub CreateDocument1()
    document1 = Me.Application.Documents.Add()
End Sub

Private Sub Application_DocumentBeforeSave(ByVal Doc As Word.Document, _
    ByRef SaveAsUI As Boolean, ByRef Cancel As Boolean) _
    Handles Application.DocumentBeforeSave
    If Type.ReferenceEquals(Doc, document1) Then
        Cancel = True
    End If
End Sub
private Word.Document document1 = null;

private void CreateDocument1()
{
    document1 = this.Application.Documents.Add(ref missing,
        ref missing, ref missing, ref missing);
    this.Application.DocumentBeforeSave += 
        new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(
        Application_DocumentBeforeSave);
}

private void Application_DocumentBeforeSave(Word.Document Doc, 
    ref bool SaveAsUI, ref bool Cancel)
{
    if (Type.ReferenceEquals(Doc, document1)) 
    {
        Cancel = true;
    }
}

Cc442981.collapse_all(ru-ru,VS.110).gifПример, в котором используется ведущий элемент

В следующем примере кода упрощен процесс обработки события BeforeSave ведущего элемента Microsoft.Office.Tools.Word.Document.В этих примерах метод CreateDocument2 создает объект Microsoft.Office.Tools.Word.Document, расширяющий объект document2, и затем определяет обработчик событий BeforeSave, который предотвращает сохранение документа.Поскольку обработчик событий вызывается только при сохранении объекта document2, обработчик событий может отменить действие сохранения без выполнения дополнительных действий для проверки какой был сохранен документ.

Следующий пример кода демонстрирует эту задачу.

Private document2 As Word.Document = Nothing
Private WithEvents vstoDocument As Microsoft.Office.Tools.Word.Document = Nothing

Private Sub CreateDocument2()
    document2 = Me.Application.Documents.Add()
    vstoDocument = Globals.Factory.GetVstoObject(document2)
End Sub

Private Sub vstoDocument_BeforeSave(ByVal sender As Object, _
    ByVal e As SaveEventArgs) Handles vstoDocument.BeforeSave
    e.Cancel = True
End Sub
private Word.Document document2 = null;
private Microsoft.Office.Tools.Word.Document vstoDocument = null;

private void CreateDocument2()
{
    document2 = this.Application.Documents.Add(ref missing,
        ref missing, ref missing, ref missing);
    vstoDocument = Globals.Factory.GetVstoObject(document2);
    vstoDocument.BeforeSave += new SaveEventHandler(vstoDocument_BeforeSave);
}

private void vstoDocument_BeforeSave(object sender, SaveEventArgs e)
{
    e.Cancel = true;
}

Определение, является ли объект Office расширенным

Чтобы определить, создан ли уже расширенный объект для определенного собственного объекта Office, воспользуйтесь методом HasVstoObject.Этот метод возвращает значение true, если расширенный объект Office уже создан; в противном случае — значение false.

Воспользуйтесь методом Globals.Factory.HasVstoMethod.Передайте собственный объект слова или Excel, такие как Microsoft.Office.Interop.Word.Document или Microsoft.Office.Interop.Excel.Worksheet, которое требуется выполнить для расширенного объекта.

Метод HasVstoObject полезен в ситуации, когда необходимо запустить код только при условии, что заданный объект Office имеет расширенный объект.Например, если есть надстройка Word, которая обрабатывает событие DocumentBeforeSave удаления управляемых элементов управления из документа до сохранения, то можно использовать метод HasVstoObject для определения расширен ли документ.Если документ не был расширен, он не может содержать управляемые элементы управления и следовательно обработчик событий может не осуществлять попытку очистки элементов управления из документа.

См. также

Основные понятия

Добавление элементов управления в документы Office во время выполнения

Общие сведения о ведущих элементах и элементах управления ведущего приложения

Другие ресурсы

Программирование надстроек уровня приложения

Образцы и пошаговые руководства разработки Office