Перейти к содержимому

Microsoft office interop excel как подключить

  • автор:

C# Microsoft.Office.Tools.Excel Некорректное подключение сборки

Office 2303 — сообщение из будущего? А вообще, почему вы отказались от ClosedXML и решили использовать Interop?

15 апр 2023 в 9:41

«Office 2303 — сообщение из будущего?» — Нет. Стоит рассмотреть вариант перехода к ClosedXML, но в настоящий момент нужно исправить то что есть.

15 апр 2023 в 14:17

Если ли строгая необходимость использовать .net core, можете проверить что например при использовании .net 4.8 проблема сохраняется? Есть подозрение что не очень хорошо офисный интероп работает с dotnet. Возможно стоит вот ещё взглянуть: stackoverflow.com/a/58130770/735446

18 апр 2023 в 8:50

«Если ли строгая необходимость использовать .net core, можете проверить что например при использовании .net 4.8 проблема сохраняется?» — Проблема исчезает при использовании .NET Framework, решение по ссылке не помогло. Есть сложности в переносе: SocketsHttpHandler доступен только в .NET, я использую этот класс для отправки пакетов через определённый дополнительный IP-адрес (IP алиас).

18 апр 2023 в 17:16

Ещё. как вариант решения проблемы, если проблема исключительно из-за платформы — вы можете сделать что бы одна платформа была рабочей, а другая вспомогательной. Вторая по команде через named-pipe или сокет или субд может принять пакет (пакет можно сериализовать) и обработать в excel по нужному алгоритму, а рабочую не трогать особо.

24 апр 2023 в 15:16

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В с# есть возможность подключать COM-библиотеки напрямую. Долгий путь, не знаю поможет ли вам, но возможно поможет.

Как я это делал (на примере ScriptControl Как выполнить JavaScript на c#?).

    Открываете системный реестр. В ветке HKEY_CLASSES_ROOT Находите там ваш класс. Чаще всего работает application. Например «Excel.Application» или «Excel.Application.12» (версия офиса который у меня).

 Type TExcel=Type.GetTypeFromProgID("Excel.Application"); object Excel = TExcel.InvokeMember(null, BindingFlags.CreateInstance, null, null, new object[0]); 

Тут прокоментирую, COM библитотеки бывают двух видов, 32-битные, 64-битные, и двойные. Если выдаст 80040154 ошибку, и ProgID есть в реестре. то ему не нравится сборка.

    В либо гуглим в интернете библиотеку, или вариант 2, найтиде файл excel.exe и вытрусите с него с помощью программы Exescope, ResourceHacker раздел TypeLib, и попробуйте получить пару свойств с помощью COM методов. Они будут совпадать с теми, которые вы ранее использовали, но доступ к ним через своеобразную рефлексию будет. Ниже привожу нерабочий пример, что бы показать в какую сторону копать

TScript.InvokeMember("Language", BindingFlags.SetProperty, null, sc, new object[]); TScript.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, sc, new object[]); TScript.InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, excelworkbook, new object[]); 

Возможно кто-то уже для c# делал обвертку с# - COM Excel.Application, может погуглив удастся такое найти.

Возможно доступ к исщезнувшему методу удастся восстановить через рефлексию, как показано выше в п.2.

Вообще ситуация странная, может это какой-то баг который позже исправят. COM-библиотека это самый "нулевой" уровень доступа excel, если microsoft что-то испортили в промежуточной библиотеке, то COM - должно работать.

Пошаговое руководство. Программирование Office в C#

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

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

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

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.

Необходимые компоненты

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

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

Настройка приложения надстройки Excel

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

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

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

Добавление необходимых инструкций Import или директив using

