Как получить доступ к объектам взаимодействия Office

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

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

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

Примечание.

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

Внимание

VSTO (набор средств Visual Studio для Office) зависит от платформа .NET Framework. Надстройки COM также можно записывать с помощью платформа .NET Framework. Надстройки Office нельзя создавать с помощью .NET Core и .NET 5+, последних версий .NET. Это связано с тем, что .NET Core/.NET 5+ не может работать вместе с платформа .NET Framework в том же процессе и может привести к сбоям загрузки надстроек. Вы можете продолжать использовать платформа .NET Framework для записи надстроек VSTO и COM для Office. Корпорация Майкрософт не будет обновлять VSTO или платформу надстройки COM для использования .NET Core или .NET 5+. Вы можете воспользоваться преимуществами .NET Core и .NET 5+, включая ASP.NET Core, чтобы создать серверную часть надстроек Office Web.

Создание нового проекта консольного приложения

  1. Запустите среду Visual Studio.
  2. В меню Файл последовательно выберите команды Создатьи Проект. Откроется диалоговое окно Создание проекта .
  3. В области установленных шаблонов разверните C#, а затем выберите Windows.
  4. В верхней части диалогового окна "Новый проект", чтобы выбрать платформа .NET Framework 4 (или более поздней версии) в качестве целевой платформы.
  5. В области "Шаблоны" выберите консольное приложение.
  6. Введите имя проекта в поле Имя.
  7. Нажмите ОК.

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

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

  1. В Обозреватель решений щелкните правой кнопкой мыши имя проекта и нажмите кнопку "Добавить ссылку". Откроется диалоговое окно Добавление ссылки.
  2. На странице Сборки в списке Имя компонента выберите Microsoft.Office.Interop.Word, а затем, удерживая нажатой клавишу CTRL, выберите Microsoft.Office.Interop.Excel. Если сборки не отображаются, их может потребоваться установить. Узнайте , как установить основные сборки взаимодействия Office.
  3. Нажмите ОК.

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

В Обозреватель решений щелкните правой кнопкой мыши файл Program.cs и выберите команду View Code. В начало файла кода добавьте следующие директивы using:

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;

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

Вставьте следующее определение класса в файл Program.cs в класс Program.

public class Account
{
    public int ID { get; set; }
    public double Balance { get; set; }
}

Чтобы создать список bankAccounts, содержащий два счета, добавьте в метод Main следующий код.

// Create a list of accounts.
var bankAccounts = new List<Account> {
    new Account {
                  ID = 345678,
                  Balance = 541.27
                },
    new Account {
                  ID = 1230221,
                  Balance = -127.44
                }
};

Объявление метода, экспортирующего сведения о счетах в Excel

  1. Чтобы настроить лист Excel, добавьте в класс Program следующий метод. У метода Add есть необязательный параметр для указания конкретного шаблона. Необязательные параметры позволяют опустить аргумент для этого параметра, если вы хотите использовать значение по умолчанию параметра. Так как аргумент не задан, Add использует шаблон по умолчанию и создает новую книгу. В эквивалентном операторе в более ранних версиях C# необходимо было использовать аргумент-местозаполнитель ExcelApp.Workbooks.Add(Type.Missing).
static void DisplayInExcel(IEnumerable<Account> accounts)
{
    var excelApp = new Excel.Application();
    // Make the object visible.
    excelApp.Visible = true;

    // Create a new, empty workbook and add it to the collection returned
    // by property Workbooks. The new workbook becomes the active workbook.
    // Add has an optional parameter for specifying a particular template.
    // Because no argument is sent in this example, Add creates a new workbook.
    excelApp.Workbooks.Add();

    // This example uses a single workSheet. The explicit type casting is
    // removed in a later procedure.
    Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
}

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

// Establish column headings in cells A1 and B1.
workSheet.Cells[1, "A"] = "ID Number";
workSheet.Cells[1, "B"] = "Current Balance";

Добавьте в конец метода DisplayInExcel следующий код. Цикл foreach помещает сведения из списка счетов в первые два столбца последовательных строк листа.


var row = 1;
foreach (var acct in accounts)
{
    row++;
    workSheet.Cells[row, "A"] = acct.ID;
    workSheet.Cells[row, "B"] = acct.Balance;
}

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

