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

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

  • автор:

Как подключить microsoft.office.interop.excel

Добрый день. У меня такой вопрос: Во время написания курсовой работы по программированию, столкнулся с необходимостью использовать Excel. У меня Microsoft Visual C# 2010 Express, и как оказалось там нет microsoft.office.interop.excel (я не нашел в любом случаи).
После долгих поисков, скачал с официального сайта microsoft пакет обновлений для Office 2003 и нашел там нужную библиотеку, V11. Написал программу. Однако, выходит работать только с 2003 Office-ом (Пробовал у друга с другой версией Office, не работает). Где взять библиотеку для работы с как можно более поздними версиями. Все обыскал.

94731 / 64177 / 26122

Работа с Excel с помощью C# (Microsoft.Office.Interop.Excel)

Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.

Наработки очень пригодились в работе для формирования отчетности.

Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.

Подключение Microsoft.Office.Interop.Excel

Далее создаем псевдоним для работы с Excel:

using Excel = Microsoft.Office.Interop.Excel;

//Объявляем приложение Excel.Application ex = new Microsoft.Office.Interop.Excel.Application(); //Отобразить Excel ex.Visible = true; //Количество листов в рабочей книге ex.SheetsInNewWorkbook = 2; //Добавить рабочую книгу Excel.Workbook workBook = ex.Workbooks.Add(Type.Missing); //Отключить отображение окон с сообщениями ex.DisplayAlerts = false; //Получаем первый лист документа (счет начинается с 1) Excel.Worksheet sheet = (Excel.Worksheet)ex.Worksheets.get_Item(1); //Название листа (вкладки снизу) sheet.Name = "Отчет за 13.12.2017"; //Пример заполнения ячеек for (int i = 1; i ", i, j); > //Захватываем диапазон ячеек Excel.Range range1 = sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[9, 9]); //Шрифт для диапазона range1.Cells.Font.Name = "Tahoma"; //Размер шрифта для диапазона range1.Cells.Font.Size = 10; //Захватываем другой диапазон ячеек Excel.Range range2 = sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[9, 2]); range2.Cells.Font.Name = "Times New Roman"; //Задаем цвет этого диапазона. Необходимо подключить System.Drawing range2.Cells.Font.Color = ColorTranslator.ToOle(Color.Green); //Фоновый цвет range2.Interior.Color = ColorTranslator.ToOle(Color.FromArgb(0xFF, 0xFF, 0xCC));
Расстановка рамок.

Расставляем рамки со всех сторон:

range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeRight).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlInsideHorizontal).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlInsideVertical).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeTop).LineStyle = Excel.XlLineStyle.xlContinuous;

Цвет рамки можно установить так:

Выравнивания в диапазоне задаются так:

rangeDate.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; rangeDate.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;

Формулы

Определим задачу: получить сумму диапазона ячеек A4:A10.

Для начала снова получим диапазон ячеек:

Excel.Range formulaRange = sheet.get_Range(sheet.Cells[4, 1], sheet.Cells[9, 1]);

Далее получим диапазон вида A4:A10 по адресу ячейки ( [4,1]; [9;1] ) описанному выше:

string adder = formulaRange.get_Address(1, 1, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

Теперь в переменной adder у нас хранится строковое значение диапазона ( [4,1]; [9;1] ), то есть A4:A10.

//Одна ячейка как диапазон Excel.Range r = sheet.Cells[10, 1] as Excel.Range; //Оформления r.Font.Name = "Times New Roman"; r.Font.Bold = true; r.Font.Color = ColorTranslator.ToOle(Color.Blue); //Задаем формулу суммы r.Formula = String.Format("=СУММ(", adder);

Выделение ячейки или диапазона ячеек

Так же можно выделить ячейку или диапазон, как если бы мы выделили их мышкой:

sheet.get_Range("J3", "J8").Activate(); //или sheet.get_Range("J3", "J8").Select(); //Можно вписать одну и ту же ячейку, тогда будет выделена одна ячейка. sheet.get_Range("J3", "J3").Activate(); sheet.get_Range("J3", "J3").Select();

Авто ширина и авто высота

Чтобы настроить авто ширину и высоту для диапазона, используем такие команды:

range.EntireColumn.AutoFit(); range.EntireRow.AutoFit();

Получаем значения из ячеек

Чтобы получить значение из ячейки, используем такой код:

//Получение одной ячейки как ранга Excel.Range forYach = sheet.Cells[ob + 1, 1] as Excel.Range; //Получаем значение из ячейки и преобразуем в строку string yach = forYach.Value2.ToString();

Добавляем лист в рабочую книгу

Чтобы добавить лист и дать ему заголовок, используем следующее:

var sh = workBook.Sheets; Excel.Worksheet sheetPivot = (Excel.Worksheet)sh.Add(Type.Missing, sh[1], Type.Missing, Type.Missing); sheetPivot.Name = "Сводная таблица";

Добавление разрыва страницы

//Ячейка, с которой будет разрыв Excel.Range razr = sheet.Cells[n, m] as Excel.Range; //Добавить горизонтальный разрыв (sheet - текущий лист) sheet.HPageBreaks.Add(razr); //VPageBreaks - Добавить вертикальный разрыв

Сохраняем документ

ex.Application.ActiveWorkbook.SaveAs("doc.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Как открыть существующий документ Excel

ex.Workbooks.Open(@"C:\Users\Myuser\Documents\Excel.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Комментарии

При работе с Excel с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.

Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.

Далее заходим в редактор Visual Basic и смотрим код, который туда записался:

Vusial Basic (VBA)

Sub Макрос1() ' ' Макрос1 Макрос ' ' Range("E88").Select ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$F$118"), , xlYes).Name = _ "Таблица1" Range("A1:F118").Select ActiveSheet.ListObjects("Таблица1").TableStyle = "TableStyleLight9" Range("E18").Select ActiveWindow.SmallScroll Down:=84 End Sub

В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.

Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:

//Складываем значения предыдущих 12 ячеек слева rang.Formula = "=СУММ(RC[-12]:RC[-1])";

Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.

Чтобы выбрать лист, выполните sheetData.Select(Type.Missing); где sheetData это нужный лист.

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

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

15 апр в 9:41

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

15 апр в 14:17

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

18 апр в 8:50

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

18 апр в 17:16

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

24 апр в 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 - должно работать.

Программная работа с таблицами Excel с помощью библиотеки Microsoft.Office.Interop.Excel

Windows Presentation Foundation. Аналог WinForms, система для построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем, графическая (презентационная) подсистема в составе .NET Framework (начиная с версии 3.0), использующая язык XAML

Видеолекция
Демонстрация работы с таблицами Excel в WPF

На данном занятии будет реализована возможность экспорта данных из приложения для визуализации расходов пользователей в таблицу Excel. Расходы каждого пользователя будут экспортироваться в отдельный лист, названием которого будет ФИО пользователя. Расходы будут распределены по категориям, причем по каждой категории будут указываться общие затраты. Основные шаги построения приложения:

  1. Предварительные шаги
  2. Реализация экспорта
  3. Проверка корректной работы приложения

Предварительные шаги
1. Подключаем библиотеку для работы с Excel

Для экспорта данных в Excel используется библиотека Interop. Excel (Object library), расположенная во вкладке COM

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

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