В Обозреватель решений щелкните правой кнопкой мыши файл ThisAddIn.cs и выберите команду View Code. Добавьте следующие using директивы (C#) в начало файла кода, если они еще не присутствуют.

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

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

В Обозреватель решений щелкните правой кнопкой мыши имя проекта, выберите "Добавить" и выберите "Класс". Назовите класс Account.cs. Выберите Добавить. Замените определение класса Account следующим кодом. В определениях классов используются автоматически реализуемые свойства.

class Account < public int ID < get; set; >public double Balance < get; set; >> 

Чтобы создать bankAccounts список, содержащий две учетные записи, добавьте следующий код в ThisAddIn_Startup метод в ThisAddIn.cs. В объявлениях списков используются инициализаторы коллекций.

var bankAccounts = new List < new Account < Balance = 541.27 >, new Account < Balance = -127.44 >>; 

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

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

void DisplayInExcel(IEnumerable accounts, Action 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(); > 
  • У метода Add есть необязательный параметр для указания конкретного шаблона. Необязательные параметры позволяют опустить аргумент для этого параметра, если вы хотите использовать значение по умолчанию параметра. Так как предыдущий пример не имеет аргументов, Add использует шаблон по умолчанию и создает новую книгу. В эквивалентном операторе в более ранних версиях C# необходимо было использовать аргумент-местозаполнитель excelApp.Workbooks.Add(Type.Missing) . Дополнительные сведения см. в разделе Именованные и необязательные аргументы.
  • Свойства 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(); 

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

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

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

Эти дополнения демонстрируют еще одну возможность C#: значения Object , возвращаемые главными приложениями COM, например приложениями Office, и обрабатываются так, как если бы они имели тип dynamic. COM-объекты обрабатываются автоматически dynamic , если типы взаимодействия внедрения имеют значение по умолчанию или True , аналогично, при ссылке на сборку с параметром компилятора EmbedInteropTypes . Дополнительные сведения о внедрении типов взаимодействия см. в процедурах "Поиск ссылки на PIA" и "Восстановление зависимости PIA" далее в этой статье. Дополнительные сведения о dynamic см. в разделе dynamic или Использование типа dynamic.

Вызов DisplayInExcel

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

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; >>); 

Чтобы запустить программу, нажмите клавишу F5. Появится книга Excel, содержащая данные о счетах.

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

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

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

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

Выполнение приложения

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

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

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

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

  1. Снова запустите приложение, но не нажимайте кнопку "Очистить решение".
  2. Выберите кнопку Пуск. Найдите версию> Microsoft Visual Studio
  3. В окне командной строки разработчика для Visual Studio введите команду ildasm , а затем нажмите клавишу ВВОД. Появится окно программы IL DASM.
  4. В меню Файл в окне IL DASM выберите пункт Файл>Открыть. Дважды щелкните версию> Visual Studio Проекты". Откройте папку проекта и найдите в папке bin/Debug файл имя_проекта.dll. Дважды щелкните файл имя_проекта.dll. В новом окне будут показаны атрибуты проекта, а также ссылки на другие модули и сборки. Сборка включает пространства Microsoft.Office.Interop.Excel имен и Microsoft.Office.Interop.Word . По умолчанию в Visual Studio компилятор импортирует в сборку необходимые типы из сборки PIA, на которую указывает ссылка. Дополнительные сведения см. в разделе Практическое руководство. Просмотр содержимого сборок.
  5. Дважды щелкните значок МАНИФЕСТ. Откроется окно со списком сборок, содержащих элементы, на которые имеются ссылки в проекте. Microsoft.Office.Interop.Excel и Microsoft.Office.Interop.Word нет в списке. Так как вы импортировали типы проектов в сборку, вам не требуется устанавливать ссылки на PIA. Импорт типов в сборку упрощает развертывание. Пин-коды не должны присутствовать на компьютере пользователя. Приложению не требуется развертывание определенной версии PIA. Приложения могут работать с несколькими версиями Office, если необходимые API существуют во всех версиях. Поскольку развертывать сборки PIA больше не требуется, можно создавать приложения для применения в сложных сценариях, чтобы эти приложения работали с несколькими версиями Office, включая и более ранние версии. Код не может использовать интерфейсы API, которые недоступны в версии Office, с которыми вы работаете. Не всегда ясно, был ли определенный API доступен в более ранней версии. Не рекомендуется работать с более ранними версиями Office.
  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 . Так как приложение ссылается на личные данные Excel и Word, а свойство "Типы взаимодействия внедрения" имеет значение False, обе сборки должны существовать на компьютере конечного пользователя.
  8. В Visual Studio выберите "Очистить решение " в меню "Сборка ", чтобы очистить завершенный проект.

См. также

  • Автоматически реализуемые свойства (C#)
  • Инициализаторы объектов и коллекций
  • набор средств Visual Studio для Office (VSTO)
  • Именованные и необязательные аргументы
  • Динамический
  • Использование типа dynamic
  • Лямбда-выражения (C#)
  • Пошаговое руководство. Внедрение данных о типах из сборок Microsoft Office в Visual Studio
  • Пошаговое руководство. Внедрение данных о типах из управляемых сборок
  • Пошаговое руководство. Создание первой надстройки VSTO для Excel

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Как получить доступ к объектам взаимодействия 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 < new Account < Balance = 541.27 >, new Account < Balance = -127.44 >>; 

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

  1. Чтобы настроить лист Excel, добавьте в класс Program следующий метод. У метода Add есть необязательный параметр для указания конкретного шаблона. Необязательные параметры позволяют опустить аргумент для этого параметра, если вы хотите использовать значение по умолчанию параметра. Так как аргумент не задан, Add использует шаблон по умолчанию и создает новую книгу. В эквивалентном операторе в более ранних версиях C# необходимо было использовать аргумент-местозаполнитель ExcelApp.Workbooks.Add(Type.Missing) .
static void DisplayInExcel(IEnumerable 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)

Добавьте в конец метода 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# преобразует возвращаемое Object dynamic значение автоматически, если сборка ссылается на параметр компилятора 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< new Account < Balance = 541.27 >, new Account < 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 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; >> > 

См. также

  • Type.Missing
  • Динамический
  • Именованные и необязательные аргументы
  • Использование именованных и необязательных аргументов в программировании приложений Office

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Записная книжка программиста-новичка, C#, SQL, PHP и все-все-все

Я ведь это уже делал, но хрен теперь найдешь тот кусок кода, гуглим снова… Где бы найти простое и понятное руководство для начинающего, а не тонкости для мега-гуру?

Главная→C#→MS Office→Excel→ Работа с Excel из C# через COM Interop, часть 1, открываем документ и выводим данные

Рубрики

Свежие записи

  • Вырезаем числовую часть из начала строки в transact-sql
  • Пул соединений с базой данных в ADO.NET / OleDb - как избежать проблем с утечкой соединений в ASP.NET (перевод)
  • ASP .Net MVC, JQuery и AJAX - отсылаем данные на сервер
  • Разделитель тысяч и дробной части для decimal
  • Создаем расширенный Control в WinForms наследуясь от существующего
  • Вставка строк и изменение границ ячеек в Excel Interop из C#
  • Как прочитать данные из удаленного DataRow в DataTable
  • Проблемы с кодировкой при копировании русского текста из MS SQL Studio в Outlook/Word/Office
  • Как проверить, существует ли таблица в MS SQL Server перед удалением/созданием
  • Очень просто.
  • Получаем выбранные строки DataGridView, в котором выбраны только ячейки
  • Ошибка в коде привела к убыткам в 476 миллионов долларов и банкротству компании
  • Отслеживаем изменения выбранного значения в колонке ComboBox DataGridView (DataGridViewComboBoxColumn)
  • Excel 2010, Windows 7, два монитора и "ошибка при направлении команды приложению"
  • Удаляем default-ограничение (constraint) в Transact Sql

Свежие комментарии

  • Kirill к записи Самоучитель по C# для начинающих. 01. Основы языка, переменные, логика, циклы.
  • как избавиться от чувства вины к записи Как добавить строку/текст в начало файла в C# и .Net
  • DannyLef к записи Полезные расширения-плагины для WordPress
  • как избавиться от чувства вины к записи Как добавить строку/текст в начало файла в C# и .Net
  • gweg2ehgwEHERWQHQ к записи Простейшее диалоговое окно-вопрос (MessageBox) в WindowsForms

Архивы

Мета

Работа с Excel из C# через COM Interop, часть 1, открываем документ и выводим данные

Опубликовано 23.03.2012 автором Ведомир

Задача: вывести данные в таблицу Excel с красивым оформлением и открыть ее, чтобы пользователь мог напечатать или сохранить средствами самого Excel. Необходимо поддерживать все версии Office, начиная с 97, то есть вывод в новые xml-форматы Office 2007 и выше невозможен

Самая сложная часть - работа с оформлением, так как во-первых интерфейс Excel крайне неочевиден, запутан и плохо документирован, во-вторых оформление Excel таблицы из кода работает достаточно медленно. В связи с этим в большинстве случаев подойдет вариант с использованием шаблонов .xlt. Так как мы выводим файл для просмотра и печати, без расчета на сложные вычисления, диаграммы и прочие прелести жизни, мы можем привести формат всех ячеек к тексту и забыть про различные типы данных.

Таким образом задача сводится к следующему:

1) Подготовить файлы шаблонов для разных типов выборок (шапка, размер шрифта, перенос по словам, ширина столбцов)
2) Взять данные из программы и вывести их в нужное место шаблона (как правило это прямоугольный массив ячеек соответствующий DataTable)
3) Подключить к проекту dll-библиотеку Excel Microsoft.Office.Interop.Excel в раздел references и проставить параметр копирования библиотеки к скомпилированным файлами CopyLocal в True.
4) Написать класс для работы с Excel и вывести через него данные из таблицы

При такой постановки задачи "Но это же неэстетично! - Зато дешево, надежно и практично" сам класс работы с Excel получается достаточно простым, но превосходно выполняет поставленную задачу

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Excel = Microsoft.Office.Interop.Excel; namespace TestProject < // Класс документа Excel скрывает подробности работы с эксел, требует добавления в References библиотеки Microsoft.Office.Interop.Excel public class ExcelDocument < private Excel.Application _application = null; private Excel.Workbook _workBook = null; private Excel.Worksheet _workSheet = null; private object _missingObj = System.Reflection.Missing.Value; //КОНСТРУКТОР public ExcelDocument() < _application = new Excel.ApplicationClass(); _workBook = _application.Workbooks.Add(_missingObj); _workSheet = (Excel.Worksheet)_workBook.Worksheets.get_Item(1); >public ExcelDocument(string pathToTemplate) < object pathToTemplateObj = pathToTemplate; _application = new Excel.ApplicationClass(); _workBook = _application.Workbooks.Add(pathToTemplateObj); _workSheet = (Excel.Worksheet)_workBook.Worksheets.get_Item(1); >// ВИДИМОСТЬ ДОКУМЕНТА public bool Visible < get < return _application.Visible; >set < _application.Visible = value; >> // ВСТАВКА ЗНАЧЕНИЯ В ЯЧЕЙКУ public void SetCellValue(string cellValue, int rowIndex, int columnIndex) < _workSheet.Cells[rowIndex, columnIndex] = cellValue; >public void Close() < _workBook.Close(false, _missingObj, _missingObj); _application.Quit(); System.Runtime.InteropServices.Marshal. ReleaseComObject(_application); _application = null; _workBook = null; _workSheet = null; System.GC.Collect(); >> >

