Серверы автоматизации excel что это
В данной статье приведены ответы на часто задаваемые вопросы, относящиеся к Microsoft Office автоматизации с Visual C++.
Дополнительная информация
Содержание
Что такое автоматизация?
Я новый автоматизации, где найти хорошие ресурсы для получения дополнительных сведений?
Существуют различные способы автоматизации можно использовать?
Как присоединить запущенного экземпляра приложения Office?
Как передавать необязательные параметры?
Как перехватывать события, предоставляемые приложениями Office?
Мой код автоматизации выполняется слишком медленно. Как ускорить выполнение задач?
Что означают эти значения огромные ошибки, например -2147352573 или 0x80030002,
Что такое библиотеки типов?
Мой код автоматизации в сотрудничестве с Microsoft Excel 95, но дает сбой в Microsoft Excel 97. Почему?
Почему приложение, которое я автоматизация остаются в памяти после завершения программы?
Я знаю, что я хочу сделать как пользователь приложения Microsoft Office, но как сделать это программным путем с помощью автоматизации?
Можно автоматизировать встроенные приложения Microsoft Office?
Как получить доступ к моей свойства документа в документ Microsoft Office?
Вопросы и ответы
Что такое автоматизация? Автоматизация (ранее OLE-автоматизация) — это технология, которая позволяет вам получить преимущество существующей программной функциональности, и включит это в ваши приложения. Например можно использовать Microsoft Word проверка орфографии и грамматики возможности в приложение, не видимы для пользователей Microsoft Word. Можно даже использовать все средства Microsoft Excel диаграммы, печати и данные анализа. Эта технология может значительно упростить и ускорить ваш процесс разработки.
Я новый автоматизации, где найти хорошие ресурсы для получения дополнительных сведений? Глава 24 Дэвид Kruglinski «внутри Visual c++» (ISBN:1-57231-565 - 2) предоставляет общие сведения, а также несколько отличных примеров. Кроме того база знаний корпорации Майкрософт является хорошим источником данных. Эта статья сама является хорошим началом и дополнительные ссылки можно найти в следующей статье базы знаний Майкрософт:
поиска ресурсов для изучения OLE-автоматизацииПри желании обучения на примере обратитесь в следующей статье базы знаний Майкрософт:
Методические УКАЗАНИЯ использование MFC для автоматизации Excel и создания и форматирования новой книги
С MFC используйте Visual C++ классов для создания «классы-оболочки» из библиотеки типов Microsoft Office. Эти классы, а также других классов MFC, например, COleVariant, COleSafeArray, COleException, упрощают выполнение задач автоматизации. Этот метод обычно предпочтительнее других, и большинство из этих примеров базы знаний Майкрософт использовать MFC.
Важно отметить, что существуют некоторые различия между автоматизации из C++ по сравнению с простой C, так как COM была разработана на основе классов C++. Для получения дополнительных сведений обратитесь к следующей статье базы знаний Майкрософт, например C:
методические УКАЗАНИЯ: использование OLE-автоматизации из приложения C
Что такое COM? Автоматизации основан на модели компонентных объектов (COM). COM является стандартной программной архитектуры на основе интерфейсов и предназначены для кода разделены автономными объектами. Его можно Рассматривайте как расширение парадигма программирования ориентированная объекта (ООП), но применимо к отдельным приложениям. Каждый объект предоставляет набор интерфейсов, а все соединения для объекта, например инициализацию, уведомления и передача данных происходит через следующие интерфейсы. COM также является набор служб, предоставляемых библиотеки динамической компоновки (DLL), установленных в операционной системе. Автоматизации использует многие из этих служб. Одним из примеров является службы «Marshalling», которое упаковывает вызовы функции-члены интерфейсов приложений сервера клиентского приложения и передает их с их аргументов к серверному приложению. Он означает, что интерфейсы сервера, представлены в памяти клиента, который не происходит, когда клиент входит в .exe выполняется внутри собственного пространства процесса. Упаковка также получает возвращаемые значения из методов сервера обратно через границы процесса и безопасно в руки вызова клиента. Многие службы необходимы для автоматизации, предоставляемых различные библиотеки COM. Источники информации о тех включают «Внутри Ole – второе издание», Kraig Brockschmidt, ISBN 1-55615-843-2, «Внутри COM», Dale Rogerson - ISBN 1-57231-349-8 и «Справочник программиста автоматизации», ISBN 1-57231-584-9.
Как присоединить запущенного экземпляра приложения Office? Используйте API-Интерфейс GetActiveObject(). Серверы автоматизации регистрируются в таблице ROT (запущенных объектов ROT), через RegisterActiveObject() API. Например, клиенты автоматизации можно получить в запущенный экземпляр с кодом:
Примечание: Если существует несколько экземпляров запуска приложения Office, которую необходимо присоединить только можно присоединить к первому экземпляру, запущенное с помощью интерфейса API GetActiveObject(). Теоретически можно выполнить итерацию ROT для каждого отдельного экземпляра, но приложения Office не регистрируют себя Если другой экземпляр уже находится в таблице ROT так как моникер для себя всегда остается одинаковым (он не может отличить в любом случае). Это означает, что нельзя присоединить к любому экземпляру, кроме первой. Тем не менее поскольку Office apps также зарегистрировать свои документы в таблице ROT, можно успешно присоединить с другими экземплярами с помощью итерации ROT, поиск конкретного документа, присоединения к нему, затем получение объекта приложения из него. В следующей статье базы знаний Майкрософт для итерации в таблице ROT и при поиске имени документа есть некоторый код:
Методические УКАЗАНИЯ : получить IDispatch Excel или документа Word из OCXНе нужно будет сделать это для PowerPoint, так как это приложение одного экземпляра; может существовать только один экземпляр запущен.
Как передавать необязательные параметры? Некоторые методы имеют «необязательные» параметры. В Visual Basic можно случайного исключить их при вызове метода. Тем не менее при вызове с помощью Visual C++ необходимо передать специальный ВАРИАНТ, в поле .vt является VT_ERROR и .scode является DISP_E_PARAMNOTFOUND. То есть:
Это действительно каким образом Visual Basic фоновый.
Как перехватывать события, предоставляемые приложениями Office? По сути реализует интерфейс события, необходимо отслеживать («приемник») и установить вспомогательное соединение с приложением («источник»). В следующей статье дается пошаговое описание примеров для Microsoft Word:
Методические УКАЗАНИЯ : перехвата событий приложения Microsoft Word97 с помощью VC ++В общем случае для установки вспомогательное соединение, можно получить IConnectionPointContainer сервера и вызвать метод FindConnectionPoint() с IID интерфейса события. Это обеспечивает интерфейс IConnectionPoint и осталось является вызов выполнить Advise() для с экземпляром события интерфейса. Сервер будет затем Перезвонить через этот интерфейс при возникновении этих событий.
Мой код автоматизации выполняется слишком медленно. Как ускорить выполнение задач? Наиболее распространенной причиной проблемы скорости с помощью автоматизации является повторяющееся чтение и запись данных. Это характерно для клиентов автоматизации Excel. Тем не менее большинство людей не знают о том, что эти данные обычно можно записать или за один раз с помощью SAFEARRAY. Обратитесь к следующим статьям Microsoft Knowledge Base Дополнительные сведения и примеры информативные:
методические УКАЗАНИЯ: Использование MFC для автоматизации Excel и заполнения диапазона с помощью массива
методические УКАЗАНИЯ: Использование MFC для автоматизации Excel и получения массива из диапазона
методические УКАЗАНИЯ: Использование MFC для автоматизации Excel и создания и форматирования новой книгиКроме того важно отметить, что использование буфера обмена может иногда повысить производительность. Например можно скопировать данные в буфер обмена, а затем сообщить серверу для вставки с помощью автоматизации. Или наоборот; сообщить серверу, чтобы скопировать в буфер обмена и вставить в приложение.
Что сделать эти значения огромные ошибки, например -2147352573 или 0x80030002 среднее? Эти значения называются значения HRESULT и определенные в файле winerror.h. Номера настолько велики, поскольку первый бит представляет ли это результат ошибки. Можно использовать служебную программу ErrLook.Exe, поставляемых вместе с Visual C++ для преобразования числа в осмысленные описания. Если необходимо программно получить описание ошибки, можно использовать API-Интерфейс FormatMessage(). Обратитесь к следующим статьям Microsoft Knowledge Base Дополнительные сведения и примеры по использованию FormatMessage():
информация: перевод ошибок автоматизации для VB/VBA
Образец : Decode32 и Decode16 Ошибка OLE средства декодер кодаПримечание: Если вы используете Visual C++ 6.0 и иметь переменную, содержащую это значение в окне отладки, добавить «, hr» (без кавычек) к нему для Visual C++ перевода для вас!
Что такое библиотеки типов? Библиотеки типов похож на файл заголовка C/C++. Он содержит интерфейсы, методы и свойства, которые публикации сервера. Можно просмотреть библиотеку типов с средство просмотра объектов OLE/COM (Oleview.exe), который поставляется с Visual C++. Ниже приведен список файлов библиотеки типов для Microsoft Office 2000, 95 и 97: Office Application | Type library ------------------------+---------------- Word 95 and prior | wb70en32.tlb Excel 95 and prior | xl5en32.olb Powerpoint 95 and prior | Powerpoint.tlb Access 95 and prior | msaccess.tlb Binder 95 | binder.tlb Schedule+ | sp7en32.olb Project | pj4en32.olb Team Manager | mstmgr1.olb Word 97 | msword8.olb Excel 97 | excel8.olb Powerpoint 97 | msppt8.olb Access 97 | msacc8.olb Binder 97 | msbdr8.olb Graph 97 | graph8.olb Outlook 97 | msoutl8.olb Outlook 98 | msoutl85.olb Word 2000 | msword9.olb Excel 2000 | excel9.olb Powerpoint 2000 | msppt9.olb Access 2000 | msacc9.olb Outlook 2000 | msoutl9.olb Word 2002 | msword.olb Excel 2002 | excel.exe Powerpoint 2002 | msppt.olb Access 2002 | msacc.olb Outlook 2002 | msoutl.olb
Мой код автоматизации в сотрудничестве с Microsoft Excel 95, но дает сбой в Excel 97. Что происходит? Объектная модель Excel сделаны существенное изменение версии 95 на 97. Microsoft Excel 95 реализованы все методы и свойства в одной реализации интерфейса IDispatch. Это означало, что часто можно вызвать методы, предназначенные для объекта X из Y объекта. Не было хорошей архитектуры, поэтому в Office 97, каждый объект имеет свою собственную разделения реализацию Idispatch. Это означает, что если вы попросите для метода или свойства из объекта X из Y отдельный объект, возникает ошибка 0x80020003, -2147352573, «Член не найден.» Чтобы избежать этой ошибки, необходимо, чтобы убедиться в том, что базовый интерфейс IDispatch, имеются вызовы из является одним из семантически правильных. Обратитесь к следующим статьям Microsoft Knowledge Base Дополнительные сведения:
Методические УКАЗАНИЯ : Устранение неполадок «Участник не найден», 0x80020003 ошибка
Приложение, которое я автоматизирую, остается в памяти после завершения работы программы. Что происходит? Скорее всего, это потому, что вы забыли освободить полученный интерфейс и вам необходимо отслеживать это. Ниже приведены некоторые общие советы и ищет действия:
Проверьте, если вы вызываете методы, такие как Open или создать, возвращающие IDispatch * (LPDISPATCH), независимо от возвращаемого значения. Если, вы оставления этот возвращенный интерфейс и потребуется изменить код таким образом, чтобы освободить его, когда больше нет необходимости.
Постепенно закомментировать части кода пока проблема исчезает, а затем добавить его обратно внимательно отслеживать которой начинается неполадка.
Обратите внимание, что некоторые приложения будет оставаться операционной системой пользователя «коснулось» приложения. В этом случае при автоматизации затем приложения, вероятно, останется после запуска. Приложения Office имеют свойство «UserControl» на объект приложения, вы может считывать и записывать изменить это поведение.
Кроме того некоторые приложения решили остаться, если произошло достаточно пользовательского интерфейса «действие». Если планируется на выход из приложения, затем вызовите его метод Quit() объекта приложения. Word завершит работу, независимо от его счетчик ссылок при вызове Quit. Это ожидаемое поведение COM не является. Excel, будет правильно просто скрыть сам Однако остаются под управлением до снятия всех ожидающих интерфейсов. В общем случае следует освободить все невыполненные ссылки и вызывать Quit() только если планируется завершить работу приложения.
Я знаю, что я хочу сделать как пользователь приложения Microsoft Office, но как сделать это программным способом посредством автоматизации? Что вы заинтересованы в-это объекты, методы и свойства, необходимые для использования. Чтобы научиться перемещаться объектной модели Word, Excel и Powerpoint, основываясь на то, что нужно для этого имени пользователя, рекомендуется использовать средство записи макросов. Просто выберите Macro\ «Начать запись» в меню "Сервис", выполнить задачу вы заинтересованы в, а затем выберите Macro\ «Остановить запись». После завершения записи, выберите Macro\Macros в меню Сервис, выберите записанный макрос, а затем нажмите кнопку Изменить. Это нужно для созданного кода VBA, будут выполнены задачи, записанные. Имейте в виду записанного макроса будет лучше всего кода в большинстве случаев, но он его не очень хорошо краткий пример.
Можно автоматизировать встроенных приложений Office Абсолютно. Прием является получение указатель IDispatch: предоставляется в Visual C++ Технические примечания 39 (TN039). Обратитесь к следующей статье Microsoft Knowledge Base, пример с пошаговыми инструкциями:
Методические УКАЗАНИЯ : внедрение и автоматизировать лист Microsoft Excel с MFC
Как получить доступ к моей свойства документа в документ Office? Свойства документа доступны через автоматизацию или напрямую с помощью IPropertyStorage. Следующие статьи базы знаний Майкрософт демонстрации каждого метода:
методические УКАЗАНИЯ: использование автоматизации для извлечения встроенных свойств документа
Методические УКАЗАНИЯ : чтение свойств составного документа непосредственно с VC ++
Office Products Access 2010 Excel 2010 Microsoft Outlook 2010 PowerPoint 2010 Microsoft Word 2010 Project Professional 2010 Project Standard 2010 Visio Standard 2010 Visio Professional 2010 Microsoft OneNote 2010 InfoPath 2010 Access 2013 Excel 2013 InfoPath 2013 Outlook 2013 PowerPoint 2013 Visio Professional 2013 Visio Standard 2013 Word 2013 Access 2016 Excel 2016 Outlook 2016 PowerPoint 2016 Visio Professional 2016 Visio Standard 2016 Word 2016 Office 365 Еще. Меньше
Аннотация
В данной статье рассматриваются те сложности, с которыми могут столкнуться разработчики. Также в ней предложены альтернативы автоматизации, которые могут повысить производительность. Но разработчикам следует иметь в виду, что рекомендации в данной статье предоставлены исключительно в информационных целях. Корпорация Майкрософт не советует производить и не поддерживает серверной автоматизации Office.
Примечание. В данном контексте системный драйвер Microsoft Office 2007 и ядро СУБД Access 2010 рассматриваются в качестве компонентов Microsoft Office. В этом контексте термин «серверный» относится также к программному коду, который запускается на рабочих станциях под управлением Windows, если его запуск осуществляется с другой рабочей станции Windows (по отношению к станции, на которой работает вошедший в систему пользователь). Например, программы, запущенные планировщиком с помощью учетной записи SYSTEM, выполняются в той же среде, что и «серверный» программный код ASP или DCOM. Следовательно, могут возникнуть многие из рассмотренных в статье проблем. Ссылки на источники дополнительных сведений о рабочих станциях Windows и COM содержатся в разделах «Дополнительные сведения» и «Ссылки» этой статьи.
Дополнительная информация
Все современные версии Microsoft Office были созданы, проверены и настроены для применения на рабочих станциях конечными пользователями. Их использование предполагает наличие интерактивного рабочего места и профиля пользователя. Кроме того, эти продукты не обеспечивают уровень безопасности и возможности повторного входа, удовлетворяющие требованиям серверных компонентов, которые запускаются автоматически.
Если вы создаете решение, которое работает при участии сервера, для автоматизации сначала стоит попытаться использовать специально разработанные для этого компоненты. Или попытаться найти альтернативы, которые позволяют исполнять хотя бы часть кода на стороне клиента. Если вы используете приложение Office в серверном решении, для него будет отсутствовать ряд важных возможностей, необходимых для корректной работы. Кроме того, таким образом вы поставите под угрозу стабильность всего решения в целом.
Проблемы при использовании серверной автоматизации Office
Разработчикам серверных решений для приложений Office необходимо знать о пяти крупных областях, в которых поведение Office отличается от ожидаемого в силу используемой среды. Для успешной работы программ эти отклонения должны быть обязательно учтены, а их влияние минимизировано. Внимательно изучите эти вопросы при создании приложения. Все эти проблемы невозможно устранить одним решением. В зависимости от задач проекта приоритетность элементов будет изменяться.
Идентификация пользователей. Приложения Office, даже в случае запуска в автоматическом режиме, предполагают наличие определенного пользователя. Так, например, инициализация панелей инструментов, меню, параметров, принтеров и некоторых надстроек выполняется на основе конфигурации запустившего приложение пользователя, которая хранится в соответствующем кусте реестра. Многие службы запускаются из учетных записей которые не содержат пользовательских профилей (например, учетная запись SYSTEM или IWAM_[servername]). Поэтому при запуске Office может возникнуть проблема инициализации. При возникновении данной проблемы Office возвращает ошибку функции CreateObject или CoCreateInstance. Даже после успешного запуска приложения Office при отсутствии пользовательского профиля другие функции могут работать некорректно.
Взаимодействие с рабочим столом. Работа приложений Office предполагает наличие интерактивного рабочего стола. В некоторых условиях для корректной работы определенных функций автоматизации приложение необходимо сделать видимым. Office сконструирован таким образом, что всякий раз при возникновении ошибки или необходимости указания параметра выводится соответствующее модальное диалоговое окно. Модальное диалоговое окно на не интерактивном рабочем столе не может быть отвергнуто , что приводит к остановке (зависанию) потока на неопределенное время. Даже если некоторые методы написания программ позволяют снизить возможность возникновения такой ситуации, полностью исключить ее нельзя. Уже только этот факт делает запуск приложений Office из серверного окружения рискованным и непредсказуемым.
Возможность повторного входа и масштабируемость. Серверные компоненты должны представлять собой многопоточные СОМ-компоненты с хорошо развитыми возможностями повторного входа, минимальным использованием ресурсов и высокой производительностью для нескольких клиентов. Приложения Office во многих отношениях обладают прямо противоположными характеристиками. Их возможности повторного входа не развиты, они представляют собой серверы на базе STA, сконструированные для предоставления разнообразных, но ресурсоемких функциональных возможностей одному клиенту. Приложения обладают ограниченной масштабируемостью с точки зрения серверного решения. Кроме того, приложения имеют разные ограничения на важные элементы, например память. Их невозможно изменить в настройках. Что еще более важно, приложения используют глобальные ресурсы, такие как проецируемые в память файлы, глобальные надстройки или шаблоны и общие сервера автоматизации. Это может накладывать ограничения на число запускаемых одновременно экземпляров, что может привести к условиям гонки, если приложения настроены в среде с несколькими клиентами. Если планируется одновременный запуск нескольких экземпляров приложения Office, для предотвращения зависания программы и повреждения данных необходимо рассмотреть возможность объединения в пул или последовательного удовлетворения запросов на доступ к данному приложению.
Устойчивость и стабильность. Office 2000, Office XP, Office 2003 и Office 2007 для упрощения процесса установки и самовосстановления используют установщик Windows (MSI). Одним из принципов работы установщика MSI является «установка при первом использовании». Он позволяет динамически устанавливать и настраивать функции во время работы системы или, чаще, для конкретного пользователя. В серверном окружении это, с одной стороны, снижает производительность, а с другой — увеличивает вероятность того, что появится диалоговое окно с требованием одобрить установку или вставить необходимый диск. Таким образом, повышая устойчивость пакета Office как продукта для конечного пользователя, функции установщика Windows имеют обратный эффект в серверном окружении. Помимо всего прочего, стабильность Office при запуске с сервера не может быть гарантирована в принципе, потому что пакет не был создан и протестирован для такого рода использования. Использование Office в качестве компонента службы на сетевом сервере может снизить стабильность этой машины и, как следствие, сети в целом.
Безопасность на стороне сервера: Приложения Office не были спроектированы для использования на сервере. Поэтому в ходе разработки приложений Office во внимание не принимались те проблемы безопасности, с которыми сталкиваются распределенные компоненты. Office не осуществляет проверку входящих запросов. Office не обеспечивает защиту от непреднамеренного запуска макроса или другого сервера, который, в свою очередь, может запустить макрос. Не открывайте файлы, загруженные на сервер с анонимного веб-узла! На основании последних выполненных настроек сервер может запустить макрос в контексте администратора или системы (а значит, со всеми полномочиями) и повредить сеть! Кроме того, Office использует многие клиентские компоненты (например, Simple MAPI, WinInet и MSDAIPP), которые для ускорения обработки данных кшируют сведения о прохождении клиентами проверки. Если Office был автоматизирован на сервере, один экземпляр может работать более чем с одним клиентом. Если в ходе сессии были кэшированы данные проверки подлинности, кэшированные данные одного клиента могут быть использованы другим. Следовательно, клиент может получить закрытые для него разрешения доступа, выдавая себя за другого пользователя.
Помимо технических проблем, вам также следует учитывать вопросы лицензирования. Применяемые в данный момент времени условия лицензирования предусматривают использование приложений Office на сервере для обслуживания клиентов только в том случае, если клиенты также обладают лицензированными копиями Office. Применение серверной автоматизации для предоставления нелицензированным рабочим станциям доступа к приложениям Office не предусмотрено лицензионным соглашением (EULA).
Помимо этих проблем, при попытке автоматизации Office на сервере могут возникнуть следующие распространенные ошибки:
Ошибка времени выполнения '429': Компоненту ActiveX не удается создать объект
В этой статье показано, как создавать Excel и управлять им с помощью автоматизации из Visual Basic.
Дополнительные сведения
Существует два способа управления сервером автоматизации: с помощью позднего или раннего связывания. При позднем связывании методы не привязываются до времени выполнения, а сервер Automation объявляется как Object. При раннем связывании приложение знает во время разработки точный тип объекта, с которым он будет взаимодействовать, и может объявить его объекты как определенный тип. В этом примере используется раннее связывание, которое считается более эффективным в большинстве случаев, так как обеспечивает более высокую производительность и лучшую безопасность типов.
Чтобы выполнить раннее связывание с сервером автоматизации, необходимо задать ссылку на библиотеку типов этого сервера. В Visual Basic это делается с помощью диалогового окна "ссылки", обнаруженного в проекте | Меню "ссылки". В этом примере необходимо добавить ссылку на библиотеку типов для Excel, прежде чем можно будет запустить код. Инструкции по добавлению ссылки приведены ниже.
Построение примера автоматизации
Запустите Visual Basic и создайте новый стандартный проект EXE. По умолчанию создается форма Form1.
В менюпроект выберите пункт ссылки. Откроется диалоговое окно " ссылки". Прокрутите список вниз до тех пор, пока не найдете библиотеку объектов Microsoft Excel, а затем выберите элемент, чтобы добавить ссылку на Excel. Если нужная библиотека объектов для вашей версии Excel не отображается в списке, убедитесь, что установлена правильная версия Excel.
Примечания
- При автоматизации Microsoft Office Excel 2007 библиотека типов отображается как Библиотека объектов Microsoft Excel 12,0 в списке ссылок.
- При автоматизации Microsoft Office Excel 2003 библиотека типов отображается как Библиотека объектов Microsoft Excel 11,0 в списке ссылок.
- При автоматизации Microsoft Excel 2002 библиотека типов отображается как Библиотека объектов Microsoft Excel 10,0 в списке ссылок
- При автоматизации Microsoft Excel 2000 Библиотека типов отображается как Библиотека объектов Microsoft Excel 9,0 в списке ссылок .
- При автоматизации Microsoft Excel 97 библиотека типов отображается как Библиотека объектов Microsoft Excel 8,0 в списке ссылок
Настоящая статья посвящена теме, может быть, и не новой, но, как показывают письма читателей, по-прежнему актуальной — автоматизации приложений Microsoft Office. Многие разработчики в процессе работы над своими проектами (неважно, с помощью какого средства разработки — Delphi, C++Builder, Visual Basic…) нередко применяют сервисы, предоставляемые Microsoft Office, например построение сводных таблиц и диаграмм с помощью Microsoft Excel, генерацию и печать документов с помощью Microsoft Word и т.д. Нередко пользователи, привыкшие использовать приложения Microsoft Office в повседневной работе, сами настаивают на применении в приложениях таких сервисов либо просто на сохранении отчетов и других документов в одном из форматов Microsoft Office. Отметим, что потенциальные пожелания подобного рода компанией Microsoft учтены достаточно давно — практически все, что в состоянии сделать пользователь любого приложения Microsoft Office с помощью меню, клавиатуры и инструментальной панели, может быть произведено и автоматически, то есть либо из VBA-программы, либо из приложения, созданного с помощью одного из средств разработки. Иными словами, приложения Microsoft Office являются программируемыми. Программируемость в общем случае означает возможность управления данным приложением с помощью макроязыков либо с помощью других приложений. Все компоненты Microsoft Office поддерживают один и тот же макроязык: Visual Basic for Applications (VBA), позволяющий создавать приложения непосредственно внутри документов Office (это называется «решения на базе Microsoft Office»). Управление же компонентами Office из других приложений осуществляется с помощью автоматизации (Automation, ранее — OLE Automation) — все приложения Microsoft Office являются серверами автоматизации (или COM-серверами). Для создания таких приложений пригодны любые средства разработки, позволяющие создавать контроллеры автоматизации (COM-клиенты). Наиболее часто для этой цели используется Visual Basic, но это могут быть и Delphi, и C++Builder, и Visual C++. Однако прежде чем обсуждать возможности тех или иных средств разработки, следует разобраться, что такое автоматизация.
Коротко об автоматизации
Автоматизация — это одна из возможностей, предоставляемых технологией Microsoft COM (Component Object Model). Не вдаваясь в подробности реализации этой технологии, заметим, что она используется приложениями (называемыми COM-серверами) для предоставления доступа к их объектам, а также к свойствам и методам этих объектов другим приложениям (называемым COM-клиентами), каковыми могут быть и средства разработки. Например, текстовый процессор, будучи COM-сервером, может предоставлять другим приложениям доступ к документу, абзацу, закладке с помощью соответствующих объектов. Для именования (и опознания) COM-серверов обычно используются специальные строковые обозначения — программные идентификаторы (Programmatic Identifier, ProgID). Они нужны для того, чтобы операционная система могла с помощью этих идентификаторов определить, в каком именно каталоге (или на каком компьютере локальной сети, если используется тот или иной способ удаленного доступа к серверу) расположен исполняемый файл сервера автоматизации, и запустить его на выполнение. О том, какие именно программные идентификаторы применяются для того или иного приложения Microsoft Office, будет сказано в разделах, посвященных этим приложениям.
Объекты автоматизации с точки зрения программирования мало чем отличаются от обычных объектов, знакомых нам из теории и практики объектно-ориентированного программирования. Как и обычные объекты, они обладают свойствами и методами. Свойство — это характеристика объекта; например, свойством абзаца (объект Paragraph) может быть его стиль (Style). Методом называется действие, которое можно выполнить с объектом (например, можно сохранить документ с помощью метода SaveAs объекта Document).
Нередко серверы автоматизации содержат наборы однотипных объектов, называемых коллекциями. Например, текстовый процессор может содержать коллекцию документов, а каждый документ — коллекцию абзацев.
Вся информация об объектах, необходимая контроллерам автоматизации, содержится в библиотеках типов. Библиотеки типов хранятся в специальном бинарном формате и обычно представлены в виде файлов с расширениями *.olb или *.tlb, а также могут содержаться внутри исполняемых файлов (*.exe) или динамически загружаемых библиотек (*.dll). Библиотеки типов можно просматривать с помощью утилиты OleView, входящей в состав Microsoft Platform SDK, а средства разработки фирмы Borland содержат свои собственные утилиты просмотра библиотек типов.
Заканчивая это более чем краткое введение в автоматизацию, остановимся также на понятии связывания. Связыванием называется способ, с помощью которого переменная или класс приложения-контроллера ссылается на объект автоматизации. Таких способов существуют два: позднее связывание и раннее связывание.
Позднее связывание означает, что реальная ссылка на объект в переменной или классе появляется на этапе выполнения приложения-контроллера. Этот способ обычно более медленный, чем ранее связывание, но он доступен во всех средствах разработки, позволяющих создавать контроллеры автоматизации, и менее чувствителен к тому, все ли параметры методов перечислены при их вызовах в коде приложения-контроллера. При позднем связывании корректность вызовов методов проверяется в момент их осуществления, то есть на этапе выполнения приложения, а не на этапе его компиляции.
Раннее связывание означает, что реальная ссылка на объект автоматизации появляется уже на этапе компиляции. Поэтому в коде приложения-контроллера требуется ссылка на библиотеку типов (или на специальный модуль, являющийся интерфейсом к ней), и это приводит к генерации в этом приложении классов с теми же свойствами и методами, что и у объектов автоматизации, что делает возможными синтаксическую проверку имен методов на этапе компиляции и доступ к именованным константам, содержащимся в библиотеке типов. Отметим, однако, что далеко не все средства разработки, поддерживающие позднее связывание, осуществляют также поддержку раннего связывания.
Закончив экскурс в COM и автоматизацию, вернемся к вопросу о том, какие средства разработки удобно применять для создания контроллеров автоматизации.
VBA и средства разработки контроллеров автоматизации
Как уже было сказано выше, контроллеры автоматизации можно создавать с помощью различных средств разработки, и если вы уже используете какое-либо из инструментальных средств, поддерживающих создание контролеров автоматизации, можно именно им и воспользоваться. Единственное, что следует сделать — это узнать, поддерживается ли вашим средством разработки ранее связывание, если вы планируете его использовать. Примеры простейших контроллеров автоматизации (как правило, для Microsoft Word или Microsoft Excel), дающие представление о том, как вызываются методы сервера, обычно можно найти в комплекте поставки большинства современных средств разработки.
Освоение объектной модели автоматизируемого сервера можно начать с записи необходимой последовательности действий в виде макроса с помощью VBА. Создать макрос можно, выбрав из меню приложения Microsoft Office пункт Tools | Macro |Record New Macro. Просмотр полученного макроса в редакторе кода VBA обычно позволяет понять, как должен выглядеть код, реализующий эту последовательность действий.
Обсудив возможные средства разработки контроллеров автоматизации, можно наконец перейти к самим приложениям Microsoft Office, к их объектным моделям и к их использованию. В качестве средства разработки для приведенных ниже примеров используется Borland Delphi 5, но поскольку в них приводится последовательность вызова свойств и методов объектов Microsoft Office, перенос кода на другие языки программирования не должен вызвать особых затруднений. Если специально не оговорено, в данной статье во всех примерах используется раннее связывание.
Объектные модели Microsoft Office
Как было сказано выше, приложения Microsoft Office предоставляют контроллерам автоматизации доступ к своей функциональности с помощью своей объектной модели, представляющей собой иерархию объектов. Объекты могут предоставлять доступ к другим объектам посредством коллекций.
В качестве иллюстрации того, как выглядит иерархия объектов Microsoft Office, приведем небольшой фрагмент объектной модели Microsoft Word (рис.1):
В объектных моделях всех приложений Microsoft Office всегда имеется самый главный объект, доступный приложению-контроллеру и представляющий само автоматизируемое приложение. Для всех приложений Microsoft Office он называется Application, и многие его свойства и методы для всех этих приложений также одинаковы. Наиболее часто мы будем использовать следующие из них:
- Свойство Visible (доступное для объекта Application всех приложений Microsoft Office) позволяет приложению появиться на экране и в панели задач; оно принимает значения True (пользовательский интерфейс приложения доступен) или False (пользовательский интерфейс приложения недоступен; это значение устанавливается по умолчанию). Если вам нужно сделать что-то с документом Office в фоновом режиме, не информируя об этом пользователя, можно не обращаться к этому свойству — в этом случае приложение можно будет найти только в списке процессов с помощью приложения Task Manager.
- Метод Quit закрывает приложение Office. В зависимости от того, какое приложение Office автоматизируется, он может иметь параметры или не иметь таковых.
Общие принципы создания контроллеров автоматизации
В общем случае контроллер автоматизации должен выполнять следующие действия:
- Проверить, запущена ли копия приложения-сервера.
- В зависимости от результатов проверки запустить копию автоматизируемого приложения Office либо подключиться к уже имеющейся копии.
- Сделать окно приложения-сервера видимым (в общем случае это не обязательно).
- Выполнить какие-то действия с приложением-сервером (например, создать или открыть документы, изменить их данные, сохранить документы и пр.)
- Закрыть приложение-сервер, если его копия была запущена данным контроллером, или отключиться от него, если контроллер подключился к уже имеющейся копии.
Соответствующий код для Delphi представлен в листинге 1.
Здесь мы воспользовались функциями GetActiveOleObject и CreateOleObject для подключения к уже запущенной копии приложения-сервера или запуска новой, если сервер не запущен, что приводит к тому, что в вариантную переменную помещается ссылка на объект Application соответствующего сервера.
Приведенная часть кода контроллера в других средствах разработки может выглядеть по-другому — она не имеет прямого отношения к методам объектов Office, так как обусловлена правилами вызова стандартных функций OLE в Delphi (за исключением вызовов методов Visible и Quit объекта Application). А вот все то, что должно быть вставлено вместо комментария «Здесь выполняются другие действия с объектами приложения Office», в разных средствах разработки должно выглядеть более или менее однотипно — используя созданную вариантную переменную, мы манипулируем методами и свойствами объекта Application.
В заключение сделаем одно маленькое замечание касательно числа параметров методов объектов автоматизации. В случае применения позднего связывания число указанных в коде параметров метода не обязано совпадать с их истинным числом (которое можно найти в описании объектной модели соответствующего приложения). В этом случае вполне допустимым является следующий код:
несмотря на то что метод Quit объекта Application в случае некоторых приложений Microsoft Office (например, Microsoft Word) имеет параметры.
При использовании же раннего связывания, например при создании контроллеров с помощью Delphi, следует более строго подходить к определению параметров — их число и тип должны соответствовать описанию методов в библиотеке типов. Например, в случае раннего связывания корректный код на Delphi для закрытия документа Word со значениями всех параметров по умолчанию будет иметь вид:
App.Quit(EmptyParam, EmptyParam, EmptyParam);
Исключением из этого правила является Visual Basic — это средство разработки позволяет не задумываться о числе параметров методов при написании кода.
Обсудив общие принципы создания контроллеров автоматизации и узнав, как это делается средствами Borland Delphi, мы можем перейти к рассмотрению автоматизации конкретных приложений Microsoft Office. Начнем с одного из самого популярных компонентов этого пакета — с Microsoft Word.
Автоматизация Microsoft Word
В данном разделе мы обсудим наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft Word. Но перед этим рассмотрим, каковы программные идентификаторы основных объектов Microsoft Word и что представляет собой его объектная модель.
Поводом для заметки послужила статья на Хабре, в которой автор описывал, как он решал на Python задачу сбора и анализа метаданных из файлов Excel.
Эта заметка более подробно раскрывает всем известный тезис: Под конкретную задачу надо выбирать наиболее подходящий инструмент применимо к офисной автоматизации.
VBA и Python
VBA (Visual Basic for Applications), де-факто, самый популярный язык для автоматизации Microsoft Office. Доступен из коробки, помимо Excel, работает в PowerPoint, Outlook, Access, Project и других приложениях.
Если задать вопрос: «Какой язык программирования выбрать первым», то где-то в 90% всех случаев будет предложен Python. На практике здесь может быть и любой другой язык, но, исходя из популярности языка и своего опыта, буду сравнивать с ним.
В общем виде можно описать ситуацию через подобный график:
Детального сравнения не будет, рассмотрим основные killer-фичи, в ситуации, когда junior-программист/офисный сотрудник хочет автоматизировать что-либо, связанное с MS Office, и у него есть возможность выбора между языками.
Если в силу разных причин возможности выбора нет, то и сравнивать нечего.
В пользу VBA
- Отличная работа с объектной моделью Excel и других приложений MS Office. Написание кода на VBA для большинства внутренних операций тривиально. У Python, в сравнении с VBA, поддержка объектной модели Office очень слабая.
- Поддержка разных форматов MS Office. Самая большая проблема для внешних языков — это работа с разными форматами файлов MS Office. Например, xls, xlsx, xlsm файлы могут требовать разных библиотек, так как каждая хорошо работает только со своим форматом файла. Для VBA — это все "файл Excel", работа с которыми в целом одинаково хороша.
- Работа с MS Exchange. Если необходимо обеспечить работу с корпоративной почтой/календарем на Exchange, то далеко не каждом языке есть нормальная библиотека для работы протоколом Exchange. В VBA это решается относительно просто через использование в макросе объектной модели MS Outlook.
- Легкая установка и дистрибуция. К уже установленному офису не надо ничего устанавливать. Чтобы коллега мог воспользоваться программой, достаточно передать ему файл с макросом. Легко сделать надстройку, которая позволит "установить" модель макроса в фон офиса.
- Интерактивность внутри приложений MS Office. Внутри офисных программ можно как просто поставить кнопки запуска макросов, так и (чуть сложнее) сделать целый отдельный UI. Сюда же относится написание своих формул в Excel и то, что макросы могут воздействовать на объекты внутри документов Office в реальном времени.
- Запись макросов. Удобный инструмент, который позволяет записать действия человека в готовый код, для последующего редактирования использования.
В пользу Python (и других внешних языков программирования)
- Приятный синтаксис и синтаксический сахар. Если коротко, то VBA не отличается выразительностью и удобством. Это вопрос личного вкуса, но для меня Python намного удобнее.
- Богатая экосистема библиотек. Огромный выбор готовых библиотек для работы с внешним миром. Пытаться сделать на VBA программу, взаимодействующую с каким-нибудь внешним API, та еще боль. Занимательно, что как раз для работы с файлами Office библиотеки того же Python — откровенно "на троечку".
- Хорошие средства разработки. Можно выбрать из огромного выбор программ, которые облегчают процесс разработки. Стандартный редактор VBA из Office предлагает очень бедный функционал и, в сравнении с альтернативами из мира Python, откровенно неудобен. Писать код VBA в внешнем редакторе, а потом копировать внутрь офиса для отладки — тоже неудобно.
- Скорость работы. Не проверял скорость однопоточной работы, но, предположу, что в случае однопоточной работы преимущество будет за Python. В любом случае, достаточно тривиально организуется многопоточная обработка данных/файлов, что позволяет говорить в большей достижимой скорости.
Кейсы
Далее приведены конкретные задачи, которые я сам решал или автоматизировал, и когда мне надо было выбрать стек: VBA или Python. Для каждой задачи указан выбранный стек и даны пояснения почему:
- Задача: Программа для проверки всех файлов Excel в директории на предмет наличия скрытых листов
- Мой выбор: VBA. Причины: простота работы с разными форматами файлов Excel и отсутствие внешних взаимодействий.
- Сервис был реализован как почтовый бот, на адрес которого пользователь может переслать файлы Office, а в ответ пользователю по почте приходит ответ с файлами PDF.
- Мой выбор: Логика VBA + Python для мониторинга
- Во-первых, внутренние функции гарантированно сохраняли PDF, аутентичный файлу PowerPoint (внешние библиотеки плохо справляются с рендером PowerPoint).
- Во-вторых, реализация почтового бота, как макроса в MS Outlook решала проблемы работы с корпоративной Exchange почтой. Так, в Python нет нормальной библиотеки для работы с MS Exchange.
- Python использовался для организации мониторинга работы сервиса и нотификации о возможных проблемах
- Мой выбор: VBA. Задача решалась через конвертацию двух файлов в PDF и их объединением с Riffle Shuffle. Так как важно качество конвертации в PDF, то использовались встроенные функции офиса для экспорта в PDF.
- Мой выбор: Python.
- Чтобы вытаскивать из html карточек данные пригодилась библиотека для парсинга html BeautifulSoup.
- Excel-файл создает программа, поэтому мы сами можем решать, какую аналитику рассчитывать уже в нем, а какую еще на стадии подготовки данных в Python.
- Мой выбор: VBA. Важно было аккуратно работать с текстом во внутренних объектах файла PowerPoint. Для перевода использовался API от Яндекса, так как он бесплатен для небольших объемов и прост в подклюении. Например, API переводчика Bing я так и не смог заставить работать в VBA, так как там для работы нужен OAuth со своими заморочками. Если бы пришлось работать с Bing, то, наверное, я бы делал сервис-посредник на Python.
- Мой выбор: Python. Хотя API — простой (не требует какой-либо подписи запросов или авторизации) и выдает данные в CSV, выбран Python, так как нет причин выбирать VBA, а на Python писать удобнее.
- Здесь я выбирал очень долго, так как есть много альтернатив:
- Сторонняя готовая система поручений
- База данных с каким-то обработчиком
- Access
- Excel
- Во-первых, Excel сам по себе является готовым UI для работы
- Во-вторых, VBA решает задачу работы с корпоративным Exchange через подключение MS Outlook
- В-третьих, это решение делалось с прицелом на коллег, которым Excel был более понятен, чем что-либо совсем новое
Заключение
Надеюсь, для кого-то заметка будет полезна и позволит сэкономить время на выборе стека для решения своих задач.
Читайте также: