Why manually perform repetitive data-related tasks in Excel when you can use the power of the application to automate them? In this article, we will explain how you can save time, reduce errors, and automate basic tasks with Excel automation and provide shortcuts and professional tips for getting started.
Included on this page, you’ll find details on what excel automation is, steps on how to automate excel dashboards and reports, and more.
What Is Excel Automation?
Using Excel’s automation tools, you can accomplish a variety of steps — like importing CSV files, adding headers, moving columns, formatting text, and more — with a single click.
Additionally, if you go on vacation, you could send a spreadsheet to a fellow employee who can do the same thing without having to reinvent the wheel. More advanced versions of automation allow you to add custom logic, so that the automated process can take different steps based on the results of prior steps.
While there is some overlap, there are three main ways to automate tasks in Excel:
-
Macros: A sequence of actions that have been recorded and can be reused. They can be user-generated or received from other users or downloaded.
-
Visual Basic: A programming language built into Microsoft Office products. Visual Basic (also knowns as Visual Basic for Applications or VBA) allows a user to to choose and modify pre-selected pieces of code via a graphical user interface, called Visual Basic Editor (VBE). Macros are saved in VBA, and can be viewed and edited in the VBE.
-
Add-ins: Third-party programs that can be downloaded and connected to Excel. Add-ins (sometimes referred to as plug-ins) can be created in Visual Basic, or in other programming languages.
Some common uses for automation include the following:
-
Adding standard formatting cells, ranges, rows, columns, or worksheets
-
Saving a worksheet in a particular format (like PDF) with a particular file name format (e.g., DailySalesReportxxxxxxxx, where the x’s are replaced with the current date)
-
Moving columns or rows into a certain order
-
Creating and formatting a chart based on data in a worksheet
-
Creating and formatting a table
-
Creating UserForms
Benefits of Using Excel Automation
In addition to saving time and reducing the effort expended, there are advantages to automating tasks in Excel. These include the following:
Standardized document formats and consistent results
-
Error reduction
-
Better reporting
-
No programming knowledge required (if macros or add-ins are used)
-
Integration with apps such as Microsoft Word and PowerPoint
-
Reduction in brain drain due to staff turnover
-
Ability to get work done when someone is out of the office
Challenges to Using Macros for Automation
There are a few issues to be aware of when using macros and VBA code, but that doesn’t mean it’s not worth the initial investment in time to make Excel automation work for you. Keep the following in mind when using macros:
-
They can do things you don’t expect (such as deleting data), so ensure you understand how they work.
-
They can be malicious, so it’s imperative to verify that you can trust the source of the macro or code.
-
Not all macros will work correctly on all platforms, and some platforms (such as browser-based versions of Excel or Excel on mobile devices) don’t run macros at all.
Saving a workbook as a template does not save the macros. In order to save a macro in a standard template, you’ll need to save it as a macro-enabled template, which has the extension XLSM.
How to Use Excel Macros to Automate Tasks
First, decide which steps you want your macros to perform. The next step is to record yourself performing the selected steps. The last step is to run the macro and verify that it performs as expected. Follow the tutorial below to learn how to perform each of these steps in Excel.
Recording a Macro
Macros are created by using the macro recorder. The macro recorder remembers a series of steps a user performs, which can be repeated whenever needed. It’s easy to create macros in this way because users just need to perform actions that they already know how to do. Open an Excel workbook that you want to automate to get started.
-
From the Tools menu, click Macro, click Record New Macro.
2. Click in the box under Macro name in the pop-up window, and type a name for your Macro.
3. Choose where to store the macro from the dropdown menu. There are three options; choose one that fits your needs:
-
This Workbook: The macro is only available in the current workbook.
-
New Workbook: A new workbook opens and the macro is only available in that workbook.
-
Personal Workbook File: This allows a user to use a macro from any Excel workbook opened on that same computer. These files will have the extension .xlsb.
If desired, enter a shortcut key (more on this later). If you enter a letter that’s used by the OS, you’ll get a politely-worded message to change it. Click OK.
4. The recording indicator appears below the navigation buttons.
5. Perform the steps you want to automate, and click the macro recording indicator when done. It’ll change appearance and look like this.
From this point forward, you can also click this button to start recording a new macro.
Running a Macro
Once a macro is recorded, you’ll want to run it. Excel provides a few different ways to run your macros. Use this list to decide which method is right for you:
-
Menu: Click Tools, click Macro, click Macros…, then click the title of the macro. In Windows, simultaneously press alt+F8 to bring up this option.
Select the macro you want and click Run. If you don’t see your macro, it may be stored in a different workbook.
-
Keyboard Shortcut: If a shortcut was created when you first named the macro, you can run the macro by keying that shortcut. The key combination for Windows is Control+Shift+ the letter you chose; for Mac, it is Option+Command+ the letter you chose.
-
You can also add a shortcut after the fact. Simply click Tools, click Macro, click Macros…, click the title of the macro, and then click Options.
-
-
Worksheet Button: You can add a button to the spreadsheet that can be assigned to run a macro. If you send the spreadsheet to another person, they can easily see how to run the macro. To add a button:
-
Click the Developer tab (if the Developer tab is not showing, here are the instructions to add it).
-
Click Button. A button will appear on your spreadsheet (the first one will be called Button1, etc.). Click on it, and assign the desired macro.
-
Double click on the button to edit its display name.
-
- Toolbar Button: For quick access, you can add a button to a toolbar. You can find instructions for this task here.
How to Use Visual Basic to Do Excel Automation
Visual Basic is more complicated to use than macros because it requires some knowledge of the Basic programming language. When macros are created, Excel saves them as Visual Basic; existing macros can be edited in the Visual Basic Editor (VBE), which is the interface in Excel.
How to Do Excel Automaton without Macros
Add-ins are third-party programs that can be downloaded and connected to Excel. Some examples are AutomateExcel, HelpSystems Automate, Kloudio, Analytics Canvas, Insight Software, PowerOLAP, and Domo. They are also available from companies like Peltier Technical Services, Inc..
If you have programming chops or know someone who does, add-ins that interact with Excel can be developed in languages such as Python, SQL, C#, M, Java, C++, and D. These can be customized to do many things.
How to Automate Excel Reports
The creation of reports can be automated via any of the available methods. If it’s a simple report, it can be done with a macro. For more advanced reports, some VBA coding or an add-in will be required.
For reports, steps like opening a source file, removing unneeded data, formatting cells, adding titles, and adding the current date are all doable.
How to Automate Excel Dashboards
Dashboards can also be automated via any of the available methods. For a dashboard, steps like accessing a source file, copying data from cells in the source file to cells in the dashboard, and updating the date and time are all feasible.
How to Automate Excel Using Visual Basic
You can use Visual Basic to automate tasks in Excel. Visual Basic gives users more control over the steps than do macros; however, users need to have knowledge of the programming language. You can find more information on how to get started with Visual Basic here.
How to Automate Word Documents from Excel
If you want to add data in an Excel worksheet to a Word document, and keep the data update in the Word document as it changes in the worksheet, you simply need to copy and paste.
When you paste the Excel cells into the Word document, click on the Paste Options button in Word, and select one of the options that say Link to Excel. As long as the documents are on the same computer, the Word document will automatically update as the Excel data changes.
For more complicated data sets, use Visual Basic or other programming languages to open a Word document and input Excel data into the document. Instructions for this are beyond the scope of an introductory-level article, but they can be found online for anyone looking for a challenge.
How to Learn Excel Automation
Like any other skill, education and practice are key. Find a resource that explains what you are trying to learn, and then practice, practice, practice. Macros are fairly easy to learn on the job, especially for a series of simple steps. You can also get a manual, find an online tutorial, or take a class.
Peltier advises, “I would suggest that people take a project they really think would benefit from automation and just start working on it. Start out with a small piece of it, like opening the file and copying the data in the right worksheet. Figure out how to automate that, then figure out the next step, and find a few web sites where they have a lot of good examples and just go back to them. But do it with that specific project in mind so that your motivation is there; when you finish you’ll have something that’ll save you an hour a day or more.”
Visual Basic coding is more difficult, but can be learned the same way. There are also many tutorials online and in manuals that can help you learn how to use VBA. Or, if you’re a learn-by-doing person, record some macros and look at the code to figure out how it works. There are also classes available.”
To view the code for a particular macro, click Tools, click Macro…, click the name of the macro, and click Edit.
Says Peltier, “I started learning it about 20 years ago by recording my own macros and then seeing what code was recorded, then saying, ‘Ok, I want it to work a little bit differently than what I recorded.’ So you go and you play around with that. There is a wealth of information about Visual Basic for Excel on the internet. People end up reading examples on my site or other sites like Stack Overflow, or tMrExcel.com to find all kinds of stuff.”
What Are Excel Automation Servers?
An automation server (sometimes called an automation component) is a subtype of automation add-ins that are built into Excel. An automation server is an application that opens programmable objects (aka automation objects) in other applications (aka automation clients).
Developers use automation add-ins as a library of functions that can be called from cells in a worksheet. There are two ways to control an automation server: late binding (the objects are not declared until run-time) and and early binding (the objects are declared during design). Early binding is considered better because the application knows in advance what’s coming.
How to Use the Excel Object Model in Automation
The Excel Object Model is each entity in Excel, which has properties that can be called on or changed via add-ins, VBA, or macros. Objects include an entire workbook, a worksheet, a row, a column, a range of cells, an individual cell, a pivot table, a chart, and the active cell or range of cells.
Some common properties are Name, Value, Row Number, Column Number, if it’s protected, if it contains a formula, and its display properties.
Code can reference the properties of an entity and use that to make a change. For example, it can look at the value of a cell and if it’s less than a target, it can change the color of the text in that cell to red. Code can also change the properties of an entity. For example, you can rename a worksheet from the default (e.g. Sheet1) to something else (e.g. February 2018 Expenses).
Other Tasks that Can Be Accomplished via Excel Automation
Dashboards and reports aren’t the only tasks you can automate in Excel. In fact, there are a variety of other things that can be automated as well. The following list of actions can be automated in Excel — use it to get ideas of how you can implement automation in your own workflow.
Enhancing Data Readability
-
Create a chart
-
Create and format tables
-
Create a table of contents
-
Create a cover page
-
Display a UserForm
-
Expand pivot table data
-
View locations that are listed in spreadsheet as points on a map
Manipulating Data
-
Delete rows that meet certain criteria (e.g., blank or negative values)
-
Schedule obtaining data from other sources and insert it in a cell
Editing and formatting
-
Format text
-
Format cells
-
Insert a formula
-
Add headers to a column
-
Open a document (e.g. csv file, xlsx file)
-
Remove duplicate rows
-
Add or remove sheets
-
Convert a vector (i.e. a row) to a matrix
-
Convert a matrix to a vector
-
Copy a cell’s format
-
Select the contents of a cell and copy it to other cells
Notifications
-
Send an email when a cell value hits a certain threshold
-
Send an email whenever a particular macro is run
Other
-
Return the column or row of a cell based on its contents (i.e., the cell with value 5309 is in column AA)
-
Show the formula in a cell
-
Find a word in a string that meets criteria (e.g., 10 characters, starts with L, etc,)
-
Find the last used cell
-
Save and close all open workbooks
-
Manage data sets larger than excel size limits
Connecting Data Across Your Work with Cross-Sheet Formulas in Smartsheet
Empower your people to go above and beyond with a flexible platform designed to match the needs of your team — and adapt as those needs change.
The Smartsheet platform makes it easy to plan, capture, manage, and report on work from anywhere, helping your team be more effective and get more done. Report on key metrics and get real-time visibility into work as it happens with roll-up reports, dashboards, and automated workflows built to keep your team connected and informed.
When teams have clarity into the work getting done, there’s no telling how much more they can accomplish in the same amount of time. Try Smartsheet for free, today.
Аннотация
Автоматизация может быть использована разработчиками для создания специальных программ на базе функций и компонентов продуктов из пакета Office. Хотя такая программная разработка может быть реализована в клиентской системе с относительной легкостью, может возникнуть ряд сложностей, если автоматизация выполняется из серверного кода, например Microsoft Active Server Pages (ASP), ASP.NET, DCOM или службы Windows NT.
В этой статье рассматриваются сложности, с которыми могут столкнуться разработчики. Также в ней предложены альтернативы автоматизации, которые могут повысить производительность. Но разработчикам следует иметь в виду, что рекомендации в данной статье предоставлены исключительно в информационных целях. Корпорация Майкрософт не советует производить и не поддерживает серверной автоматизации Office.
Примечание: В этом контексте распространяемый компонент ядра СУБД Access и среда выполнения Access считаются компонентами Microsoft Office. В этом контексте термин «серверный» относится также к программному коду, который запускается на рабочих станциях под управлением Windows, если его запуск осуществляется с другой рабочей станции Windows (по отношению к станции, на которой работает вошедший в систему пользователь). Например, программы, запущенные планировщиком с помощью учетной записи SYSTEM, выполняются в той же среде, что и «серверный» программный код ASP или DCOM. Следовательно, могут возникнуть многие из рассмотренных в статье проблем. Ссылки на источники дополнительных сведений о рабочих станциях Windows и COM содержатся в разделах «Дополнительные сведения» и «Ссылки» этой статьи.
Дополнительная информация
Все современные версии Microsoft Office были созданы, проверены и настроены для применения на рабочих станциях конечными пользователями. Их использование предполагает наличие интерактивного рабочего места и профиля пользователя. Кроме того, эти продукты не обеспечивают уровень безопасности и возможности повторного входа, удовлетворяющие требованиям серверных компонентов, которые запускаются автоматически.
В настоящее время корпорация Майкрософт не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любого автоматического, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и службы NT), так как Office может работать нестабильно и (или) взаимоблокировка при запуске Office в этой среде.
При создании решения, которое выполняется в контексте на стороне сервера, следует попытаться использовать компоненты, которые были сделаны безопасными для автоматического выполнения. Или попытаться найти альтернативы, которые позволяют исполнять хотя бы часть кода на стороне клиента. Если вы используете приложение Office в серверном решении, для него будет отсутствовать ряд важных возможностей, необходимых для корректной работы. Кроме того, таким образом вы поставите под угрозу стабильность всего решения в целом.
Проблемы при использовании серверной автоматизации Office
Разработчикам серверных решений для приложений Office необходимо знать о пяти крупных областях, в которых поведение Office отличается от ожидаемого в силу используемой среды. Для успешной работы программ эти отклонения должны быть обязательно учтены, а их влияние минимизировано. Внимательно изучите эти вопросы при создании приложения. Все эти проблемы невозможно устранить одним решением. В зависимости от задач проекта приоритетность элементов будет изменяться.
-
Удостоверение пользователя. Приложения Office предполагают удостоверение пользователя при запуске приложений, даже если служба автоматизации запускает приложения. Приложения пытаются инициализировать панели инструментов, меню, параметры, принтеры и некоторые надстройки на основе параметров в кусте реестра пользователей для пользователя, который запускает приложение. Многие службы выполняются под учетными записями без профилей пользователей (например, учетной записью SYSTEM или учетными записями IWAM_[имя_сервера]). Таким образом, Office может неправильно инициализироваться при запуске. В этом случае Office возвращает ошибку для функции CreateObject или Функции CoCreateInstance. Даже если приложение Office можно запустить, другие функции могут работать неправильно, если профиль пользователя не существует.
-
Взаимодействие с рабочим столом. Работа приложений Office предполагает наличие интерактивного рабочего стола. В некоторых условиях для корректной работы определенных функций автоматизации приложение необходимо сделать видимым. Office сконструирован таким образом, что всякий раз при возникновении ошибки или необходимости указания параметра выводится соответствующее модальное диалоговое окно. Модальное диалоговое окно на не интерактивном рабочем столе не может быть отвергнуто , что приводит к остановке (зависанию) потока на неопределенное время. Даже если некоторые методы написания программ позволяют снизить возможность возникновения такой ситуации, полностью исключить ее нельзя. Уже только этот факт делает запуск приложений Office из серверного окружения рискованным и непредсказуемым.
-
Повторное использование и масштабируемость. Серверные компоненты должны быть высокоцентрированными, многопотоковые COM-компоненты с минимальными издержками и высокой пропускной способностью для нескольких клиентов. Приложения Office почти во всех отношениях полностью противоположны. Приложения Office не являются повторными серверами автоматизации на основе STA, которые предназначены для предоставления разнообразных, но ресурсоемких функций для одного клиента. Приложения обеспечивают небольшую масштабируемость в качестве решения на стороне сервера. Кроме того, приложения имеют фиксированные ограничения на важные элементы, такие как память. Их нельзя изменить с помощью конфигурации. Что еще более важно, приложения используют глобальные ресурсы, такие как сопоставленные файлы памяти, глобальные надстройки или шаблоны и общие серверы службы автоматизации. Это может ограничить количество экземпляров, которые могут работать одновременно, и привести к условиям гонки, если приложения настроены в многопользовательской среде. Разработчикам, планирующим одновременно запускать несколько экземпляров любого приложения Office, необходимо рассмотреть возможность создания пула или сериализации доступа к приложению Office, чтобы избежать потенциальных взаимоблокировок или повреждения данных.
-
Устойчивость и стабильность: Office 2000, Office XP, Office 2003 и Office 2007 используют технологию установщика Microsoft Windows (MSI), чтобы упростить установку и самостоятельное восстановление для конечного пользователя. В MSI представлена концепция «установка при первом использовании». Это позволяет динамически устанавливать или настраивать компоненты во время выполнения для системы или чаще для конкретного пользователя. В серверной среде это снижает производительность и повышает вероятность появления диалогового окна с запросом на утверждение установки или предоставление диска установки. Хотя это предназначено для повышения устойчивости Office как продукта конечного пользователя, реализация office возможностей MSI в серверной среде является контрпродуктивной. Кроме того, стабильность Office в целом не может быть гарантирована при запуске Office на стороне сервера, так как она не была разработана и не протестирована для этого типа использования. Использование Office в качестве компонента службы на сетевом сервере может снизить стабильность этого компьютера и, следовательно, снизить стабильность всей сети.
-
Безопасность на стороне сервера: Приложения Office не были спроектированы для использования на сервере. Поэтому в ходе разработки приложений Office во внимание не принимались те проблемы безопасности, с которыми сталкиваются распределенные компоненты. Office не осуществляет проверку входящих запросов. Office не обеспечивает защиту от непреднамеренного запуска макроса или другого сервера, который, в свою очередь, может запустить макрос. Не открывайте файлы, отправленные на сервер с анонимного веб-сайта. В зависимости от параметров безопасности, которые были установлены в последний раз, сервер может запускать макросы в контексте администратора или системы с полными привилегиями и, следовательно, может скомпрометировать вашу сеть. Кроме того, Office использует многие клиентские компоненты (например, Simple MAPI, WinInet и MSDAIPP), которые для ускорения обработки данных кшируют сведения о прохождении клиентами проверки. Если Office был автоматизирован на сервере, один экземпляр может работать более чем с одним клиентом. Если в ходе сессии были кэшированы данные проверки подлинности, кэшированные данные одного клиента могут быть использованы другим. Следовательно, клиент может получить закрытые для него разрешения доступа, выдавая себя за другого пользователя.
Помимо технических проблем, вам также следует учитывать вопросы лицензирования. Применяемые в данный момент времени условия лицензирования предусматривают использование приложений Office на сервере для обслуживания клиентов только в том случае, если клиенты также обладают лицензированными копиями Office. Применение серверной автоматизации для предоставления нелицензированным рабочим станциям доступа к приложениям Office не предусмотрено лицензионным соглашением (EULA).
Помимо этих проблем, при попытке автоматизировать Office на стороне сервера может возникнуть одна из следующих распространенных ошибок:
-
Функции CreateObject и CoCreateInstance возвращают в процессе выполнения одно из следующих сообщений об ошибке и не запускаются для автоматизации.
Сообщение 1
Ошибка времени выполнения «429»: компонент ActiveX не может создать объект
Сообщение 2
Ошибка времени выполнения «70»: отказано в разрешении
Сообщение 3
CO_E_SERVER_EXEC_FAILURE (0x80080005): Ошибка при выполнении приложения-сервера
Сообщение 4
E_ACCESSDENIED (0x80070005): Отказано в доступе
-
При открытии документа Office появляется одно из следующих сообщений об ошибке.
Сообщение 1
Ошибка времени выполнения «5981» (0x800A175D): не удалось открыть хранилище макросов
Сообщение 2
Ошибка времени выполнения «1004»: сбой метода «~» объекта «~»
-
Функции CreateObject и CoCreateInstance перестают отвечать и зависают или выполняются очень долго. На некоторых серверах процесс создания занимает мало времени, однако в журнале событий Windows появляется ошибка 1004, указывающая на остановку приложения.
-
Определенные функции неожиданно завершаются или перестают отвечать на неопределенное время из-за предупреждений или других диалоговых окон, которые требуют внимания пользователя.
-
Одновременное появление нескольких запросов или проведение тестирования в предельных режимах может привести к сбою (зависанию) программы или аварийному завершению при открытии или закрытии приложения Office. После этого в памяти остается процесс, который не может быть завершен, либо впредь все экземпляры автоматизированного приложения не функционируют.
Другие проблемы или сообщения могут появиться в дополнение к перечисленным здесь, но эти проблемы обычно возникают в результате пяти основных проблем, перечисленных ранее в этой статье.
Альтернативы серверной автоматизации
Майкрософт настоятельно рекомендует разработчикам искать альтернативы автоматизации Office при разработке серверных решений. В связи с ограничениями архитектуры Office изменений в конфигурации недостаточно для решения всех проблем. Майкрософт настоятельно рекомендует воспользоваться рядом альтернатив, которые не требуют установки Office на сервере и справляются с большинством распространенных задач быстрее и эффективнее, нежели автоматизация. Перед внедрением Office в свой проект в качестве серверного компонента, вам стоит рассмотреть существующие альтернативы.
Большинство задач автоматизации на стороне сервера связаны с созданием или редактированием документов. Office 2007 поддерживает новые форматы файла Open XML, которые позволяют разработчикам создавать, читать и трансформировать содержимое файлов на сервере. Эти форматы файлов используют пространство имен System.IO.Package.IO в Microsoft .NET 3.x Framework для редактирования файлов Office без участия самих клиентских приложений Office. Это рекомендуемый и поддерживаемый метод обработки изменений в файлах Office из службы.
Форматы файлов Open XML являются общедоступным стандартом.
Корпорация Майкрософт предоставляет пакет SDK для управления форматами файлов Open XML из платформы .NET 3.x Framework. Дополнительную информацию о SDK и том, как его использовать для создания или редактирования файлов Open XML, см. на следующих сайтах Сети разработчиков Майкрософт (MSDN):
Документация по пакету SDK Open XML
Практическое руководство. Управление документами в форматах Office Open XML
Управление файлами Word 2007 с помощью объектной модели Open XML (часть 1 из 3)
Управление файлами Word 2007 с помощью объектной модели Open XML (часть 2 из 3)
Управление файлами Word 2007 с помощью объектной модели Open XML (часть 3 из 3)
Управление файлами Excel 2007 и PowerPoint 2007 с помощью объектной модели Open XML (часть 1 из 2)
Управление файлами Excel 2007 и PowerPoint 2007 с помощью объектной модели Open XML (часть 2 из 2)
Создание решений для создания документов Server-Side с помощью объектной модели Open XML (часть 1 из 2)
Создание решений для создания документов Server-Side с помощью объектной модели Open XML (часть 2 из 2)
При передаче файлов формата Open XML от ASP или ASP.NET необходимо предоставить правильный тип Многоцелевого расширения почты Интернета (MIME) для передаваемого содержимого. Со списком типов MIME для файлов Office 2007 можно ознакомиться по следующему адресу:
Типы MIME формата файлов Office 2007 для потоковой передачи содержимого HTTP
Если все ваши пользователи используют приложения, выходившие до Office 2007, и вы не хотите вводить в решение обязательное использование форматов Open XML, можно воспользоваться любым другим недвоичным форматом файла Office, например HTML, XML и RTF. Вы можете передавать эти файлы в клиентское приложение Office с помощью MIME-типа. Для редактирования, сохранения и возвращения документа на сервер необходим только ASP на сервере.
Для получения дополнительных сведений о любом из этих разделов и примеров, показывающих, как их реализовать, щелкните следующие номера статей, чтобы просмотреть статьи в базе знаний Майкрософт:
198703 Как автоматизировать Excel из VBScript на компьютере клиента
278973 Пример использования технологии ADO для чтения и записи данных в книге Excel
286023 Как использовать компонент Visual Basic ActiveX для автоматизации Word из Internet Explorer
Если ваш бизнес требует создания файлов двоичного формата Office 97, Office 2000, Office XP и Office 2003, существуют предложения компонентов от независимых разработчиков, которые могут помочь вам. Майкрософт не предоставляет подобных компонентов, поэтому вам необходимо либо создать свое собственное решение, или приобрести такое у независимых разработчиков. Существует ряд продуктов от независимых разработчиков. Рекомендуется рассмотреть все возможные предложения независимых разработчиков и выбрать оптимальные решения для конкретных деловых потребностей.
Если вы хотите создать собственное решение для прямого редактирования файлов Office 97, Office 2000, Office XP, Office 2003 двоичного формата, вы можете бесплатно скачать спецификации к данным файловым форматам в соответствии с условиями Обязательства Майкрософт об открытой технической документации/Microsoft Open Specification Promise (OSP). Для документации или создаваемых вами продуктов не существует технической поддержки, однако сама документация находится в открытом доступе.
Серверные решения также могут разрешить пользователям передавать файлы, а затем предоставить серверу отрисовку файлов для просмотра в Интернете или на других носителях. Корпорация Майкрософт в настоящее время работает над предложением таких функций и предоставляет раннюю версию этой возможности в Microsoft службы Excel.
службы Excel — это новая серверная технология, которая входит в состав Microsoft Office SharePoint Server 2007 и позволяет загружать, вычислять и отображать книги Excel в Office SharePoint Server 2007. Для получения дополнительных сведений о технологии Excel Services посетите следующую веб-страницу узла MSDN:
Обзор службы Excel
Пошаговое руководство. Разработка пользовательского приложения с помощью веб-служб Excel
Создание бизнес-приложений с помощью форматов Службы Excel и Office Open XML
Службы автоматизации Word, это новое служебное приложение в SharePoint Server 2010. Службы автоматизации Word обеспечивают автоматическое конвертирование документов в форматы, поддерживаемые клиентским приложением Microsoft Word.
Общие сведения о службах Word Automation Services
Знакомство со службами автоматизации Word
Выберите наиболее подходящий из предложенных в этой статье методов и продумайте разворачивание созданного решения. Приведенные в данной статье рекомендации не гарантируют решения всех возникающих проблем. Тщательно протестируйте решение перед его разворачиванием.
Часть 1. Microsoft Word и Microsoft Excel
Коротко об автоматизации
VBA и средства разработки контроллеров автоматизации
Объектные модели Microsoft Office
Общие принципы создания контроллеров автоматизации
Автоматизация Microsoft Word
Программные идентификаторы и объектная модель Microsoft Word
Создание и открытие документов Microsoft Word
Сохранение, печать и закрытие документов Microsoft Word
Вставка текста и объектовв документ и форматирование текста
Перемещение курсора по тексту
Создание таблиц
Обращение к свойствам документа
Автоматизация Microsoft Excel
Программные идентификаторы и объектная модель Microsoft Excel
Запуск Microsoft Excel, создание и открытие рабочих книг
Сохранение, печать и закрытие рабочих книг Microsoft Excel
Обращение к листам и ячейкам
Создание
диаграмм
Настоящая статья посвящена теме, может быть, и не новой,
но, как показывают письма читателей, по-прежнему актуальной — автоматизации
приложений 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).
Нередко серверы автоматизации содержат наборы однотипных объектов, называемых
коллекциями. Например, текстовый процессор может содержать коллекцию документов,
а каждый документ — коллекцию абзацев.
Как узнать, какие объекты доступны в серверах автоматизации? Для этой цели
в комплект поставки любого сервера автоматизации входит документация и файлы
справки, описывающие их объектную модель. Если брать приложения Microsoft Office
2000, то это справочные файлы для программистов на Visual Basic for Applications
VBAxxx9.CHM (для Microsoft Office 97 — VBxxx8.HLP соответственно). Отметим,
что по умолчанию они не устанавливаются, так как нужны разработчикам, а не рядовым
пользователям.
Вся информация об объектах, необходимая контроллерам автоматизации, содержится
в библиотеках типов. Библиотеки типов хранятся в специальном бинарном формате
и обычно представлены в виде файлов с расширениями *.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.
В заключение сделаем одно маленькое замечание касательно числа параметров методов
объектов автоматизации. В случае применения позднего связывания число указанных
в коде параметров метода не обязано совпадать с их истинным числом (которое
можно найти в описании объектной модели соответствующего приложения). В этом
случае вполне допустимым является следующий код:
App.Quit;
несмотря на то что метод 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 и что представляет собой его
объектная модель.
|
Программные идентификаторы и объектная модель Microsoft Word
Для приложения-контроллера доступны непосредственно следующие объекты:
Объект |
Программный идентификатор |
Комментарий |
---|---|---|
Application |
Word.Application, Word.Application.9 |
С помощью этого программного идентификатора создается экземпляр Word |
Document |
Word.Document, Word.Document.9, Word.Template.8 |
С помощью этого программного идентификатора создается экземпляр Word |
Все остальные объекты Word являются так называемыми внутренними объектами.
Это означает, что они не могут быть созданы сами по себе; так, объект Paragraph
(абзац) не может быть создан отдельно от содержащего его документа.
Если вспомнить, что основное назначение Word — работа с документами, можно
легко понять иерархию его объектной модели (фрагмент ее был показан на рис.
1). Основным объектом в ней, как иво всех других приложениях Microsoft Office,
является объект Application, содержащий коллекцию Documents объектов типа Document.
Каждый объект типа Document содержит коллекцию Paragraphs объектов типа Paragraph,
Bookmarks типа Bookmark, Characters типа Character и т.д. Манипуляция документами,
абзацами, символами, закладками реально осуществляется путем обращения к свойствам
и методам этих объектов.
Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией
Microsoft Word. Если же вам встретилась задача, не совпадающая ни с одной из
перечисленных, вы можете попытаться найти подходящий пример на Visual Basic
в справочном файле VBAWRD9.CHM, либо, как уже было сказано выше, записать необходимую
последовательность действий в виде макроса и проанализировать его код.
|
Создание и открытие документов Microsoft Word
Для создания примеров использования Microsoft Word можно использовать код создания
контроллера, приведенный выше, и модифицировать его, заменяя комментарии кодом,
манипулирующим свойствами и методами объекта Word.Application. Мы начнем с создания
и открытия документов.
Создать новый документ Word можно, используя метод Add коллекции Documents
объекта Application:
App.Documents.Add;
Как создать нестандартный документ? Очень просто — нужно указать имя шаблона
в качестве параметра метода Add:
App.Documents.Add(‘C:Program Files _ Microsoft OfficeTemplates1033Manual.dot’);
Для открытия уже существующего документа следует воспользоваться методом Open
коллекции Documents:
App.Documents.Open(‘C:MyWordFile.doc’);
Отметим, что свойство ActiveDocument объекта Word.Application указывает на
текущий активный документ среди одного или нескольких открытых. Помимо этого
к документу можно обращаться по его порядковому номеру с помощью метода Item;
например ко второму открытому документу можно обратиться так:
App.Documents.Item(2)
Отметим, что нумерация членов коллекций в Microsoft Office начинается с единицы.
Сделать документ активным можно с помощью метода Activate:
App.Documents.Item(1).Activate;
Следующее, чему следует научиться — это сохранять документ Word и закрывать
сам Word.
|
Сохранение, печать и закрытие документов Microsoft Word
Закрытие документа может быть осуществлено с помощью метода Close:
App.Documents.Item(2).Close;
или
App.ActiveDocument.Close ;
Метод Close имеет несколько необязательных (в случае позднего связывания) параметра,
влияющих на правила сохранения документа. Первый из них влияет на то, сохраняются
ли внесенные в документ изменения, и принимает три возможных значения (соответствующие
константы рекомендуется описать в приложении. См. листинг
2):
Третий параметр принимает значения True или False и влияет на то, пересылать
ли документ следующему пользователю по электронной почте. Если эта функциональность
не применяется, можно проигнорировать этот параметр.
Таким образом, при использовании этих параметров закрыть документ можно, например,
так:
App.ActiveDocument.Close(wdSaveChanges, _ wdPromptUser) ;
Просто сохранить документ, не закрывая его, можно с помощью метода Save:
App.ActiveDocument.Save;
Этот метод также имеет несколько необязательных (в случае позднего связывания)
параметров, первый из которых равен True, если документ сохраняется автоматически,
и False, если нужно выводить диалоговую панель для получения подтверждения пользователя
о сохранении изменений (если таковые были сделаны). Второй параметр влияет на
формат сохраняемого документа, и список его возможных значений совпадает со
списком значений второго параметра метода Close.
Напоминаем, что закрыть сам Word можно с помощью метода Quit объекта Word.Application.
Этот метод имеет в общем случае три параметра, совпадающих с параметрами метода
Close объекта Document.
Вывод документа на устройство печати можно осуществить с помощью метода PrintOut
объекта Document, например:
App.ActiveDocument.PrintOut;
Если нужно изменить параметры печати, следует указать значения соответствующих
параметров метода PrintOut (в случае Microsoft Word их около двадцати).
|
Вставка текста и объектовв документ и форматирование текста
Для создания абзацев в документе можно использовать коллекцию Paragraphs объекта
Document, представляющую набор абзацев данного документа. Добавить новый абзац
можно с помощью метода Add этой коллекции:
App.ActiveDocument.Paragraphs.Add;
Для вставки собственно текста в документ, тем не менее, применяется не объект
Paragraph, а объект Range, представляющий любую непрерывную часть документа
(в том числе и вновь созданный абзац). Этот объект может быть создан разными
способами. Например, можно указать начальный и конечный символы диапазона (если
таковые имеются в документе):
var Rng : Variant; ... Rng := App.ActiveDocument.Range(2,4); //со 2-го по 4-й символы
или указать номер абзаца (например, только что созданного):
Rng:= App.ActiveDocument.Paragraphs.Item(1).Range;
или указать несколько абзацев, следующих подряд:
Rng := App.ActiveDocument.Range _ (App.ActiveDocument.Paragraphs.Item(3).Range.Start,_ App.ActiveDocument.Paragraphs.Item(5).Range.End)
Вставить текст можно с помощью методов объекта Range InsertBefore (перед диапазоном)
или InsertAfter (после диапазона), например:
Rng.InsertAfter(‘Это вставляемый текст’);
Помимо объекта Range текст можно вставлять с помощью объекта Selection, являющийся
свойством объекта Word.Application и представляющий собой выделенную часть документа
(этот объект создается, если пользователь выделяет часть документа с помощью
мыши, и может быть также создан с помощью приложения-контроллера). Сам объект
Selection можно создать, применив метод Select к объекту Range, например:
var Sel : Variant; ... App.ActiveDocument.Paragraphs.Item(3).Range.Select;
В приведенном выше примере в текущем документе выделяется третий абзац.
Если мы хотим вставить строку текста в документ либо вместо выделенного фрагмента
текста, либо перед ним, это можно сделать с помощью следующего фрагмента кода:
var Sel : Variant; ... Sel := App.Selection; Sel.TypeText(‘Это текст, которым мы заменим _ выделенный фрагмент’);
Отметим, что если свойство Options.ReplaceSelection объекта Word.Application
равно True, выделенный текст будет заменен на новый текст (этот режим действует
по умолчанию); если же нужно, чтобы текст был вставлен перед выделенным фрагментом,
а не вместо него, следует установить это свойство равным False:
App.Options.ReplaceSelection := False;
Символ конца абзаца при использовании объекта Selection может быть вставлен
с помощью следующего фрагмента кода:
Sel.TypeParagraph;
К объекту Selection, так же как и к объекту Range, можно применить методы InsertBefore
и InsertAfter. В этом случае, в отличие от предыдущего, вставляемый текст станет
частью выделенного фрагмента текста.
С помощью объекта Selection, используя его свойство Font и свойства объекта
Font, такие как Bold, Italic, Size,…, можно отформатировать текст. Например,
таким образом можно вставить строку, выделенную жирным шрифтом:
Sel.Font.Bold := True; Sel.TypeText(‘Это текст, который мы выделим _ жирным шрифтом.’); Sel.Font.Bold := False; Sel.TypeParagraph;
Для наложения на вставляемый текст определенного заранее стиля можно использовать
свойство Style этого же объекта, например:
Sel.Style := ‘Heading 1’; Sel.TypeText(‘Это текст, который станет _ заголовком’); Sel.TypeParagraph;
Нередко документы Word содержат данные других приложений. Простейший способ
вставить такие данные в документ — использовать метод Paste объекта Range:
Var Rng : Variant; ... Rng := App.Selection.Range; Rng.Collapse(wdCollapseEnd); Rng.Paste;
Естественно, в этом случае в буфере обмена уже должны содержаться вставляемые
данные.
Если нужно поместить в буфер обмена часть документа Word, это можно сделать
с помощью метода Copy объекта Range:
Var Rng : Variant; ... Rng := App.Selection.Range; Rng.Copy;
Следующее, чему нужно научиться — перемещению курсора в нужное место текста,
чем мы и займемся в следующем разделе.
|
Перемещение курсора по тексту
Используя метод Collapse, можно «сжать» объект Range или объект Selection,
сократив его размер до нуля символов:
Rng.Collapse(wdCollapseEnd);
Параметр этого метода указывает, в начале или в конце исходного фрагмента окажется
новый объект Range или Selection. Если вы используете позднее связывание и ваше
средство разработки — не Visual Basic, нужно определить в приложении соответствующие
константы:
const wdCollapseStart = $00000001; //новый объект находится в начале фрагмента wdCollapseEnd = $00000000; //новый объект находится в конце фрагмента
Перемещать курсор по тексту можно с помощью метода Move объектов Range и Selection.
Этот метод имеет два параметра. Первый указывает на то, в каких единицах измеряется
перемещение — в символах (по умолчанию), словах, предложениях, абзацах и др.
Второй параметр указывает, на сколько единиц при этом нужно переместиться (это
число может быть и отрицательным; по умолчанию оно равно 1). Например, следующий
фрагмент кода:
Rng.Move;
приведет к перемещению курсора на один символ вперед, а
Rng.Move(wdParagraph,3);
приведет к перемещению курсора на три абзаца вперед. Отметим, что этот метод
использует следующие константы:
const //Единицей перемещения является: wdCharacter = $00000001; //символ wdWord = $00000002; //слово wdSentence = $00000003; //предложение wdParagraph = $00000004; //абзац wdStory = $00000006; //часть документа //напр., колонтитул, //оглавление и др.) wdSection = $00000008; //раздел wdColumn = $00000009; //колонка таблицы wdRow = $0000000A; //строка таблицы wdCell = $0000000C; //ячейка таблицы wdTable = $0000000F; //таблица
Нередко для перемещения по тексту используются закладки. Создать закладку в
текущей позиции курсора можно путем добавления члена коллекции Bookmarks объекта
Document c помощью метода Add, указав имя закладки в качестве параметра, например:
App.ActiveDocument.Bookmarks.Add(‘MyBookmark’);
Проверить существование закладки в документе можно с помощью метода Exists,
а переместиться на нее — с помощью метода Goto объектов Document, Range
или Selection:
Rng := App.ActiveDocument.Goto(wdGoToBookmark, wdGoToNext, ,‘MyBookmark’); Rng.InsertAfter(‘Текст, вставленный после закладки’);
Значения констант для этого примера таковы:
const
wdGoToBookmark = $FFFFFFFF; //перейти к закладке wdGoToNext = $00000002; //искать следующий объект в тексте
Отметим, что с помощью метода Goto можно перемещаться не только на указанную
закладку, но и на другие объекты (рисунки, грамматические ошибки и др.), и направление
перемещения тоже может быть различным. Поэтому список констант, которые могут
быть использованы в качестве параметров данного метода, довольно велик.
|
Создание таблиц
Создавать таблицы можно двумя способами. Первый заключается в вызове метода
Add коллекции Tables объекта Document и последовательном заполнении ячеек данными.
Этот способ при позднем связывании работает довольно медленно.
Второй способ, намного более «быстрый», заключается в создании текста из нескольких
строк, содержащих подстроки с разделителями (в качестве разделителя можно использовать
любой или почти любой символ, нужно только, чтобы он заведомо не встречался
в данных, которые будут помещены в будущую таблицу), и последующей конвертации
такого текста в таблицу с помощью метода ConvertToTable объекта Range. Ниже
приведен пример создания таблицы из трех строк и трех столбцов этим способом
(в качеcтве разделителя, являющегося первым параметром метода ConvertToTable,
используется запятая):
Var Rng : Variant; ... Rng := App.Selection.Range; Rng.Collapse(wdCollapseEnd); Rng.InsertAfter(‘1, 2, 3’); Rng.InsertParagraphAfter; Rng.InsertAfter(‘4,5,6’); Rng.InsertParagraphAfter; Rng.InsertAfter(‘7,8,9’); Rng.InsertParagraphAfter; Rng.ConvertToTable(‘,’);
Отметим, что внешний вид таблицы можно изменить с помощью свойства Format,
а также с помощью свойств коллекции Columns, представляющей колонки таблицы,
и коллекции Rows, представляющей строки таблицы объекта Table.
|
Обращение к свойствам документа
Свойства документа можно получить с помощью коллекции BuiltInDocumentProperties
объекта Document, например:
Memo1.Lines.Add(‘Название — ‘ + _ App.ActiveDocument.BuiltInDocumentProperties [wdPropertyTitle].Value); Memo1.Lines.Add(‘Автор — ‘ + _ App.ActiveDocument.BuiltInDocumentProperties [wdPropertyAuthor]. _ Value); Memo1.Lines.Add(‘Шаблон — ‘ + _ App.ActiveDocument.BuiltInDocumentProperties [wdPropertyTemplate]. _Value)
Константы, необходимые для обращения к свойствам документа по имени, приведены
в листинге 3.
Итак, в данном разделе мы изучили основные операции, которые наиболее часто
применяются при автоматизации Microsoft Word. Естественно, возможности автоматизации
Word далеко не исчерпываются приведенными примерами, однако я надеюсь, что,
руководствуясь основными принципами создания контроллеров Word, изложенными
в данной статье, и соответствующим справочным файлом, вы сможете ими воспользоваться —
мы с вами уже убедились, что это вовсе не так сложно.
Следующим приложением Microsoft Office, автоматизацию которого мы рассмотрим,
будет Microsoft Excel — второе по популярности приложение Microsoft Office.
|
Автоматизация Microsoft Excel
В данном разделе мы обсудим наиболее часто встречающиеся задачи, связанные
с автоматизацией Microsoft Excel. Но перед этим рассмотрим, каковы программные
идентификаторы основных объектов Microsoft Excel и что представляет собой его
объектная модель.
|
Программные идентификаторы и объектная модель Microsoft Excel
Существует три типа объектов Excel, которые могут быть созданы непосредственно
с помощью приложения-контроллера. Эти объекты и соответствующие им программные
идентификаторы перечислены ниже.
Все остальные объекты Excel являются так называемыми внутренними объектами.
Небольшой фрагмент объектной модели Microsoft Excel изображен на рис.2:
Основным в объектной модели Excel является объект Application, содержащий коллекцию
Workbooks объектов типа WorkBook. Каждый объект типа WorkBook содержит коллекцию
WorkSheets-объектов типа WorkSheet, Charts типа Chart и др. Манипуляция рабочими
книгами, их листами, ячейками, диаграммами реально осуществляется путем обращения
к свойствам и методам этих объектов.
Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией
Microsoft Excel. Если вам встретилась задача, не совпадающая ни с одной из перечисленных,
вы можете попытаться найти подходящий пример на Visual Basic в справочном файле
VBAXL9.CHM, либо, как и в случае Microsoft Word, записать соответствующий макрос
и проанализировать его код.
|
Запуск Microsoft Excel, создание и открытие рабочих книг
Для создания примеров использования Microsoft Excel можно использовать код
создания контроллера, приведенный в разделе «Общие принципы создания контроллеров
автоматизации», заменив первый оператор в приведенном примере на следующий:
AppProgID := ‘Excel.Application’;
и заменить комментарии кодом, манипулирующим свойствами и методами объекта
Excel.Application. Отметим, однако, что подключение контроллера автоматизации
к имеющейся версии Excel с помощью метода GetActiveOleObject может привести
к тому, что вся клиентская часть Excel окажется невидимой (это происходит, если
имеющаяся копия Excel запущена в режиме, когда ее пользовательский интерфейс
недоступен). Причины подобного поведения автору неизвестны. Поэтому, если существует
вероятность возникновения подобной ситуации, лучше упростить код создания контроллера
и всегда создавать новую копию Excel.
Изучение создания контроллеров Excel мы начнем с создания и открытия рабочих
книг.
Создать новую рабочую книгу Excel можно, используя метод Add коллекции Workbooks
объекта Application:
App.WorkBooks.Add;
Для создания рабочей книги на основе шаблона следует указать его имя в качестве
первого параметра метода Add:
App.WorkBooks.Add(‘C:Program FilesMicrosoft _ OfficeTemplates1033invoice.xlt’);
В качестве первого параметра этого метода можно также использовать следующие
константы:
const xlWBATChart = $FFFFEFF3; //рабочая книга состоит из листа с диаграммой xlWBATWorksheet = $FFFFEFB9; //рабочая книга состоит из листа с данными
В этом случае рабочая книга будет содержать один лист типа, заданного указанной
константой (график, обычный лист с данными и др.)
Для открытия уже существующего документа следует воспользоваться методом Open
коллекции WorkBooks:
App.Documents.Open(‘C:MyExcelFile.xls’);
Отметим, что свойство ActiveWorkBook объекта Excel.Application указывает на
текущую активную рабочую книгу среди одной или нескольких открытых. Помимо этого
к рабочей книге можно обращаться по ее порядковому номеру, например ко второй
открытой рабочей книге можно обратиться так:
App.WorkBooks[2]
Обратите внимание на то, что в Delphi при использовании позднего связывания
синтаксис, используемый для обращения к членам коллекций объектов Excel, отличен
от синтаксиса, используемого для обращения к объектам Word — в случае Word
мы использовали метод Item, а в случае Excel мы обращаемся к членам коллекции
как к элементам массива. Если же вы используете Visual Basic, синтаксис, применяемый
для обращения к членам коллекций, будет одинаков для всех коллекций Microsoft
Office.
Сделать рабочую книгу активной можно с помощью метода Activate:
App.WorkBooks[2].Activate;
Следующее, чему следует научиться — это сохранять рабочие книги в файлах.
|
Сохранение, печать и закрытие рабочих книг Microsoft Excel
Закрытие документа может быть осуществлено с помощью метода Close:
App.WorkBooks[2].Close;
или
App.ActiveWorkBook.Close;
Метод Close имеет несколько необязательных (в случае позднего связывания) параметров,
влияющих на правила сохранения рабочей книги. Первый из параметров принимает
значения True или False и влияет на то, сохранять ли изменения, внесенные в
рабочую книгу. Второй параметр (типа Variant) — имя файла, в котором нужно
сохранить рабочую книгу (если в нее были внесены изменения). Третий параметр,
также принимающий значения True или False, влияет на то, следует ли пересылать
документ следующему пользователю по электронной почте, и может быть проигнорирован,
если эта функциональность не используется.
App.ActiveWorkBook.Close(True,’C:MyWorkBook.xls’);
Просто сохранить рабочую книгу, не закрывая ее, можно с помощью методов Save
или SaveAs:
App.ActiveWorkBook.Save;
или
App.ActiveWorkBook.SaveAs(‘C:MyWorkBook.xls’);
Метод SaveAs имеет более десятка параметров, влияющих на то, как именно сохраняется
документ (под каким именем, с паролем или без него, какова кодовая страница
для содержащегося в ней текста и др.).
Закрыть сам Excel можно с помощью метода Quit объекта Excel.Application. В
случае Excel этот метод параметров не имеет.
Вывод документа Excel на устройство печати можно осуществить с помощью метода
PrintOut объекта WorkBook, например:
App.ActiveWorkBook.PrintOut;
Если нужно изменить параметры печати, следует указать значения соответствующих
параметров метода PrintOut (в случае Excel их восемь).
|
Обращение к листам и ячейкам
Обращение к листам рабочей книги производится с помощью коллекции WorkSheets
объекта WorkBook. Каждый член этой коллекции представляет собой объект WorkSheet.
К члену этой коллекции можно обратиться по его порядковому номеру, например:
App.WorkBooks[1].WorkSheets[1].Name := _ ‘Страница 1’;
Приведенный выше пример иллюстрирует, как можно изменить имя листа рабочей
книги.
К листу рабочей книги можно обратиться и по имени, например:
App.WorkBooks[1].WorkSheets[‘Sheet1’].Name := _ ‘Страница 1’;
Обращение к отдельным ячейкам листа производится с помощью коллекции Cells
объекта WorkSheet. Например, добавить данные в ячейку B1 можно следующим образом:
App.WorkBooks[1].WorkSheets[‘Sheet1’].Cells[1,2].Value:=’25’;
Здесь первая из координат ячейки указывает на номер строки, вторая — на
номер столбца.
Добавление формул в ячейки производится аналогичным способом:
App.WorkBooks[1].WorkSheets[‘Sheet1’] _ .Cells[3,2].Value := ‘ =SUM(B1:B2)’;
Очистить ячейку можно с помощью метода ClearContents.
Форматирование текста в ячейках производится с помощью свойств Font и Interior
объекта Cell и их подсвойств. Например, следующий фрагмент кода выводит текст
в ячейке красным жирным шрифтом Courier кегля 16 на желтом фоне:
App.WorkBooks[1].WorkSheets[1].Cells[3,2].Interior _ .Color := clYellow; App.WorkBooks[1].WorkSheets[1].Cells[3,2].Font _ .Color := clRed; App.WorkBooks[1].WorkSheets[1].Cells[3,2] _ .Font.Name := ‘Courier’; App.WorkBooks[1].WorkSheets[1].Cells[3,2] _ .Font.Size := 16; App.WorkBooks[1].WorkSheets[1].Cells[3,2] _ .Font.Bold := True;
Объект |
Программный идентификатор |
Комментарий |
---|---|---|
Application |
Excel.Application, Excel.Application.9 |
С помощью этого программного идентификатора создается экземпляр приложения |
WorkBook |
Excel.AddIn |
С помощью этого программного идентификатора создается экземпляр расширения |
Excel.Chart, Excel.Chart.8 |
Рабочая книга, созданная с помощью этих программных идентификаторов, |
|
Excel.Sheet, Excel.Sheet.8 |
Рабочая книга, созданная с помощью этих программных идентификаторов, |
Вместо свойства Color можно использовать свойство ColorIndex, принимающее значения
от 1 до 56; таблицу соответствий значений этого свойства реальным цветам можно
найти в справочном файле VBAXL9.CHM.
Обратиться к текущей ячейке можно с помощью свойства ActiveCell объекта Excel.Application,
а узнать местоположение ячейки можно с помощью свойства Address объекта Cell,
например:
ShowMessage(App.ActiveCell.Address);
Помимо обращения к отдельным ячейкам, можно манипулировать прямоугольными областями
ячеек с помощью объекта Range, например:
App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’] _ .Value := ‘Test’; App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’] _ .Font.Color := clRed;
Приведенный выше код приводит к заполнению прямоугольного участка текстом и
к изменению цвета шрифта ячеек.
Объект Range также часто используется для копирования прямоугольных областей
через буфер обмена. Ниже приведен пример, иллюстрирующий копирование такой области:
App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’].Copy; App.WorkBooks[1].WorkSheets[2].Range[‘A11:C15’].Select; App.WorkBooks[1].WorkSheets[2].Paste;
Обратите внимание на то, что диапазон, куда копируются данные, предварительно
выделяется с помощью метода Select.
Отметим, что примерно таким же образом можно копировать данные и из других
приложений (например, из Microsoft Word).
Довольно часто при автоматизации Excel используются его возможности, связанные
с построением диаграмм. Ниже мы рассмотрим, как это сделать.
|
Создание диаграмм
Диаграммам Excel соответствует объект Chart, который может располагаться как
на отдельном листе, так и на листе с данными. Если объект Chart располагается
на листе с данными, ему соответствует член коллекции ChartObjects объекта WorkSheet
и создание диаграммы нужно начать с добавления элемента в эту колекцию:
Ch:=App.WorkBooks[1].WorkSheets[2].ChartObjects.Add(10,50,400,400);
Параметрами этого метода являются координаты левого верхнего угла и размеры
диаграммы в пунктах (1/72 дюйма).
Если же диаграмма располагается на отдельном листе (не предназначенном для
хранения данных), то создание диаграммы нужно начать с добавления элемента в
коллекцию Sheets объекта Application (которая отличается от коллекции WorkSheets
тем, что содержит листы всех типов, а не только листы с данными):
App.WorkBooks[1].Sheets.Add(,,1,xlWBATChart);
В этом случае первый параметр метода Add указывает порядковый номер листа,
перед которым нужно поместить данный лист (или данные листы, если их несколько),
второй параметр — порядковый номер листа, после которого нужно поместить данный
лист (используется обычно один из них), третий параметр — сколько нужно
создать листов, а четвертый — какого типа должен быть лист. Значения четвертого
параметра совпадают со значениями первого параметра метода Add коллекции WorkBooks
объекта Application, и при использовании имен соответствующих констант следует
определить их в приложении-контроллере.
Простейший способ создать диаграмму, с точки зрения пользователя, — создать
ее с помощью соответствующего эксперта на основе прямоугольной области с данными.
Точно так же можно создать диаграмму и с помощью контроллера автоматизации —
для этой цели у объекта Chart, являющегося свойством объекта ChartObject (члена
коллекции ChartObjects), имеется метод ChartWizard. Первым параметром этого
метода является объект Range, содержащий диапазон ячеек для построения диаграммы,
а вторым — числовой параметр, указывающий, какого типа должна быть эта
диаграмма:
Var Ch: Variant; … Ch.Chart.ChartWizard _ (App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’], _ xl3DColumn);
Возможные значения параметра, отвечающего за тип диаграммы, можно найти в справочном
файле.
У объекта Chart имеется множество свойств, отвечающих за внешний вид диаграммы,
с помощью которых можно изменить ее точно так же, как пользователи делают это
вручную. Ниже приводится пример создания заголовка диаграммы и подписей вдоль
ее осей (отметим, что оси есть не у всех типов диаграмм).
Ch.Chart.HasTitle :=1; Ch.Chart.HasLegend := False; Ch.Chart.ChartTitle.Text := _ ‘Пример диаграммы Excel ‘; Ch.Chart.Axes(1).HasTitle := True; Ch.Chart.Axes(1).AxisTitle.Text := _ ‘Подпись вдоль оси абсцисс’; Ch.Chart.Axes(2).HasTitle := True; Ch.Chart.Axes(2).AxisTitle.Text := _ ‘Подпись вдоль оси ординат’;
Еще один способ создания диаграммы — определить все ее параметры с помощью
свойств объекта Chart, включая и определение серий, на основе которых она должна
быть построена. Данные для серии обычно находится в объекте Range, содержащем
строку или столбец данных, а добавление серии к диаграмме производится путем
добавления члена к коллекции SeriesCollection, например:
App.WorkBooks[1].Sheets.Add(,,1,xlWBATChart); App.WorkBooks[1].Sheets[1].ChartType := xl3DPie; Rng:=App.WorkBooks[1].WorkSheets[2].Range[‘B1:B5’]; App.WorkBooks[1].Sheets[1].SeriesCollection.Add(Rng);
В данном примере к диаграмме, созданной на отдельном листе, специально предназначенном
для диаграмм, добавляется одна серия на основе диапазона ячеек другого листа.
Мы изучили основные операции, применяемые при автоматизации Microsoft Excel.
Описания некоторых аналогичных операций для Microsoft Word, например обращение
к свойствам документов, были здесь опущены во избежание повторов. Возможности
автоматизации Microsoft Excel и Word далеко не исчерпываются приведенными примерами.
Сведения о них можно всегда найти в соответствующем справочном файле.
В следующих статьях данного цикла будет рассмотрена автоматизация других приложений
Microsoft Office — Microsoft PowerPoint, Microsoft Access, Microsoft Outlook
и др.
КомпьютерПресс 11’2000
Доброго всем времени суток!!!
Я этот вопрос задавала в форуме по Windows, и там мне посоветовали обратиться сюда…
Суть в том, что….
у меня есть файл Excel с набором макросов, мне нужно запустить их так, чтобы на экране пользователя ничего не отображалось.
Соответственно, я создаю Ole-объект, вызываю его метод Run и запускаю макрос.
В зависимости от того, какая версия Excel’я установлена на компьютере пользователя, открываются разные файлы.
А если на компьютере пользователя установлены MS Excel нескольких версий (например, 97 и 2000), то открываю тот файл, версия которого указана пользователем.
Я думала, что все просто, достаточно вызвать CreateOleObject(‘Excel.Application.8’) для создания Excel.Application 97.
В принципе все работало нормально, но когда я установила Excel 2000, в реестре появился объект Excel.Appliaction.9 и его CLSID прописался в Excel.Application.8 (точнее, насколько я поняла из поставленных мной опытов, у всех версий Excel CLSID совпадают!!! и запускается тот, который был установлен последним!!!!). И теперь, хоть я и пишу CreateOleObject(‘Excel.Application.8’), запускается 2000 Excel, а мне нужен именно 97.
Объясните, пожалуйста, как работают все эти серверы автоматизации?? и что мне делать в таком случае??
1
Сервера автоматизации Доступ к COM серверам Microsoft Office :00:221
2
Приложения и объекты MS Office Office – это среда, в которой большинство задач можно решать без какого — либо программирования. Но вся ценность приложений Office для разработчика заключается в том, что все, что можно сделать руками, можно сделать программным путем с использованием средств VBA (Visual Basic for Application). Кроме того, приложения Office поставляют сервера COM, которые предоставляют интерфейс доступа к приложению и его объектам. Благодаря этому, разработчик в среде Delphi имеет возможность, создав контроллер автоматизации, управлять сервером. Приложение MSOffice рассматривается как совокупность объектов со своими методами, свойствами, событиями, которые обеспечивают скелет приложения. Программист Office является не создателем приложения, как, например это делается в Delphi, а он принимает участие в создании системы документов. Таким образом, ДОКУМЕНТ, а не программа являются целью разработки :00:222
3
Объектная модель приложений MS Office Имея объектную структуру, приложение ms office обладает всеми чертами объектной модели. То есть, в объектной модели office существует и наследование, и встраивание классов. Как всегда, существует некий базовый, прародительский объект, который является » отцом » всех встраиваемых объектов. Такой объект называется application. Схема показывает упрощенную иерархию таких объектов. Всегда существует задающий приложение корневой объект, он всегда называется Application. Каждое приложение Office имеет свой собственный корневой объект – Word.Application, Excel.Application. Outlook приложение само является корневым объектом, несмотря на это в объект Application встраиваются все остальные объекты ( участники ), которые являются свойствами главного объекта. Участником могут быть свои участники и так далее. В документе методов очень много, причем самых разных, но имеются и одинаковые методы в различных приложениях Office. Среди таковых – Run, Quit, Activate; но даже и они в разных приложениях имеют различный набор параметров, а зачастую выполняют не адекватные действия :00:223
4
Объектная модель приложений MS Office :00:224
5
Объектная модель документа Word :00:225
6
Объекты Application Фундаментальным объектом любого приложения является Application. Рассмотрим сценарий взаимодействия через сервера автоматизации : :00:226 1)Создаем новый проект 2)На главную форму выкладываем компоненту с закладки Servers, которая называется WordApplication 3)Устанавливаем свойства компоненты AutoConnect и AutoQuit в True 4)Запускаем приложение на выполнение. приложение
7
Доступ к объекту Application Казалось бы, ничего не произошло, запустилась форма и отобразилась на экране, на самом деле наше приложение запустило сервер автоматизации Microsoft Word, этот факт можно обнаружить, запустив на выполнение Task Manager и выбрав закладку Processes. Среди прочих процессов мы обнаруживаем WINWORD.EXE. На самом деле была приложением проделана следующая работа : При создании формы, в системном реестре, по идентификатору CLSID был найден сервер Word.Application Запущено на выполнение приложение, находящееся по адресу в реестре (ProgID) Сервер предоставил нашему приложению, которое и является контроллером автоматизации интерфейс, через который мы и получим доступ к объекту Application. Интерфейс Idispatch унаследован от Iunknown, который в свою очередь имеет три метода, один из которых _ADDRef умеет считать количество клиентов, в настоящий момент использующих сервер. Как только от сервера отсоединиться последний клиент, он автоматически будет выгружен из памяти компьютера :00:227
8
Технология OLE Automation ( автоматизация OLE). Сервер автоматизации представляет собой программу, которая может управляться внешней программой контроллером автоматизации. Сервером в данном случае является Word или Excel, а контроллер разрабатывается программистом. Отличие технолгии OLE Automation в том, что она позволяет использовать возможности СОМ не только языкам — компиляторам, но и интерпретаторам, и обеспечивает связь с вызываемыми методами на стадии выполнения приложения. Такой способ вызова называется поздним связыванием. Методы при таком способе вызова выполняются медленнее, причем заранее нельзя проверить правильность написания объектов и их методов. Преимуществом такого метода является независимость выбора среды разработки от объекта, который нужно программировать. Среда Delphi поддерживает вызовы методов серверов автоматизации. Для этого используются переменные типа Variant, которые содержат ссылки на объекты автоматизации. На этапе выполнения программы серверу автоматизации передается команда в виде строки, предварительно записанной в переменную типа Variant :00:228
9
var wd: OleVariant; fileName: string; begin try fileName := ExtractFilePath(Application.EXEName) + ‘report.DOC’; //Создаем объект интерфейса для доступа к серверу COM wd := CreateOleObject(‘Word.Application’); //Проверка наличия методов и правильность передачи параметров //будет осуществляться на стадии выполнения приложения wd.application.documents.add; wd.application.activedocument.range.insertAfter(now); wd.application.activedocument.saveas(fileName); //выгружаем сервер из памяти компьютера wd.application.quit(true, 0); Except End; :00:229 Доступ к объекту Application Пример 2
10
Интерфейс IDispatch Интерфейс IDispatch описывается в модуле System следующим образом: type IDispatch = interface(IUnknown) [‘{ C }’] function GetTypeInfoCount(out Count: Integer): Integer; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): Integer; stdcall; function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID; Integer; DispIDs: Pointer): Integer; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): Integer; end; :00:2210
11
Центральным элементом технологии OLE Automation является интерфейс IDispatch. Ключевыми методами этого интерфейса являются методы GetIdsOfNames и Invoke, которые позволяют клиенту запросить у сервера, поддерживает ли он метод с указанным именем, а затем, если метод поддерживается – вызвать его. Когда клиенту требуется вызвать метод, он вызывает GetIdsOfNames, передавая ему имя запрошенного метода. Если сервер поддерживает такой метод, он возвращает его идентификатор – целое число, уникальное для каждого метода. После этого клиент упаковывает параметры в массив переменных типа OleVariant и вызывает Invoke, передавая ему массив параметров и идентификатор метода. Таким образом, все, что должен знать клиент – это строковое имя метода. Такой алгоритм позволяет работать с наследниками IDispatch из скриптовых языков. Методы GetTypeInfo и GetTypeInfoCount являются вспомогательными и обеспечивают поддержку библиотеки типов объекта. Реализация методов GetIdsOfNames и Invoke, предоставляемая COM по умолчанию базируется на библиотеке типов объекта :00:2211 Интерфейс IDispatch
12
Dispinterface Dispinterface Dispinterface – это декларация методов, доступных через интерфейс IDispatch. Объявляется он следующим образом: type IMyDisp = dispinterface [‘{EE05DFE D0-9EA9-0020AF3D82DA}’] property Count: Integer dispid 1 procedure Clear dispid 2; end; Самих методов может физически и не существовать (например, они реализуются динамически в Invoke) :00:2212
13
Пример DispInterface Рассмотрим использование dispinterface на простом примере. Объявим диспинтерфейс объекта InternetExplorer и используем его в своей программе:программе type IIE = dispinterface [‘{0002DF C }’] property Visible: WordBool dispid 402; end; procedure TForm1.Button1Click(Sender: TObject); var II: IIE; begin II := CreateOleObject(‘InternetExplorer.Application’) as IIE; II.Visible := TRUE; end; Эта программа успешно компилируется и работает, несмотря на то, что в интерфейсе объявлено только одно из множества имеющихся свойств и методов. Это возможно благодаря тому, что Delphi не вызывает методы диспинтерфейса напрямую и, поэтому, не требует полного описания всех методов в правильном порядке :00:2213
14
Dual интерфейс Идея двойных интерфейсов очень проста. Сервер реализует одновременно некоторый интерфейс, оформленный по стандартам COM (VTable) и диспинтерфейс, доступный через IDispatch. При этом интерфейс VTable должен быть унаследован от IDispatch и иметь идентичный с диспинтерфейсом набор методов. Такое оформление сервера позволяет клиентам работать с ним наиболее удобным для каждого клиента образом. Клиенты, использующие VTable вызывают методы интерфейса напрямую, а клиенты, использубщие позднее связывание – через методы IDispatch. Большинство OLE- серверов реализуют двойной интерфейс. Технология Automation, ранее известная как OLE Automation, дает совершенно другой способ вызова клиентом методов, экспонируемых сервером, чем тот стандартный для СОМ способ, который мы уже рассмотрели. Automation же использует стандартный СОМ — интерфейс IDispatch для доступа к интерфейсам. Поэтому говорят, что любой объект, поддерживающий IDispatch, реализует Automation. Также говорят о дуальном интерфейсе, имея в виду, что он может быть вызван как с помощью естественного способа (vtable), так и с помощью вычурного способа Automation :00:2214
15
Базовый класс TOLEServer На закладке Service находится набор компонент для доступа к серверам автоматизации, не все компоненты возвращают ссылку на объект Application, то есть могут быть получены интерфейсы для доступа к вложенным объектам, таким как Документ Word или рабочая книга Excel. Все компоненты унаследованы от класса TOLEServer, который наследует свойства класса Tcomponent. TOLEServer является базовым классом всех COM серверов. Кроме этого этот класс имеет еще несколько свойств и методов для управления связью с COM сервером. Среди таковых уже знакомое нам свойство AutoConnect, которое автоматически запускает COM сервер и производит извлечение из него интерфейса, обеспечивающего связь с контроллером. Еще одно важное свойство класса TOLEServer – ConnectKind – указывающее тип процесса, к которому устанавливается связь. Свойство используется методом Connect, который вызывается автоматически, если свойство AutoConnect истинно :00:2215
16
Значения свойства ConnectKind ckRunningOrNew. Контроллер производит подключение к уже существующему процессу, или запускает новый процесс, при отсутствии такового. Этот вид взаимодействия между COM сервером и контроллером наиболее часто применяется на практике. Такое значение свойства установлено по умолчанию. ckNewInstance. При соединении с сервером каждый раз создается новый экземпляр ckRunningInstance. Соединение устанавливается с уже запущенным COM сервером. Если таковой отсутствует – будет создан соответствующий объект ошибки, который необходимо обработать ckRemote. Это значение используется совместно со свойством RemoteMachineName, если необходимо подключиться к серверу на удаленной машине ckAttachToInterface. При установке этого значения интерфейс не создается и соответственно нельзя указывать значение True для свойства AutoConnect. Соединение с сервером производится с помощью метода ConnectTo :00:2216
17
Подключение к существующему интерфейсу При необходимости подключения к проекту таких компонентов, как WordDocument или WordParagraphFormat производится подключение к уже существующему интерфейсу не создавая его заново. Также это может быть необходимо, когда контроллер должен отслеживать события, происходящие в COM сервере :00:2217
18
procedure TForm1.WordApplication1DocumentChange(Sender: TObject); begin //производим подключение к текущему документу WordDocument1.ConnectTo( WordApplication1.ActiveDocument); //Контроллер добавляет новую строку в текущий документ WordDocument1.Range.InsertAfter(#13+’Переход к документу’+#13+ WordApplication1.ActiveDocument.Get_FullName+’ произведен :’+ DateTimeToStr(Now)); end; procedure TForm1.FormCreate(Sender: TObject); begin //COM сервер отображает себя на экране WordApplication1.Visible:=true; end; :00:2218 Подключение к существующему интерфейсу Пример 3
19
Классы – наследники ToleObject TOleServer = class(TComponent, IUnknown) TWordApplication = class(TOleServer) Благодаря такому объявлению, класс TwordApplication наследует свойства и методы класса Tcomponent ( способен устанавливаться на палитре компонент и прочие …), а так же знает все о доступе к интерфейсам COM серверов, благодаря наследованию интерфейса IUNknown. В библиотеке типов прописаны все доступные методы и свойсва COM сервера. Когда создается контроллер автоматизации, то приложение получает доступ к Dual Interface описанный в библиотеке типов. Dual интерфейс – есть совокупность пользовательского интерфейса, описанного в библиотеке типов и dispinterface, который доступен в момент выполнения приложения. Это реализовано с помощью COM VTABLE интерфейса, унаследованного от IDISPATCH. Использование Vtable интерфейса имеет ряд преимуществ : 1) Передаваемые параметры, их типы и количество проверяется на стадии проектирования и редактор кода сопровождает разработчика всевозможными хинтами и подсказками. 2) Через Vtable интерфейс осуществляется значительно более быстрый доступ к серверу автоматизации, чем через DispInterface В то же время, не всегда разработчик получает доступ к библиотеке типов и соответственно к V – таблице, поэтому приходится иногда пользоваться Idispatch интерфейсом :00:2219
20
:00:2220 ДОСТУП К ФУНКЦИЯМ MS EXCEL
21
Тестовый проект :00:2221
22
Позднее связывание (OLE) procedure TMainForm.BtExcelOLEClick(Sender: TObject); Var i,j : integer; ExcelApplication:Variant; begin Application.Minimize; try ExcelApplication:=CreateOleObject(‘Excel.Application’); ExcelApplication.visible:=true; ExcelApplication.WorkBooks.Add; except ShowMessage(‘ Ошибка инициализации Excel’); exit; end; for i:=0 to SG.ColCount-1 do for j:=0 to SG.RowCount-1 do ExcelApplication.Cells[j+1,i+1].value:=SG.Cells[i,j]; Application.Restore; ShowMessage(‘ Экспорт завершен ‘); end; :00:2222
23
Связывание через Dual интерфейс procedure TMainForm.BtExcelServersClick(Sender: TObject); var WorkBk : _WorkBook; // определяем WorkBook WorkSheet : _WorkSheet; // определяем WorkSheet i,j : integer; begin XLApp.Connect; // Добавляем WorkBooks в ExcelApplication XLApp.WorkBooks.Add(xlWBatWorkSheet,0); // Выбираем первую WorkBook WorkBk := XLApp.WorkBooks.Item[1]; // Определяем первый WorkSheet WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet; for i:=0 to SG.ColCount-1 do for j:=0 to SG.RowCount-1 do Worksheet.Cells.Item[j+1,i+1].value:=SG.Cells[i,j]; XLApp.Visible[1]:=true; Application.Restore; ShowMessage(‘ Экспорт завершен ‘); end; :00:2223
24
Передача массива через Dual интерфейс var WorkBk : _WorkBook; // определяем WorkBook WorkSheet : _WorkSheet; // определяем WorkSheet TabGrid : Variant; i,j,r,c : integer; begin r:=SG.RowCount; c:=SG.RowCount; // Заполняем TabGrid TabGrid := VarArrayCreate([0,(r-1),0,(c-1)],VarOleStr); for i:=0 to SG.ColCount-1 do for j:=0 to SG.RowCount-1 do TabGrid[j,i]:=SG.Cells[i,j]; XLApp.Connect; // Добавляем WorkBooks в ExcelApplication XLApp.WorkBooks.Add(xlWBatWorkSheet,0); // Выбираем первую WorkBook WorkBk := XLApp.WorkBooks.Item[1]; // Определяем первый WorkSheet WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet; Worksheet.Range[‘A1’, Worksheet.Cells.Item[R,C]].Value2 := TabGrid; XLApp.Visible[1]:=true; Application.Restore; ShowMessage(‘ Экспорт завершен ‘); end; :00:2224
25
Заполнение шаблона :00:2225 OleReport: TOleContainer;
26
Текст процедуры заполнения var WorkBk : _WorkBook; WorkSheet : _WorkSheet; TabGrid : Variant; i,j,r,c : integer; Path : string; begin r:=SG.RowCount; c:=SG.RowCount; TabGrid := VarArrayCreate([0,(r-1),0,(c-1)],VarOleStr); for i:=0 to SG.ColCount-1 do for j:=0 to SG.RowCount-1 do TabGrid[j,i]:=SG.Cells[i,j]; Path:=ExtractFilePath(Paramstr(0))+’shablon.xls’; XLApp.Connect; XLApp.Workbooks.Open(Path, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0); WorkBk:=XLApp.ActiveWorkbook; WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet; Worksheet.Range[‘B3’, ‘F7′].Value2 := TabGrid; path:=ExtractFilePath(Paramstr(0))+’report.xls’; WorkBk.SaveCopyAs(path,0); WorkBk.Close(false,0,0,0); XLApp.Disconnect; // Разрываем связь с сервером // Отображаем полученный отчет у себя на форме. OleReport.CreateObjectFromFile(path,false); OleReport.Visible:=true; ShowMessage(‘ Экспорт завершен ‘); end; :00:2226