У класса есть одна особенность - он работает с неуправляемым ресурсом - приложением Excel. То есть мы создаем невидимый процесс Excel, заполняем его данными из шаблона и программ и только после этого отображаем на экран. В случае ошибок никакой сборщик мусора не приберет за нами грязь, так что закрытие документа в случае ошибки придется делать в ручную. Собственноручное изменение деструктора тоже работает весьма своеобразно с COM-интерфейсом.

В простейшем случае получим код вида

ExcelDocument excelDoc = new ExcelDocument(Application.StartupPath + "\\" + "templateFileName.xlt"); int rowIndex = 1; try < // так и просится в отдельный метод foreach (DataRow currRow in someDataTable.Rows) < string valueCol1 = currRow["COLUMN1"].ToString(); string valueCol2 = currRow["COLUMN2"].ToString(); excelDoc.SetCellValue(valueCol1, rowIndex, 1); excelDoc.SetCellValue(valueCol2, rowIndex, 2); rowIndex++; >> catch(Exception error) < excelDoc.Close(); // обрабатываем саму ошибку >excelDoc.Visible = true;

Само собой ничто не мешает в дальнейшем расширить этот класс методами для работы с оформлением, вроде

public void SetColumnWidth(int columnIndex, int colWidth)

Такой метод вряд ли подойдет для больших и сложных корпоративных систем, разрабатываемых высокооплачиваемыми профессионалами, но может спасти программиста-новичка в случае требования начальства "сделать ВЧЕРА вывод отчета в excel в соответствии с требования клиента по оформлению".

  • Вставка строк и изменение границ ячеек в Excel Interop из C#
  • Excel 2010, Windows 7, два монитора и "ошибка при направлении команды приложению"
  • Как прочитать db3/dbf/dbase из C#
  • Работа с Excel из C# через COM Interop, часть 3, чтение данных
  • Как полностью закрыть Excel, вызванный из C# Interop
  • Работа с Excel из C# через COM Interop, часть 1, открываем документ и выводим данные

Комментарии

Работа с Excel из C# через COM Interop, часть 1, открываем документ и выводим данные — Комментарии (6)

Михаил говорит 15.05.2012 в 6:52 :

Не надо сгущать краски. Работать с Excel также просто (или сложно), как и с чем-то другим. Разные варианты загрузки данных из Excel с учетом преобразования данных требуют разное операционное время, поэтому нужно выбирать нужный для конкретного случая.

Вася говорит 13.06.2014 в 15:55 :
Я, наверно, буду голосом большинства когда спрошу. ГДЕ ССЫЛКА НА ВТОРУЮ ЧАСТЬ ?
Владимир говорит 28.07.2016 в 8:50 :

Необходимо поддерживать все версии Office, начиная с 97, то есть вывод в новые xml-форматы Office 2007 и выше невозможен
И где же решение данной части задачи?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *