Microsoft office interop
.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);
Для того, чтобы эту проблему решить необходимо добавить две новые переменные и немного изменить код инициализации:
Работа с 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 столбца, и т.п. Пример:
Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.
Microsoft Office Interop (Excel Automation) in C# and VB.NET
Microsoft Office Interop (Excel Automation) is an option when creating/reading Excel files (XLS, XLSX, CSV) from C# or VB.NET application, but it has many drawbacks.
Issues, when using Microsoft Office Interop (Excel Automation) from C# or VB.NET, are that:
- It requires a license for Microsoft Office on every client machine.
- It requires that all client machines have the same version of Microsoft Excel installed.
- It works only on Windows operating systems.
- When using Automation, Microsoft Excel is loaded in the background, taking a few MB and loading a large number of files and DLLs.
- Microsoft Office applications (including Excel) were designed as UI applications and, because of that, API is very slow. Generating a single worksheet with 200 rows and 100 columns takes 239.4 seconds on our test machine.
- Microsoft doesn’t recommend using Excel Automation (or any Office Interop) on the server, see Considerations for server-side Automation of Office.
We are proud that our Excel .NET library is one of the best alternatives for Microsoft Office Interop (Excel Automation).
GemBox.Spreadsheet Free comes free of charge, while GemBox.Spreadsheet Professional is a commercial version that is licensed per developer. Find more information about supported features.
Better than Excel Automation
With Microsoft Office installed on most business desktops, it is tempting to use Microsoft Excel Interop. Look at the following table for good reasons not to do so:
Outperforming competition
When comparing and evaluating different XLSX, XLS, ODS, CSV reading and HTML, PDF and XPS reporting products, don’t forget the following considerations:
Plain and fair licensing
We don’t charge you additional server licenses. You can use our component for an unlimited number of projects (you don’t need to purchase additional «OEM licenses») and we don’t force you to purchase subscription packages.
Our licensing is very simple: every developer working with our component needs to be covered by developer license. We don’t care if it is a Windows or web application, how many servers you use, or if you have just one customer or millions of customers.
Performance
In the case of desktop application, you don’t want your user to wait 20 seconds for every single report. In the case of web application, you want your server to simultaneously support as many users as possible. Our test programs generate single XLS file with 200 rows and 200 columns of tabular data. Half of the values are strings and half are numbers, with 50% of cells having some cell style applied (font size and border). On our test machine the results are following:
- GemBox.Spreadsheet takes 0.9 seconds.
- Microsoft Excel automation takes 240 seconds (266 times slower).
Performance example is included in the GemBox.Spreadsheet Examples, so you are free to do the test yourself and see how our component performs with the tabular data that you require.
Clean and easy to use API
GemBox.Spreadsheet is a designed and developed to conform to Microsoft standards for .NET libraries. Caching also enables you to access the worksheet in a more natural way. For example, the same task of changing cell text orientation would be one line in GemBox.Spreadsheet:
and three lines in one of the competing products:
The latter is a hassle and forces you to think about Excel’s unique cell style limit. In other words, you will have to pay attention to not creating the same cell style again in a more complex worksheet.
Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll Устранение неполадок и загрузка
Иногда система Windows отображает сообщения об ошибках поврежденных или отсутствующих файлов Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll. Подобные ситуации могут возникнуть, например, во время процесса установки программного обеспечения. Каждая программа требует определенных ресурсов, библиотек и исходных данных для правильной работы. Поэтому поврежденный или несуществующий файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll может повлиять на неудачное выполнение запущенного процесса.
Файл был разработан для использования с программным обеспечением . Здесь вы найдете подробную информацию о файле и инструкции, как действовать в случае ошибок, связанных с Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll на вашем устройстве. Вы также можете скачать файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll, совместимый с устройствами Windows 10, Windows 7, которые (скорее всего) позволят решить проблему.
Совместим с: Windows 10, Windows 7
Исправьте ошибки Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll
Информация о файле
Наиболее распространенные проблемы с файлом Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll
Существует несколько типов ошибок, связанных с файлом Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll. Файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll может находиться в неправильном каталоге файлов на вашем устройстве, может отсутствовать в системе или может быть заражен вредоносным программным обеспечением и, следовательно, работать неправильно. Ниже приведен список наиболее распространенных сообщений об ошибках, связанных с файлом Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll. Если вы найдете один из перечисленных ниже (или похожих), рассмотрите следующие предложения.
- Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll поврежден
- Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll не может быть расположен
- Ошибка выполнения — Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll
- Ошибка файла Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll
- Файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll не может быть загружен. Модуль не найден
- невозможно зарегистрировать файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll
- Файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll не может быть загружен
- Файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll не существует
Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll
Не удалось запустить приложение, так как отсутствует файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll. Переустановите приложение, чтобы решить проблему.
Проблемы, связанные с Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll, могут решаться различными способами. Некоторые методы предназначены только для опытных пользователей. Если вы не уверены в своих силах, мы советуем обратиться к специалисту. К исправлению ошибок в файле Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll следует подходить с особой осторожностью, поскольку любые ошибки могут привести к нестабильной или некорректно работающей системе. Если у вас есть необходимые навыки, пожалуйста, продолжайте.
Как исправить ошибки Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll всего за несколько шагов?
Ошибки файла Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll могут быть вызваны различными причинами, поэтому полезно попытаться исправить их различными способами.
Шаг 1.. Сканирование компьютера на наличие вредоносных программ.
Файлы Windows обычно подвергаются атаке со стороны вредоносного программного обеспечения, которое не позволяет им работать должным образом. Первым шагом в решении проблем с файлом Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll или любыми другими системными файлами Windows должно быть сканирование системы на наличие вредоносных программ с использованием антивирусного инструмента.
Если по какой-либо причине в вашей системе еще не установлено антивирусное программное обеспечение, вы должны сделать это немедленно. Незащищенная система не только является источником ошибок в файлах, но, что более важно, делает вашу систему уязвимой для многих опасностей. Если вы не знаете, какой антивирусный инструмент выбрать, обратитесь к этой статье Википедии — сравнение антивирусного программного обеспечения.
Шаг 2.. Обновите систему и драйверы.
Установка соответствующих исправлений и обновлений Microsoft Windows может решить ваши проблемы, связанные с файлом Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll. Используйте специальный инструмент Windows для выполнения обновления.
- Откройте меню «Пуск» в Windows.
- Введите «Центр обновления Windows» в поле поиска.
- Выберите подходящую программу (название может отличаться в зависимости от версии вашей системы)
- Проверьте, обновлена ли ваша система. Если в списке есть непримененные обновления, немедленно установите их.
- После завершения обновления перезагрузите компьютер, чтобы завершить процесс.
Помимо обновления системы рекомендуется установить последние версии драйверов устройств, так как драйверы могут влиять на правильную работу Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll или других системных файлов. Для этого перейдите на веб-сайт производителя вашего компьютера или устройства, где вы найдете информацию о последних обновлениях драйверов.
Шаг 3.. Используйте средство проверки системных файлов (SFC).
Проверка системных файлов — это инструмент Microsoft Windows. Как следует из названия, инструмент используется для идентификации и адресации ошибок, связанных с системным файлом, в том числе связанных с файлом Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll. После обнаружения ошибки, связанной с файлом %fileextension%, программа пытается автоматически заменить файл Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll на исправно работающую версию. Чтобы использовать инструмент:
- Откройте меню «Пуск» в Windows.
- Введите «cmd» в поле поиска
- Найдите результат «Командная строка» — пока не запускайте его:
- Нажмите правую кнопку мыши и выберите «Запуск от имени администратора»
- Введите «sfc / scannow» в командной строке, чтобы запустить программу, и следуйте инструкциям.
Шаг 4. Восстановление системы Windows.
Другой подход заключается в восстановлении системы до предыдущего состояния до того, как произошла ошибка файла Policy.12.0.Microsoft.Office.Interop.Access.Dao.dll. Чтобы восстановить вашу систему, следуйте инструкциям ниже
- Откройте меню «Пуск» в Windows.
- Введите «Восстановление системы» в поле поиска.
- Запустите средство восстановления системы — его имя может отличаться в зависимости от версии системы.
- Приложение проведет вас через весь процесс — внимательно прочитайте сообщения
- После завершения процесса перезагрузите компьютер.
Работа с документами 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 с заполненным верхним и нижним колонтитулом, обычным и с применением стиля текстом, а так же заполненной таблицей.