workSheet.Columns[1].AutoFit();
workSheet.Columns[2].AutoFit();

В более ранних версиях C# требовалось явное приведение типов для этих операций, поскольку ExcelApp.Columns[1] возвращает тип Object, а метод AutoFit является методом Excel Range. Приведение показано в следующих строках.

((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();

C# преобразует возвращаемое Objectdynamic значение автоматически, если сборка ссылается на параметр компилятора EmbedInteropTypes или, аналогично, если свойство Excel Embed Interop Types имеет значение true. True является значением по умолчанию для этого свойства.

Запуск проекта

Добавьте в конец метода Main следующую строку.

// Display the list in an Excel spreadsheet.
DisplayInExcel(bankAccounts);

Нажмите клавиши CTRL+F5. Появится книга Excel, содержащая данные о двух счетах.

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

Следующий код открывает приложение Word и создает значок, который ссылается на лист Excel. Вставьте метод CreateIconInWordDoc, указанный далее в этом шаге, в класс Program. CreateIconInWordDoc использует именованные и необязательные аргументы, чтобы упростить вызовы методов Add и PasteSpecial. Эти вызовы включают две другие функции, которые упрощают вызовы к COM-методам, имеющим ссылочные параметры. Во-первых, аргументы можно передать в ссылочные параметры, как если бы они были параметрами значений. Это значит, что значения можно передавать напрямую без создания переменной для каждого ссылочного параметра. Компилятор создает временные переменные для хранения значений аргументов и уничтожает эти переменные после завершения вызываемого метода. Во-вторых, ключевое слово ref в списке аргументов можно опустить.

У метода Add имеется четыре ссылочных параметра, все из которых являются необязательными. Аргументы для любого или всех параметров можно опустить, если вы хотите использовать их значения по умолчанию.

Метод PasteSpecial вставляет содержимое буфера обмена. У метода имеется семь ссылочных параметров, все из которых являются необязательными. Следующий код задает аргументы для двух из них: Link для создания ссылки на исходное содержимое буфера и DisplayAsIcon для отображения ссылки в виде значка. Для этих двух аргументов можно использовать именованные аргументы и опустить другие. Хотя эти аргументы являются ссылочными параметрами, вам не нужно использовать ref ключевое слово или создавать переменные для отправки в качестве аргументов. Значения можно передать напрямую.

static void CreateIconInWordDoc()
{
    var wordApp = new Word.Application();
    wordApp.Visible = true;

    // The Add method has four reference parameters, all of which are
    // optional. Visual C# allows you to omit arguments for them if
    // the default values are what you want.
    wordApp.Documents.Add();

    // PasteSpecial has seven reference parameters, all of which are
    // optional. This example uses named arguments to specify values
    // for two of the parameters. Although these are reference
    // parameters, you do not need to use the ref keyword, or to create
    // variables to send in as arguments. You can send the values directly.
    wordApp.Selection.PasteSpecial( Link: true, DisplayAsIcon: true);
}

Добавьте в конец метода Main следующую инструкцию.

// Create a Word document that contains an icon that links to
// the spreadsheet.
CreateIconInWordDoc();

Добавьте в конец метода DisplayInExcel следующую инструкцию. Метод Copy добавляет лист в буфер обмена.

// Put the spreadsheet contents on the clipboard. The Copy method has one
// optional parameter for specifying a destination. Because no argument
// is sent, the destination is the Clipboard.
workSheet.Range["A1:B3"].Copy();

Нажмите клавиши CTRL+F5. Появится документ Word, содержащий значок. Дважды щелкните значок, чтобы отобразить лист на переднем плане.

Задание свойства "Внедрить типы взаимодействия"

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

Кроме того, программирование проще, так как dynamic тип представляет необходимые и возвращаемые типы, объявленные в методах COM. Переменные, имеющие тип dynamic , не оцениваются до времени выполнения, что устраняет необходимость явного приведения. Дополнительные сведения см. в разделе Использование типа dynamic.

Внедрение сведений о типе вместо использования ЛИЧНЫХ данных — это поведение по умолчанию. Из-за этого по умолчанию несколько предыдущих примеров упрощены. Вам не требуется явное приведение. Например, объявление worksheet в методе DisplayInExcel записывается как Excel._Worksheet workSheet = excelApp.ActiveSheet, а не как Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet. Для вызовов AutoFit в рамках одного метода также требовалось бы явное приведение без поведения по умолчанию, поскольку ExcelApp.Columns[1] возвращает тип Object, а AutoFit является методом Excel. Приведение показано в следующем примере.

((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();

Чтобы изменить значения по умолчанию и использовать пиА вместо внедрения сведений о типе, разверните узел "Ссылки" в Обозреватель решений, а затем выберите Microsoft.Office.Interop.Excel или Microsoft.Office.Interop.Word. Если окно свойств не отображается, нажмите клавишу F4. В списке свойств найдите свойство Внедрить типы взаимодействия и измените его значение на False. Также можно выполнить компиляцию с помощью командной строки с использованием параметра компилятора References вместо EmbedInteropTypes.

Дополнительное форматирование таблицы

Замените два вызова AutoFit в методе DisplayInExcel следующей инструкцией.

// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(
    Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);

У метода AutoFormat имеется семь параметров значений, и все они являются необязательными. Именованные и необязательные аргументы позволяют задать аргументы для всех параметров, их части или ни для одного параметра. В предыдущем операторе приведен аргумент только для одного из параметров Format. Так как Format это первый параметр в списке параметров, вам не нужно указать имя параметра. Однако оператор может быть проще понять, если вы включаете имя параметра, как показано в следующем коде.

// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(Format:
    Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);

Нажмите сочетание клавиш CTRL + F5, чтобы увидеть результат. Другие форматы можно найти в перечислении XlRangeAutoFormat .

Пример

Ниже приведен полный пример кода.

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

namespace OfficeProgrammingWalkthruComplete
{
    class Walkthrough
    {
        static void Main(string[] args)
        {
            // Create a list of accounts.
            var bankAccounts = new List<Account>
            {
                new Account {
                              ID = 345678,
                              Balance = 541.27
                            },
                new Account {
                              ID = 1230221,
                              Balance = -127.44
                            }
            };

            // Display the list in an Excel spreadsheet.
            DisplayInExcel(bankAccounts);

            // Create a Word document that contains an icon that links to
            // the spreadsheet.
            CreateIconInWordDoc();
        }

        static void DisplayInExcel(IEnumerable<Account> accounts)
        {
            var excelApp = new Excel.Application();
            // Make the object visible.
            excelApp.Visible = true;

            // Create a new, empty workbook and add it to the collection returned
            // by property Workbooks. The new workbook becomes the active workbook.
            // Add has an optional parameter for specifying a particular template.
            // Because no argument is sent in this example, Add creates a new workbook.
            excelApp.Workbooks.Add();

            // This example uses a single workSheet.
            Excel._Worksheet workSheet = excelApp.ActiveSheet;

            // Earlier versions of C# require explicit casting.
            //Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;

            // Establish column headings in cells A1 and B1.
            workSheet.Cells[1, "A"] = "ID Number";
            workSheet.Cells[1, "B"] = "Current Balance";

            var row = 1;
            foreach (var acct in accounts)
            {
                row++;
                workSheet.Cells[row, "A"] = acct.ID;
                workSheet.Cells[row, "B"] = acct.Balance;
            }

            workSheet.Columns[1].AutoFit();
            workSheet.Columns[2].AutoFit();

            // Call to AutoFormat in Visual C#. This statement replaces the
            // two calls to AutoFit.
            workSheet.Range["A1", "B3"].AutoFormat(
                Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);

            // Put the spreadsheet contents on the clipboard. The Copy method has one
            // optional parameter for specifying a destination. Because no argument
            // is sent, the destination is the Clipboard.
            workSheet.Range["A1:B3"].Copy();
        }

        static void CreateIconInWordDoc()
        {
            var wordApp = new Word.Application();
            wordApp.Visible = true;

            // The Add method has four reference parameters, all of which are
            // optional. Visual C# allows you to omit arguments for them if
            // the default values are what you want.
            wordApp.Documents.Add();

            // PasteSpecial has seven reference parameters, all of which are
            // optional. This example uses named arguments to specify values
            // for two of the parameters. Although these are reference
            // parameters, you do not need to use the ref keyword, or to create
            // variables to send in as arguments. You can send the values directly.
            wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
        }
    }

    public class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
}

См. также