Практическое руководство. Доступ к объектам взаимодействия Office с помощью функций языка Visual C# (Руководство по программированию на C#)
В Visual C# 2010 появились новые функции, упрощающие доступ к объектам API Office. К новым функциям относятся именованные и необязательные аргументы, новый тип dynamic, а также возможность передавать аргументы ссылочным параметрам в методах COM, как если бы они были параметрами значений.
В этом разделе с использованием новых функций будет написан код, который создает и отображает лист Microsoft Office Excel. После этого будет написан код для добавления документа Office Word, который содержит значок, ссылающийся на лист Excel.
Для выполнения данного пошагового руководства на компьютере должны быть установлены Microsoft Office Excel 2007 и Microsoft Office Word 2007 или более поздние версии продуктов.
Если используется операционная система, более ранняя, чем Windows Vista, убедитесь, что установлена платформа .NET Framework 2,0.
Примечание
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Настройка параметров разработки в Visual Studio.
Создание нового проекта консольного приложения
Запустите Visual Studio.
В меню Файл выберите пункт Создать, а затем команду Проект. Откроется диалоговое окно Новый проект.
В области Установленные шаблоны разверните узел Visual C# и выберите Windows.
В верхней части диалогового окна Новый проект должен быть выбран вариант .NET Framework 4 (или более поздняя версия) выбран в качестве требуемой версии платформы.
В области Шаблоны щелкните Консольное приложение.
Введите имя проекта в поле Имя.
Нажмите кнопку ОК.
В обозревателе решений появится новый проект.
Добавление ссылок
В обозревателе решений щелкните имя проекта правой кнопкой мыши и выберите Добавить ссылку. Откроется диалоговое окно Добавление ссылки.
На странице Сборки в списке Имя компонента выберите Microsoft.Office.Interop.WordComponent Name, а затем, удерживая нажатой клавишу CTRL, выберите Microsoft.Office.Interop.Excel. Если сборки отсутствуют, может потребоваться проверить, что они установлены и отображаются (см. раздел Практическое руководство. Установка основных сборок взаимодействия Microsoft Office).
Нажмите кнопку ОК.
Добавление необходимых директив using
В обозревателя решений щелкните правой кнопкой мыши файл Program.cs и выберите пункт Просмотреть код.
В начало файла кода добавьте следующие директивы 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
Чтобы настроить лист Excel, добавьте в класс Program следующий метод.
У метода Add есть необязательный параметр для указания конкретного шаблона. Необязательные параметры, впервые появившиеся в Visual C# 2010, позволяют опускать аргумент для таких параметров, если требуется использовать значение параметра по умолчанию. Поскольку в следующем коде никакой аргумент не передается, в методе 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 praticular 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();
В Visual C# 2010 и более поздних версиях возвращаемое значение Object преобразуется в dynamic автоматически, если ссылка на сборку задана с помощью параметра компилятора /link или, что эквивалентно, если свойство Excel Внедрить типы взаимодействия имеет значение true. True является значением по умолчанию для этого свойства.
Запуск проекта
Добавьте в конец метода Main следующую строку.
// Display the list in an Excel spreadsheet. DisplayInExcel(bankAccounts);
Нажмите клавиши CTRL+F5.
Появится книга Excel, содержащая данные о двух счетах.
Добавление документа Word
Чтобы продемонстрировать дополнительные способы, совершенствующие программирование для Office в Visual C# 2010 и более поздних версиях, следующий код открывает приложение Word и создает значок со ссылкой на лист Excel.
Вставьте метод CreateIconInWordDoc, указанный далее в этом шаге, в класс Program. В методе CreateIconInWordDoc используются именованные и необязательные аргументы, чтобы упростить вызовы методов Add и PasteSpecial. Этих вызовах используются две новые возможности, появившиеся в Visual C# 2010 которые упрощают вызовы методов COM, имеющих ссылочные параметры. Во-первых, аргументы можно передать в ссылочные параметры, как если бы они были параметрами значений. Это значит, что значения можно передавать напрямую без создания переменной для каждого ссылочного параметра. Компилятор создает временные переменные для хранения значений аргументов и уничтожает эти переменные после завершения вызываемого метода. Во-вторых, ключевое слово ref в списке аргументов можно опустить.
У метода Add имеется четыре ссылочных параметра, все из которых являются необязательными. В Visual C# 2010 или более поздних версиях можно опустить аргументы для любого или для всех параметров, если требуется использовать значения по умолчанию. В Visual C# 2008 и более ранних версиях необходимо было указывать аргумент для каждого из параметров, и этот аргумент должен был быть переменной, поскольку параметры являются ссылочными.
Метод PasteSpecial вставляет содержимое буфера обмена. У метода имеется семь ссылочных параметров, все из которых являются необязательными. Следующий код задает аргументы для двух из них: Link для создания ссылки на исходное содержимое буфера и DisplayAsIcon для отображение ссылки в виде значка. В Visual C# 2010 можно использовать именованные аргументы для этих двух параметров и опустить остальные аргументы. Хотя эти параметры являются ссылочными, использовать ключевое слово ref или создавать переменные для передачи аргументов не требуется. Значения можно передать напрямую. В Visual C# 2008 и более ранних версиях необходимо было передавать аргумент в виде переменной для каждого ссылочного параметра.
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# 2010 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); }
В Visual C# 2008 и более ранних версиях приходилось использовать следующий более сложный синтаксис.
static void CreateIconInWordDoc2008() { var wordApp = new Word.Application(); wordApp.Visible = true; // The Add method has four parameters, all of which are optional. // In Visual C# 2008 and earlier versions, an argument has to be sent // for every parameter. Because the parameters are reference // parameters of type object, you have to create an object variable // for the arguments that represents 'no value'. object useDefaultValue = Type.Missing; wordApp.Documents.Add(ref useDefaultValue, ref useDefaultValue, ref useDefaultValue, ref useDefaultValue); // PasteSpecial has seven reference parameters, all of which are // optional. In this example, only two of the parameters require // specified values, but in Visual C# 2008 an argument must be sent // for each parameter. Because the parameters are reference parameters, // you have to contruct variables for the arguments. object link = true; object displayAsIcon = true; wordApp.Selection.PasteSpecial( ref useDefaultValue, ref link, ref useDefaultValue, ref displayAsIcon, ref useDefaultValue, ref useDefaultValue, ref useDefaultValue); }
Добавьте в конец метода 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 приводит к независимости версий и делает развертывание более простым. Дополнительные сведения о преимуществах программирования без основных сборок взаимодействия см. в разделе Пошаговое руководство. Внедрение данных о типах из управляемых сборок (C# и Visual Basic).
Кроме того, писать программы стало проще, поскольку типы, принимаемые и возвращаемые методами COM, можно представить с помощью типа dynamic вместо типа Object. Переменные типа dynamic не вычисляются до времени выполнения, что позволяет обходиться без явного приведения. Для получения дополнительной информации см. Использование типа dynamic (Руководство по программированию на C#).
В Visual C# 2010 внедрение сведений о типах вместо использования сборок PIA является поведением по умолчанию. За счет этого несколько приведенных выше примеров становятся проще, поскольку явное приведение не требуется. Например, объявление 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();
Чтобы изменить поведение по умолчанию и использовать сборки PIA вместо внедрения сведений о типе, разверните узел Ссылки в обозревателе решений и выберите Microsoft.Office.Interop.Excel или Microsoft.Office.Interop.Word.
Если окно Свойства не отображается, нажмите клавишу F4.
В списке свойств найдите свойство Внедрить типы взаимодействия и измените его значение на False. Либо можно выполнить компиляцию через командную строку с использованием параметра компилятора /reference вместо /link.
Дополнительное форматирование таблицы
Замените два вызова 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.
Сравните инструкцию в шаге 1 со следующим кодом, в котором показаны аргументы, необходимые в Visual C# 2008 или более ранней версии.
// The AutoFormat method has seven optional value parameters. The // following call specifies a value for the first parameter, and uses // the default values for the other six. // Call to AutoFormat in Visual C# 2008. This code is not part of the // current solution. excelApp.get_Range("A1", "B4").AutoFormat(Excel.XlRangeAutoFormat.xlRangeAutoFormatTable3, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Пример
Ниже приведен полный пример кода.
using System;
using System.Collections.Generic;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
namespace OfficeProgramminWalkthruComplete
{
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 praticular 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# 2010. 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# 2010 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; }
}
}
См. также
Задачи
Ссылки
Основные понятия
Именованные и необязательные аргументы (Руководство по программированию на C#)
Другие ресурсы
Использование типа dynamic (Руководство по программированию на C#)