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


Использование именованных и необязательных аргументов в программировании Office

Именованные аргументы и необязательные аргументы повышают удобство, гибкость и удобочитаемость в программировании на C#. Кроме того, эти функции значительно упрощают доступ к COM-интерфейсам, таким как API автоматизации Microsoft Office.

Это важно

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.

В следующем примере метод ConvertToTable имеет 16 параметров, представляющих характеристики таблицы, такие как количество столбцов и строк, форматирование, границы, шрифты и цвета. Все 16 параметров являются необязательными, так как в большинстве случаев вы не хотите указывать определенные значения для всех этих параметров. Однако, если не используются именованные и необязательные аргументы, вы должны указать значение или использовать значение-заполнитель. При использовании именованных и необязательных аргументов значения указываются только для параметров, необходимых для проекта.

Для выполнения этих процедур на компьютере необходимо установить Microsoft Office Word.

Замечание

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

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

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

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

В обозревателе решений щелкните правой кнопкой мыши имя проекта и выберите команду Добавить ссылку. Диалоговое окно Добавление ссылки появляется. На странице .NET выберите Microsoft.Office.Interop.Word в списке имен компонентов . Нажмите ОК.

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

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

using Word = Microsoft.Office.Interop.Word;

Отображение текста в документе Word

Program В классе в Program.cs добавьте следующий метод для создания приложения Word и документа Word. Метод Add имеет четыре необязательных параметра. В этом примере используются значения по умолчанию. Поэтому в операторе вызова не требуется никаких аргументов.

Замечание

Чтобы избежать проблем с потоком COM и временем, которые могут привести к исключениям, таким как "Фильтр сообщений указывает, что приложение занято" (HRESULT 0x8001010A), приложение Word остается невидимым во время операций и становится видимым только после завершения всех операций.

static void DisplayInWord()
{
    var wordApp = new Word.Application();
    // Keep Word invisible during operations to avoid COM threading issues
    wordApp.Visible = false;
    // docs is a collection of all the Document objects currently
    // open in Word.
    Word.Documents docs = wordApp.Documents;

    // Add a document to the collection and name it doc.
    Word.Document doc = docs.Add();
    
    // Make Word visible after operations are complete
    wordApp.Visible = true;
}

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

// Define a range, a contiguous area in the document, by specifying
// a starting and ending character position. Currently, the document
// is empty.
Word.Range range = doc.Range(0, 0);

// Use the InsertAfter method to insert a string at the end of the
// current range.
range.InsertAfter("Testing, testing, testing. . .");

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

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

DisplayInWord();

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

Изменить текст на таблицу

Используйте метод ConvertToTable, чтобы заключить текст в таблицу. Метод имеет 16 необязательных параметров. IntelliSense заключает необязательные параметры в квадратные скобки, как показано на следующем рисунке. Значения Type.Missing по умолчанию — это простое имя для System.Type.Missing.

Список параметров для метода ConvertToTable

Именованные и необязательные аргументы позволяют указывать значения только для параметров, которые требуется изменить. Добавьте следующий код в конец метода DisplayInWord для создания таблицы. Аргумент указывает, что запятые в текстовой строке в range разделяют ячейки таблицы.

// Convert to a simple table. The table will have a single row with
// three columns.
range.ConvertToTable(Separator: ",");

Нажмите клавиши CTRL+F5 , чтобы запустить проект.

Эксперимент с другими параметрами

Измените таблицу так, чтобы она содержала один столбец и три строки, замените последнюю строку в DisplayInWord на следующую инструкцию и нажмите CTRL+F5.

range.ConvertToTable(Separator: ",", AutoFit: true, NumColumns: 1);

Укажите предопределенный формат таблицы, замените последнюю строку в DisplayInWord следующей инструкции и введите CTRL+F5. Формат может быть любым из констант WdTableFormat .

range.ConvertToTable(Separator: ",", AutoFit: true, NumColumns: 1,
    Format: Word.WdTableFormat.wdTableFormatElegant);

Пример

Следующий код содержит полный пример:

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

namespace OfficeHowTo
{
    class WordProgram
    {
        static void Main(string[] args)
        {
            DisplayInWord();
        }

        static void DisplayInWord()
        {
            var wordApp = new Word.Application();
            // Keep Word invisible during operations to avoid COM threading issues
            wordApp.Visible = false;
            // docs is a collection of all the Document objects currently
            // open in Word.
            Word.Documents docs = wordApp.Documents;

            // Add a document to the collection and name it doc.
            Word.Document doc = docs.Add();

            // Define a range, a contiguous area in the document, by specifying
            // a starting and ending character position. Currently, the document
            // is empty.
            Word.Range range = doc.Range(0, 0);

            // Use the InsertAfter method to insert a string at the end of the
            // current range.
            range.InsertAfter("Testing, testing, testing. . .");

            // You can comment out any or all of the following statements to
            // see the effect of each one in the Word document.

            // Next, use the ConvertToTable method to put the text into a table.
            // The method has 16 optional parameters. You only have to specify
            // values for those you want to change.

            // Convert to a simple table. The table will have a single row with
            // three columns.
            range.ConvertToTable(Separator: ",");

            // Change to a single column with three rows..
            range.ConvertToTable(Separator: ",", AutoFit: true, NumColumns: 1);

            // Format the table.
            range.ConvertToTable(Separator: ",", AutoFit: true, NumColumns: 1,
                Format: Word.WdTableFormat.wdTableFormatElegant);

            // Make Word visible after all operations are complete
            wordApp.Visible = true;
        }
    }
}