Как подключить 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.

Далее создаем псевдоним для работы с 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 и смотрим код, который туда записался:

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. Подключаем библиотеку для работы с Excel

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