Как подключить microsoft office interop
Работа с Excel с помощью C# (Microsoft.Office.Interop.Excel)
Оставляю заметку по работе с Excel с помощью C#.
Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.
Наработки очень пригодились в работе для формирования отчетности.
Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.
Visual Studio здесь довольно старой версии. Если у вас версия новая, отличаться будет только вид окна.
Далее создаем псевдоним для работы с Excel:
using Excel = Microsoft.Office.Interop.Excel;
Расстановка рамок.
Расставляем рамки со всех сторон:
Цвет рамки можно установить так:
Выравнивания в диапазоне задаются так:
Формулы
Определим задачу: получить сумму диапазона ячеек 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
Комментарии
При работе с Excel с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.
Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.
Далее заходим в редактор Visual Basic и смотрим код, который туда записался:
В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.
Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:
Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.
.NetBlog — блог о программировании на C# .Net, и других, не мене интересных вещах.
Заметки о разработке ПО, советы по .net, SharePoint, SQL, архитектура приложений, литература по программированию. А также просто просто мысли о жизни и рассказы о том, что интересно автору, например путешествиях и вкусной еде 😉
суббота, 11 октября 2014 г.
COM Interop на примере работы с Excel
В предыдущем посте я писал о создании csv-файла и экспорта в него данных из ASP.NET и при этом, перечисляя разные варианты, не упомянул один совсем уже бредовый для web-приложения, но частенько очень подходящий для приложений десктопных. Это работа с установленным в системе COM-объектом c помощью технологии под названием COM Interop.
COM Interop используется в .Net для предоставления возможности взаимодействия управляемого .Net кода с COM-объектами. Тля того чтобы использовать какой-либо COM-объект из управляемого кода, необходимо создать сборку, содержащую информацию о типах содержащихся в COM-библиотеке, в совместимом с CRL формате.
В процессе работы приложения CLR создает для каждого COM-объекта внутренний объект, называемый Runtime Callable Wrapper (Вызываемая оболочка времени выполнения) или RCW, которая используется для создания COM-объекта и маршалинга данных между управляемой и неуправляемой средой. Также, RCW используется для мониторинга количества активных ссылок на COM-объект и его уничтожение, когда количество активных ссылок станет равным нулю. Выглядит это примерно так:
Обычно, если вы ходите создать CLR библиотеку для какого-либо компонента самостоятельно, то вам нужно использовать утилиту Tlbimp.exe, но для использования компонентов Office этого делать не нужно. Все необходимые библиотеки уже устанавливаются вместе с продуктом. Нам достаточно только добавить нужную сборку в проект.
И добавить соответствующую строку using в ваш код
using Excel = Microsoft.Office.Interop.Excel;
В качестве источника данных для примера будем использовать список массивов строк ( List ). В коде я написал комментарии, которые, думаю, будут вполне понятно объяснять что происходит.
Ну и пара нюансов с которыми вы можете столкнуться. В случае, если в COM-компоненте происходит исключение, которое вы не обработаете, то, как и положено, весть домен приложения будет аварийно закрыт. Вместе с RCW. В результате чего, COM-объект так и останется висеть в памяти. То есть, вполне реально получить вот такую картинку:
И нюанс второй. Код сверху не совсем правильный. Дело в том, что работая с COM Interop нужно быть предельно внимательным и осторожным, потому, что случайно можно создать COM-объект, совершенно об этом не подозревая. В данном случае, создается даже не один «случайный» объект, а несколько.
Во-первых, в строке xlsWB = App.Workbooks.Add(missingValue); создается объект App.Workbooks, который не присваевается переменной и, соответственно, не освобожается дл тех пор, пока не выгрузится домен приложения.
Во-вторых, такая же проблема в строке в строке: xlsSheet = (Excel.Worksheet)xlsWB.Worksheets.get_Item(1);
Для того, чтобы эту проблему решить необходимо добавить две новые переменные и немного изменить код инициализации:
Как ссылаться на Microsoft.Office.Interop.Excel dll?
Я разработал систему, которая работает с excel листами в 2006 году, используя MS VS 2005. Теперь я не могу использовать ту же ссылку С MS VS 2012.
6 Ответов
Используйте NuGet (VS 2013+):
Самый простой способ в любой последней версии Visual Studio-это просто использовать диспетчер пакетов NuGet. (Даже VS2013, с расширением NuGet Package Manager for Visual Studio 2013 .)
Щелкните правой кнопкой мыши на «References» и выберите «Manage NuGet Packages. «, а затем просто найдите Excel.
VS 2012:
Более старые версии VS не имели доступа к NuGet.
- Щелкните правой кнопкой мыши на «References» и выберите «Add Reference».
- Выберите «Extensions» слева.
- Ищите Microsoft.Office.Interop.Excel .
(Обратите внимание, что вы можете просто ввести «excel» в поле поиска в правом верхнем углу.)
VS 2008 / 2010:
- Щелкните правой кнопкой мыши на «References» и выберите «Add Reference».
- Выберите вкладку «.NET».
- Ищите Microsoft.Office.Interop.Excel .
Вы также можете попробовать установить его в Visual Studio с помощью диспетчера пакетов.
Запустите Install-Package Microsoft.Office.Interop.Excel в консоли пакета. Это автоматически добавит его в качестве ссылки на проект.
Использование происходит примерно так:
Если у вас есть VS 2013 Express и вы не можете найти пространство имен Microsoft.Office, попробуйте это (‘Microsoft Excel 12.0 Object Library’, если вы хотите использовать Office 2007)
Основываясь на ответе Mulfix, если у вас есть Visual Studio Community 2015, попробуйте добавить ссылку. -> COM — > Библиотеки Типов — > ‘Microsoft Excel 15.0 Object Library’.
Вместо ранней привязки ссылки есть проект с открытым исходным кодом под названием NetOffice, который абстрагирует это от вашего проекта, делая жизнь намного проще. Таким образом, вам не придется полагаться на то, что у ваших пользователей установлена определенная версия Office.
Вы должны проверить, на какую версию Excel вы ориентируетесь?
Если вы нацелены на Excel 2010 использовать версию 14 (в соответствии с ответом гранта на скриншот), Excel 2007 использовать версию 12 . Вы не можете поддерживать Excel 2003 с помощью vS2012, так как у них не установлен правильный Interop dll.
Похожие вопросы:
Как я могу запретить ссылаться на библиотеку классов dll в других решениях?
Использовать Microsoft.Office.Interop.Excel COM dll в проекте .net, что является лучшим подходом. Добавить в проект ссылку dll из списка библиотек COM? Скопируйте dll в папку bin / Release, а затем.
Я использую ссылку Microsoft.Office.Interop.Excel в приложении-службе windows для создания отчетов excel. Приложение отлично строится на машине DEV, но на машине сборки он не говорит: тип или имя.
Я обновляю пользовательскую службу Windows, которая в настоящее время установлена на сервере Windows 2003. Служба считывает файлы excel, отправленные на адрес email, и записывает их в этот же файл.
Я создаю приложение с WPF и C#, в основном я хочу позволить любому создать dll и поместить его в папку (аналогично плагинам). Приложение будет принимать все библиотеки DLL в папке, загружать их и.
Я пытаюсь решить проблему ссылок на библиотеки DLL в Visual studio 2012. Все библиотеки DLL установили их самостоятельно таким образом, что они ищут версию .net 4.0, в то время как я не могу.
Блог Виктора Деревянко
О жизни, о программировании. Все публикуемые исходные коды можно взять здесь
среда, 20 мая 2009 г.
Работа с Excel из C#.
Столкнулся с необходимостью поработать с файлами Excel из C#. Задачи простые — считать данные из книги Excel, создать новую книгу Excel, внести в нее данные. Предполагается, что Excel на компьютере имеется, но какой версии, не известно. Файлы по размерам маленькие, скорость работы не критична.
Существует несколько вариантов работы с Excel из C#: автоматизация Excel, подключение через OleDB/ODBC, дополнительные библиотеки (Aspose Excel), работа через XML, через Open XML и т.п.
Наиболее простой вариант — воспользоваться автоматизацией Excel. Да, скорость работы — не блеск. Зато удобно использовать, код пишется быстро, объемы кода не велики. Из .NET автоматизация подключается парой кликов мыши — добавил в References сборку Microsoft.Office.Interop.Excel — и работай с привычными com-объектами Application,Workbook, Worksheet и т.п.
Проблема одна — сборки «Microsoft.Office.Interop.Excel» для каждой версии Excel разные. У меня установлен office 2003 и, соответственно, interop-сборка версии 11. А что делать, если мне нужно разработать приложение, которое может работать с Excel 97? Или с любыми версиями Excel? Для того, чтобы считать или записать пару значений в ячейки листа Excel сложного api не требуется — любой Excel сгодится. А мне приходится привязываться к конкретной версии.
Можно воспользоваться поздним связыванием. Но если его использовать «в лоб», то ни о никаком удобстве работы речи уже не идет — код станет сложным, а вызовы методов — косвенными, нетипизированными. Ошибок будет — вагон.
Выход нашелся. На СodeProject обнаружил замечательную статью «SafeCOMWrapper — Managed Disposable Strongly Typed safe wrapper to late bound COM». В ней изложена элегантная методика использования позднего связывания, устраняющая все проблемы: связывание становится поздним (привязки к конкретной версии Excel нет), для объектов автоматизации автоматически реализуется шаблон IDisposable (отработанные объекты уничтожаются автоматически), все вызовы методов явные.
Идея реализации, вкратце, следующая. Для каждого COM-объекта автоматизации вы прописываете отдельный интерфейс. В интерфейс включаете все методы и свойства, которые вам необходимо использовать у этого COM-объекта. Обратите внимание — только те, которые необходимо использовать, а вовсе не все, реализуемые COM-объектом.
Каждый COM-объект автоматизации «заворачивается» в класс COMWrapper, унаследованный от RealProxy. RealProxy — это стандартный класс, позволяющий организовать перехват вызовов методов. При создании COM-объекта вы создаете экземпляр COMWrapper и указываете требуемый вам интерфейс. Среда динамически генерирует прокси-объект, реализующий этот интерфейс. С этим прокси-объектом вы в дальнейшем и работаете как с объектом автоматизации. Вызов любого метода прокси-объетка перехватывается и транслируется в вызов метода Invoke класса RealProxy, перекрытый в классе COMWrapper. Здесь его можно обработать как душе угодно. В реализации по умолчанию, вызовы свойств транслируются в вызовы соответствующих методов get_ и set_, создаваемых .NET, возвращаемые объекты автоматизации автоматически заворачиваются в COMWrapper и т.п.
В оригинально статье приведен пример использования данной методики для Microsoft.Outlook. Я, на базе приведенных исходных кодов, адаптировал методику для работы с Microsoft.Excel. Естественно, реализовав интерфейсы только для тех объектов автоматизации, которые потребовались мне для работы. Дополнить интерфейсы недостающими методами или добавить интерфейсы для других объектов автоматизации не составляет труда. Достаточно посмотреть через Object Browser метаданные сборки «Microsoft.Office.Interop.Excel» и скопировать оттуда необходимые объявления методов и интерфейсов (с минимальной адаптацией).
Пример кода для работы с Excel: Оригинальные исходные коды лежат на codeproject вместе со статьей. Исходные коды, адаптированные для Microsoft Excel, можно взять здесь.
- Download source codes of Managed Excel project
- View source codes of Managed Excel project
- Short description in English
Update. Практика использования выявила небольшую проблему — забыть вызвать Dispose у оберток объектов Excel очень легко. После чего Excel висит в памяти до тех пор, пока не закроешь приложение (или до следующей сборки мусора). Пример: вместо
Просто надо быть внимательнее.
Работа с документами Microsoft Word, Часть 1. Программное создание документа: Справочник по C#
Большинству операций, выполняемых программным способом, есть эквиваленты в пользовательском интерфейсе (UI), доступные как команды в меню и на панелях инструментов. Также существует нижележащая архитектура, обеспечивающая поддержку команд, выбираемых из UI. Всякий раз, когда вы создаете новый документ Word, он базируется на каком-либо шаблоне; расширение файлов шаблонов «.dot», а файлы документов – «.doc». Шаблон Word может содержать текст, код, стили, панели инструментов, элементы автотекста, комбинации клавиш для быстрого доступа к командам. Новый документ связывается с шаблоном и получает полный доступ к его элементам. Если вы не указываете конкретный шаблон, новый документ создается на основе стандартного шаблона «Normal.dot», который устанавливается при установке Word).
Для работы с приложением Microsoft Word в .NET, используется объект Application, который является предком всех остальных объектов. Получив на него ссылку, вы можете работать с его методами и свойствами. Этот объект предоставляет большой набор методов и свойств, позволяющих программным путем управлять Microsoft Word. Код инициализации нового объекта Application, представлен ниже.
Чтобы открыть существующий документ или создать новый, необходимо создать новый объект Document.
Выполняя какую-либо операцию в пользовательском интерфейсе Word (например, добавляя верхний колонтитул), вы выделяете соответствующую секцию, используя объект «Selection», определяющий текущую позицию «невидимого» курсора и применяете к ней новый параметр форматирования с использованием объекта «Range». Данный объект представляет область в документе и может включать в себя все что угодно – от пары символов, до таблиц, закладок и много другого. Вы не ограничены одним объектом «Range» – в одном документе можно определить сразу несколько таких объектов.
Чтобы добавить текст в документ, необходимо указать позицию для вставки и сам текст.
Так же вы можете применить к тексту определенный стиль.
В классе Microsoft.Office.Interop.Word.Document, присутствует коллекция «Tables», которая позволяет добавить таблицу в документ с использованием метода Add.
Для функционирования описанного выше кода, необходимо добавить к текущему проекту объектную библиотеку MS Word. Перейдите в меню «Проект» и выберете команду «Добавить ссылку» или в обозревателе решений, найдите пункт «Ссылки» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете соответствующий пункт.
В открывшемся окне «Добавить ссылку», перейдите на вкладку «COM» и выберете «Microsoft Word 14.0 Object Library» из предложенного списка библиотек.
В обозревателе решений у вас появится ссылка на данную библиотеку.
Перейдите в конструктор главной формы и добавьте из панели элементов, командную кнопку «Button». Данный элемент необходим для запуска процесса создания документа и вызов MS Word для отображения.
Сделайте двойной клик левой клавишей мыши по элементу «Button» и вы перейдете в автоматически созданный метод события «button1_Click». Добавьте в него приведенный ниже код.
Запустите ваш проект, нажав на клавиатуре, клавишу «F5». Нажмите на единственную кнопку, расположенную на главной форме вашего проекта. У вас автоматически откроется документ Microsoft Word с заполненным верхним и нижним колонтитулом, обычным и с применением стиля текстом, а так же заполненной таблицей.