Пошаговое руководство. Программирование приложений Office (C# и Visual Basic)

В языках C# и Visual Basic в Visual Studio 2010 появились новые функции, совершенствующие программирование для Microsoft Office.В каждый из языков были добавлены функции, которые уже имелись в другом языке.

К новым функциям C# относятся именованные и необязательные аргументы, возвращаемые значения с типом dynamic, возможность опускать ключевое слово ref и осуществлять доступ к индексированным свойствам при программировании в модели COM.Список новых функций Visual Basic включает автоматически реализуемые свойства, инструкции в лямбда-выражениях и инициализаторы наборов.

Оба языка поддерживают внедрение сведений о типах, что позволяет развертывать сборки, взаимодействующие с компонентами COM, без предварительного развертывания на компьютере основных сборок взаимодействия (PIA).Дополнительные сведения см. в разделе Пошаговое руководство. Внедрение данных о типах из управляемых сборок (C# и Visual Basic).

В данном пошаговом руководстве эти новые функции показаны в контексте программирования для Microsoft Office, но многие из них могут оказаться полезными и в других ситуациях.В этом пошаговом руководстве сначала будет необходимо создать книгу Excel с помощью надстройки Excel.После этого нужно будет создать документ Word, содержащий ссылку на эту книгу.Наконец, будет показано, как можно включать и отключать зависимость от сборок PIA.

Обязательные компоненты

Для выполнения данного пошагового руководства на компьютере должны быть установлены Microsoft Office Excel 2010 и Microsoft Office Word 2010 или 2007.

Если используется операционная система, более старая по сравнению с Windows Vista, проверьте, что установлена .NET Framework 2.0.

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

На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Настройка надстройки Excel

  1. Запустите Visual Studio.

  2. В меню Файл последовательно выберите пункты Создать и Проект.

  3. В области Установленные шаблоны разверните узел Visual Basic или Visual C#, разверните узел Office и выберите 2010 (или 2007, если используется Office 2007).

  4. Затем в панели Шаблоны выберите проект Надстройка Excel 2010 (или Надстройка Excel 2007).

  5. Обратите внимание на верхнюю часть области Шаблоны, чтобы убедиться, что в поле Целевая рабочая среда отображается значение .NET Framework 4.

  6. При необходимости в поле Имя введите имя проекта.

  7. Нажмите кнопку ОК.

  8. В обозревателе решений появится новый проект.

Добавление ссылок

  1. В обозревателе решений щелкните имя проекта правой кнопкой мыши и выберите Добавить ссылку.Откроется диалоговое окно Добавление ссылки.

  2. На вкладке .NET в списке Имя компонента выберите Microsoft.Office.Interop.Excel, версия 14.0.0.0 (или версия 12.0.0.0 для Excel 2007), а затем, удерживая нажатой клавишу CTRL, выберите Microsoft.Office.Interop.Word, версия 14.0.0.0 (или версия 12.0.0.0 для Word 2007).

  3. Нажмите кнопку ОК.

Добавление необходимых операторов Imports или директив using

  1. В обозревателе решений щелкните правой кнопкой мыши файл ThisAddIn.vb или ThisAddIn.cs и выберите в контекстном меню команду Просмотреть код.

  2. В верхнюю часть файла с кодом добавьте следующие операторы Imports (в Visual Basic) или директивы using (в C#), если это еще не сделано.

    Imports Microsoft.Office.Interop
    
    using System.Collections.Generic;
    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    

Создание списка банковских счетов

  1. В обозревателе решений щелкните правой кнопкой мыши имя проекта, щелкните команду Добавить и выберите пункт Класс.Назовите класс Account.vb, если используется Visual Basic, или Account.cs, если используется C#.Нажмите кнопку Добавить.

  2. Замените определение класса Account на следующий код.В определении класса используются автоматически реализуемые свойства; это новая возможность Visual Basic в Visual Studio 2010.Дополнительные сведения см. в разделе Автоматически реализуемые свойства (Visual Basic).

    Public Class Account
        Property ID As Integer = -1
        Property Balance As Double
    End Class
    
    class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
    
  3. Чтобы создать список bankAccounts, содержащий два счета, добавьте в метод ThisAddIn_Startup в файле ThisAddIn.vb или ThisAddIn.cs следующий код.В объявлениях списков используются инициализаторы наборов, это новая возможность Visual Basic в Visual Studio 2010.Дополнительные сведения см. в разделе Инициализаторы коллекций (Visual Basic).

    Dim bankAccounts As New List(Of Account) From {
        New Account With {
                              .ID = 345,
                              .Balance = 541.27
                         },
        New Account With {
                              .ID = 123,
                              .Balance = -127.44
                         }
        }
    
    var bankAccounts = new List<Account> 
    {
        new Account 
        {
            ID = 345,
            Balance = 541.27
        },
        new Account 
        {
            ID = 123,
            Balance = -127.44
        }
    };
    

Экспорт данных в Excel

  1. В том же самом файле добавьте в класс ThisAddIn следующий метод.Этот метод служит для настройки книги Excel и экспорта данных в нее.

    Sub DisplayInExcel(ByVal accounts As IEnumerable(Of Account),
                   ByVal DisplayAction As Action(Of Account, Excel.Range))
    
        With Me.Application
            ' Add a new Excel workbook.
            .Workbooks.Add()
            .Visible = True
            .Range("A1").Value = "ID"
            .Range("B1").Value = "Balance"
            .Range("A2").Select()
    
            For Each ac In accounts
                DisplayAction(ac, .ActiveCell)
                .ActiveCell.Offset(1, 0).Select()
            Next
    
            ' Copy the results to the Clipboard.
            .Range("A1:B3").Copy()
        End With
    End Sub
    
    void DisplayInExcel(IEnumerable<Account> accounts,
               Action<Account, Excel.Range> DisplayFunc)
    {
        var excelApp = this.Application;
        // Add a new Excel workbook.
        excelApp.Workbooks.Add();
        excelApp.Visible = true;
        excelApp.Range["A1"].Value = "ID";
        excelApp.Range["B1"].Value = "Balance";
        excelApp.Range["A2"].Select();
    
        foreach (var ac in accounts)
        {
            DisplayFunc(ac, excelApp.ActiveCell);
            excelApp.ActiveCell.Offset[1, 0].Select();
        }
        // Copy the results to the Clipboard.
        excelApp.Range["A1:B3"].Copy();
    }
    

    В этом методе используются две новые возможности C#.Обе эти функции уже существовали в Visual Basic.

    • У метода Add имеется необязательный параметр для указания конкретного шаблона.Необязательные параметры, впервые появившиеся в Visual C# 2010, позволяют опускать аргумент для таких параметров, если требуется использование значения параметра по умолчанию.Поскольку в предыдущем примере никакой аргумент не передается, в методе Add используется шаблон по умолчанию и создается новая книга.В эквивалентном операторе в предыдущих версиях C# необходимо было использовать в качестве местозаполнителя аргумент excelApp.Workbooks.Add(Type.Missing).

      Дополнительные сведения см. в разделе Именованные и необязательные аргументы (Руководство по программированию на C#).

    • Свойства Range и Offset объекта Range используют функцию индексированных свойств.Она позволяет использовать свойства типов COM с помощью стандартного синтаксиса C#.Кроме того, индексированные свойства позволяют использовать свойство Value объекта Range, устраняя необходимость в использовании свойства Value2.Свойство Value является индексированным, но индекс — необязательный.Совместная работа необязательных аргументов и индексированных свойств показана в следующем примере.

      // Visual C# 2010 provides indexed properties for COM programming.
      excelApp.Range["A1"].Value = "ID";
      excelApp.ActiveCell.Offset[1, 0].Select();
      

      В более ранних версиях этого языка приходилось использовать особый синтаксис. См. ниже.

      // In Visual C# 2008, you cannot access the Range, Offset, and Value
      // properties directly.
      excelApp.get_Range("A1").Value2 = "ID";
      excelApp.ActiveCell.get_Offset(1, 0).Select();
      

      Разработчики не могут создавать собственные индексированные свойства.Эта функция поддерживает только использование имеющихся индексированных свойств.

      Дополнительные сведения см. в разделе Практическое руководство. Использование индексированных свойств в программировании COM-взаимодействия (Руководство по программированию на C#).

  2. Добавьте в конец метода DisplayInExcel следующий код, чтобы ширина столбца изменялась в соответствии с содержимым.

    ' Add the following two lines at the end of the With statement.
    .Columns(1).AutoFit()
    .Columns(2).AutoFit()
    
    excelApp.Columns[1].AutoFit();
    excelApp.Columns[2].AutoFit();
    

    Эти дополнения демонстрируют еще одну новую возможность C# 2010: значения Object, возвращаемые главными приложениями COM, например приложениями Office, обрабатываются так, как если бы они имели тип dynamic.Это происходит автоматически, если параметр Внедрить типы взаимодействия имеет значение по умолчанию (True), или, что эквивалентно, если ссылка на сборку задается с помощью параметра компилятора /link.Тип dynamic делает возможным позднее связывание, уже доступное в Visual Basic, и не допускает явного приведения, которое требовалось в Visual C# 2008 и более ранних версиях этого языка.

    Например, excelApp.Columns[1] возвращает Object и AutoFit метод Excel Диапазон.Без типа dynamic необходимо выполнять приведение объекта, возвращаемого excelApp.Columns[1], к экземпляру Range перед вызовом метода AutoFit.

    // Casting is required in Visual C# 2008.
    ((Excel.Range)excelApp.Columns[1]).AutoFit();
    
    // Casting is not required in Visual C# 2010.
    excelApp.Columns[1].AutoFit();
    

    Дополнительные сведения о внедрении типов взаимодействия см. в подразделах "Поиск ссылки PIA" и "Восстановление зависимости PIA" см. далее в этом разделе.Дополнительные сведения о типе dynamic см. в разделе dynamic (Справочник по C#) или Использование типа dynamic (Руководство по программированию на C#).

Вызов метода DisplayInExcel

  1. Добавьте следующий код в конец метода ThisAddIn_StartUp.Вызов метода DisplayInExcel содержит два аргумента.Первый аргумент представляет собой имя списка счетов, которые требуется обработать.Второй аргумент — это состоящее из нескольких строк лямбда-выражение, которое определяет, каким образом следует обрабатывать данные.Значения ID и balance для каждого из счетов отображаются в соседних ячейках, а если баланс имеет отрицательное значение, строка отображается красным.Лямбда-выражения из нескольких строк являются новой возможностью Visual Basic 2010.Дополнительные сведения см. в разделе Лямбда-выражения (Visual Basic).

    DisplayInExcel(bankAccounts,
           Sub(account, cell)
               ' This multiline lambda expression sets custom
               ' processing rules for the bankAccounts.
               cell.Value = account.ID
               cell.Offset(0, 1).Value = account.Balance
    
               If account.Balance < 0 Then
                   cell.Interior.Color = RGB(255, 0, 0)
                   cell.Offset(0, 1).Interior.Color = RGB(255, 0, 0)
               End If
           End Sub)
    
    DisplayInExcel(bankAccounts, (account, cell) =>
    // This multiline lambda expression sets custom processing rules  
    // for the bankAccounts.
    {
        cell.Value = account.ID;
        cell.Offset[0, 1].Value = account.Balance;
        if (account.Balance < 0)
        {
            cell.Interior.Color = 255;
            cell.Offset[0, 1].Interior.Color = 255;
        }
    });
    
  2. Нажмите клавишу F5, чтобы запустить программу.Появится книга Excel, содержащая данные о счетах.

Добавление документа Word

  • Добавьте в конец метода ThisAddIn_StartUp следующий код, чтобы создать документ Word, содержащий ссылку на книгу Excel.

    Dim wordApp As New Word.Application
    wordApp.Visible = True
    wordApp.Documents.Add()
    wordApp.Selection.PasteSpecial(Link:=True, DisplayAsIcon:=True)
    
    var wordApp = new Word.Application();
    wordApp.Visible = true;
    wordApp.Documents.Add();
    wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
    

    В этом коде демонстрируются некоторые новые функции C#: возможность опускать ключевое слово ref при программировании в модели COM, именованные аргументы и необязательные аргументы.Эти функции уже существовали в Visual Basic.PasteSpecial Метод принимает 7 параметров, которые указываются в виде необязательных ссылочных параметров.До появления Visual C# 2010 необходимо было определять объектные переменные, используемые в качестве аргументов для этих семи параметров, даже если с их помощью не требовалось передавать содержательные значения.Именованные и необязательные аргументы позволяют определить параметры, к которым требуется обращаться по имени, и передавать аргументы только для этих параметров.В этом примере аргументы передаются, чтобы показать, что необходимо создать ссылку на книгу в буфере (параметр Link) и что эта ссылка должна отображаться в документе Word в виде значка (параметр DisplayAsIcon).Кроме того, Visual C# 2010 позволяет опустить ключевое слово ref для таких аргументов.Сравните следующий фрагмент кода Visual C# 2008 с одной строкой в Visual C# 2010:

    // Call to PasteSpecial in Visual C# 2008.
    object iconIndex = Type.Missing;
    object link = true;
    object placement = Type.Missing;
    object displayAsIcon = true;
    object dataType = Type.Missing;
    object iconFileName = Type.Missing;
    object iconLabel = Type.Missing;
    wordApp.Selection.PasteSpecial(ref iconIndex,
                                   ref link,
                                   ref placement,
                                   ref displayAsIcon,
                                   ref dataType,
                                   ref iconFileName,
                                   ref iconLabel);
    
    // Call to PasteSpecial in Visual C# 2010.
    wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
    

Запуск приложения

  • Нажмите клавишу F5 для запуска приложения.Будет запущено приложение Excel, в котором будет открыта таблица, содержащая сведения о двух счетах из списка bankAccounts.После этого будет отрыт документ Word, содержащий ссылку на таблицу Excel.

Очистка готового проекта

  • В Visual Studio в меню Построение выберите пункт Очистить решение.В противном случае надстройка будет запускаться при каждом открытии Excel на компьютере разработчика.

Поиск ссылки PIA

  1. Запустите приложение снова, но не выбирайте Очистить решение.

  2. Нажмите кнопку Пуск и щелкните Все программы.Затем последовательно выберите Microsoft Visual Studio 2010, Visual Studio Tools и Командная строка Visual Studio (2010).

  3. В окне командной строки Visual Studio 2010 введите команду ildasm и нажмите клавишу ВВОД.Появится окно дизассемблера промежуточного языка.

  4. В меню Файл в окне IL DASM выберите пункт Открыть.Дважды щелкните Visual Studio 2010, а затем дважды щелкните Проекты.Откройте папку проекта и найдите в папке bin/Debug файл имя_проекта.dll.Дважды щелкните файл имя_проекта.dll.В новом окне будут показаны атрибуты проекта, а также ссылки на другие модули и сборки.Обратите внимание, что в сборку включены пространства имен Microsoft.Office.Interop.Excel и Microsoft.Office.Interop.Word.По умолчанию в Visual Studio 2010 компилятор импортирует в сборку необходимые типы из сборки PIA, на которую указывает ссылка.

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

  5. Дважды щелкните значок Манифест.Будет открыто окно со списком сборок, содержащих элементы, на которые имеются ссылки в данном проекте.Сборки Microsoft.Office.Interop.Excel и Microsoft.Office.Interop.Word не будут указаны в этом списке.Поскольку необходимые для проекта типы были импортированы в сборку проекта, ссылки на сборки PIA не требуются.Это облегчает развертывание.Сборки PIA не обязательно должны присутствовать на компьютере пользователя, а поскольку приложение не требует развертывания конкретной версии сборки PIA, можно разрабатывать приложения, которые работают с различными версиями Office, если в этих версиях имеются все необходимые интерфейсы API.

    Поскольку развертывание сборок PIA больше не требуется, можно создавать приложения для применения в сложных сценариях, чтобы эти приложения работали с несколькими версиями Office, включая и более ранние версии.Тем не менее это возможно только в том случае, если в коде не используются интерфейсы API, которые недоступны в используемой версии Office.Разработчик не всегда знает, был ли доступен тот или иной интерфейс API в более ранней версии, поэтому работать с более ранними версиями Office не рекомендуется.

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

    До Office 2003 сборки PIA не публиковались.Поэтому единственными способом создания сборки взаимодействия в Office 2002 или более ранних версиях является импорт ссылки COM.

  6. Закройте окно манифеста и окно сборки.

Восстановление зависимости PIA

  1. В обозревателе решений нажмите кнопку Показать все файлы.Разверните папку Ссылки и выберите Microsoft.Office.Interop.Excel.Для отображения окна Свойства нажмите клавишу F4.

  2. В окне Свойства измените значение свойства Внедрить типы взаимодействия с True на False.

  3. Повторите шаги 1 и 2 этой процедуры для сборки Microsoft.Office.Interop.Word.

  4. В C# скройте комментариями два вызова метода Autofit в конце метода DisplayInExcel.

  5. Нажмите клавишу F5, чтобы проверить, что проект по-прежнему выполняется правильно.

  6. Повторите шаги 1–3 из предыдущей процедуры, чтобы открыть окно сборки.Обратите внимание, что сборки Microsoft.Office.Interop.Word и Microsoft.Office.Interop.Excel больше не входят в список внедренных сборок.

  7. Дважды щелкните значок Манифест и прокрутите список сборок, на которые имеются ссылки.Сборки Microsoft.Office.Interop.Word и Microsoft.Office.Interop.Excel отображаются в списке.Поскольку приложение содержит ссылки на сборки PIA Excel и Word, а свойство Внедрить типы взаимодействия имеет значение False, на компьютере пользователя должны храниться обе сборки.

  8. В Visual Studio в меню Построение выберите пункт Очистить решение, чтобы очистить завершенный проект.

См. также

Задачи

Практическое руководство. Использование индексированных свойств в программировании COM-взаимодействия (Руководство по программированию на C#)

Пошаговое руководство. Внедрение данных о типе из сборок для приложений Microsoft Office (C# и Visual Basic)

Пошаговое руководство. Внедрение данных о типах из управляемых сборок (C# и Visual Basic)

Пошаговое руководство. Создание первой надстройки уровня приложения для Excel

Ссылки

Автоматически реализуемые свойства (Руководство по программированию на C#)

Инициализаторы объектов и коллекций (Руководство по программированию в C#)

dynamic (Справочник по C#)

Лямбда-выражения (Руководство по программированию в C#)

Взаимодействие (Руководство по программированию в C#)

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

Автоматически реализуемые свойства (Visual Basic)

Инициализаторы коллекций (Visual Basic)

Необязательные параметры (Visual Basic)

Передача аргументов по позиции и по имени (Visual Basic)

Именованные и необязательные аргументы (Руководство по программированию на C#)

Раннее и позднее связывание (Visual Basic)

Лямбда-выражения (Visual Basic)

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

Использование типа dynamic (Руководство по программированию на C#)

COM-взаимодействие (Visual Basic)