Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Пишем макросы для OpenOffice.org

Макросы используются для автоматизации различных действий в OpenOffice.org. Макрос поможет автоматизировать действия, которые потребовали бы длительных ручных манипуляций с возможными ошибками. В настоящее время автоматизированные действия наиболее легко выполняются написанием макросов на OOo Basic (OpenOffice.org поддерживает и ряд других языков, например, Python). Синтаксис OOo Basic подобен многим разновидностям Basic (Visual Basic, VBA, VBScript и т.д.), и здесь не описывается. Данная статья является введением в мир макросов OpenOffice.org и рассматривает самые общие вопросы, связанные с программированием макросов в OpenOffice.org. Цель статьи - предельно кратко обозначить основные направления в программировании макросов OpenOffice.org для программистов, уже немного знакомых с другими разновидностями Basic.

Hello, World!

Параметры безопасности макросов задаются через меню "Сервис" - "Параметры" - "OpenOffice.org" - "Безопасность", кнопка "Безопасность макросов...".

Откройте новый документ OOo. Используйте меню "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11), чтобы запустить диалог "Макрос OpenOffice.org Basic". В левой части диалога найдите документ, который вы только что открыли (например, он называется "Безымянный1"). Разверните дерево этого документа и установите курсор на дочернем элементе "Standard". Нажмите справа кнопку "Создать" для создания нового модуля и задайте ему имя. Откроется среда разработки OOo Basic. Наберите код макроса:

Sub Main
    MsgBox "Привет, OOo Basic!"
End Sub

Для запуска макроса нажмите клавишу F5 в среде разработки OOo Basic. Естественно, запустить этот макрос можно и в диалоге "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11), кнопкой "Выполнить".

OOo Basic основан на процедурах и функциях, который задаются ключевыми словами Sub и Function. Каждый модуль содержит набор процедур (функций). Библиотека содержит набор модулей. Документ может содержать несколько библиотек. Библиотеки могут существовать также на уровне приложения в целом.

Среда разработки OOo Basic имеет средства отладки, такие, как установка точек прерывания и наблюдаемых переменных. Вы можете также выполнять макросы по шагам.

Исследование объектов

При программировании часто бывает необходимо выяснить, какие свойства и методы поддерживает тот или иной объект, или вообще выяснить, что это за объект, например, просто для того, чтобы найти по нему справку.

Доступ к текущему документу и рабочему столу обеспечивают глобальные переменные ThisComponent и StarDesktop, которые всегда доступны.

Вы можете узнать, поддерживает ли объект конкретный сервис:

If ThisComponent.supportsService("com.sun.star.text.TextDocument") Then
    MsgBox "Это текстовый документ."
End If

Метод объектов getImplementationName() возвращает полное имя данного объекта. Используйте полное имя объекта для поиска в Интернете или в Руководстве разработчика:

MsgBox StarDesktop.getImplementationName()

Метод объектов getSupportedServiceNames() возвращает перечень всех сервисов, поддерживаемых объектом:

For Each s In ThisComponent.getSupportedServiceNames()
    MsgBox s
Next

Простой способ выяснить, что может делать данный объект - это вызов следующих трех методов:

MsgBox ThisComponent.dbg_methods
MsgBox ThisComponent.dbg_supportedInterfaces
MsgBox ThisComponent.dbg_properties

Макрос WritedbgInfo(object), поставляемый с OOo, выводит информацию трёх вышеуказанных методов в окно документа OOo Writer:

WritedbgInfo(ThisComponent)

Некоторые характерные приёмы OOo Basic

Метод CreateUnoService() - это короткий путь вместо вызова global service manager и затем вызова createInstance() для этого менеджера.

oDesk = CreateUnoService("com.sun.star.frame.Desktop")

Приведённый выше вызов заменяет следующие два примера:

oManager = GetProcessServiceManager()
oDesk = oManager.createInstance("com.sun.star.frame.Desktop")
oManager = CreateObject("com.sun.star.ServiceManager")
oDesk = oManager.createInstance("com.sun.star.frame.Desktop")

В языке OOo Basic глобальная переменная ThisComponent ссылается на текущий документ или на документ, из которого был вызван данный макрос. Переменная ThisComponent получает свое значение один раз, когда макрос стартует, и не изменяется, даже если этот макрос делает текущим другой документ. Если активным является компонент другого типа (не документ), то ThisComponent ссылается на последний активный документ. В других языках способом получить этот объект является использование getCurrentComponent() для объекта рабочего стола (desktop object). Глобальная переменная StarDesktop ссылается на объект рабочего стола (desktop object), который является основным приложением OOo.

Если вы написали функцию (но не процедуру) на языке OOo Basic, вы можете вызвать ее из электронной таблицы Calc, как обычную функцию рабочего листа, в формуле ячейки.

Библиотеки и модули

Библиотеки макросов содержатся в следующих контейнерах:

Эти контейнеры вы можете наблюдать в диалоге "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11).

Библиотека содержит модули. Нельзя выполнить макрос, содержащийся в библиотеке, если библиотека еще не загружена. Каждый контейнер как правило имеет библиотеку с именем Standard. Модули содержат процедуры и функции, т.е. собственно макросы.

Модули хранятся в xml-файлах с расширением xba, описания библиотек - в xml-файлах с расширением xlb, описания контейнеров - в xml-файлах с расширением xlc.

Контейнер "Макросы OpenOffice.org" находится в папке, наподобие такой: C:\Program Files\OpenOffice.org 2.3\share\basic. Контейнер "Мои макросы" находится в папке, наподобие такой: C:\Documents and Settings\<имя пользователя>\Application Data\OpenOffice.org2\user\basic.

Новые библиотеки и модули можно создать в любой момент интерактивно, через диалог "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11). В среде разработки OOo Basic текущая библиотека выбирается с помощью специального выпадающего списка на панели инструментов "Макрос" (по умолчанию этот выпадающий список вы увидите в левой верхней части экрана). Модули текущей библиотеки отображаются на вкладках, расположенных в нижней части экрана (каждый модуль на своей вкладке).

Библиотеками можно управлять и программно. Следующая функция создаёт новую библиотеку "dummy", устанавливает на неё пароль, отображает список всех библиотек, затем удаляет библиотеку "dummy" и вновь отображает список всех библиотек:

Sub Libs()
    Dim allLibs(), lb, str
    Const newlib As String = "dummy"
    oLibCont = createUnoService("com.sun.star.script.ApplicationScriptLibraryContainer")

    'создание новой библиотеки
    If (Not oLibCont.hasByName(newlib)) Then
        oLibCont.CreateLibrary(newlib)
    End If
    If (Not oLibCont.isLibraryLoaded(newlib)) Then
        oLibCont.loadLibrary(newlib)
    End If
    'установка пароля на библиотеку
    oLibCont.setLibraryReadOnly(newlib, False)
    oLibCont.changeLibraryPassword(newlib, "", "password")
    MsgBox "Пароль: ""password"" был установлен для библиотеки " & newlib

    'отображение всех библиотек:
    str = ""
    allLibs = oLibCont.getElementNames()
    For Each lb In allLibs()
        str = str & lb & Chr(13)
    Next
    MsgBox str
    
    'удаление библиотеки
    oLibCont.removeLibrary(newlib)
    
    'отображение всех библиотек:
    str = ""
    allLibs = oLibCont.getElementNames()
    For Each lb In allLibs()
        str = str & lb & Chr(13)
    Next
    MsgBox str
End Sub

Когда библиотека загружена, содержащиеся в ней макросы становятся видимыми из OOo Basic. Если библиотека не загружена, вы не можете вызывать процедуры, функции и диалоги, которые в ней содержатся. Библиотека Standard всегда загружена и доступна автоматически.

Запуск макросов

Макросы можно выполнять непосредственно из диалога "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11), кнопкой "Выполнить".

Макросы можно назначить на команды меню и/или кнопки панели инструментов. Меню "Сервис" - "Настройка", вкладки "Меню" и "Панели инструментов". При нажатии на кнопку "Добавить..." открывается окно "Добавить команды". Слева в списке "Категория" вы найдёте иерархию контейнеров с макросами.

Запуск макросов программно

Можно выполнить макрос из командной строки, подобно следующему:

soffice -invisible macro:///standard.module1.mymacro

Здесь "standard" - имя библиотеки из контейнера "Мои макросы", "module1" - имя модуля, "mymacro" - имя функции (процедуры) самого макроса. При этом запустится процесс Open Office, который выполнит указанный макрос и затем завершит свою работу.

Из командной строки можно также запустить макрос конкретного документа сразу при открытии этого документа:

soffice c:\temp\test.odt macro://./standard.module1.mymacro

Если уже открыт, например, документ test1.odt, сработает и такая командная строка:

soffice macro://test1/standard.module1.mymacro

Можно выполнить макрос из кода другого макроса (используются аналогичные URL), подобно следующему:

oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
sMacroURL = "macro:///standard.module1.mymacro"
oDisp.executeDispatch(StarDesktop, sMacroURL, "", 0, Array())

Диалоги

Механизм макросов OOo Basic позволяет конструировать и выводить диалоговые формы (окна диалогов) для взаимодействия с пользователем.

Создать новый диалог можно в окне "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11), далее кнопка "Управление...", вкладка "Диалоги". Диалоговые формы диалогов хранятся так же, как модули макросов. В среде разработки OOo Basic диалоги текущей библиотеки отображаются на вкладках, расположенных в нижней части экрана, наряду с модулями. При переходе на вкладку, соответствующую диалогу, вы попадаете в визуальный редактор форм.

Запуск диалога можно осуществить примерно таким образом:

Dim oDlg As Object

Function StartDialog()
    oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    oDlg.execute()
End Function

Sub CloseDialog
    oDlg.endExecute()
    MsgBox oDlg.getControl("TextField1").Text
End Sub

Как видно, полезно иметь переменную, ссылающуюся на данный диалог, определенную вне процедуры запуска диалога, так, чтобы другие процедуры могли обращаться к диалогу (к этой переменной). Для данного примера процедура CloseDialog назначается как обработчик события "Отпускание клавиши мыши" для кнопки диалога (это можно сделать в свойствах этой кнопки в визуальном редакторе форм). После закрытия диалога процедура CloseDialog отображает содержимое текстового поля "TextField1" диалога.

Для перебора элементов управления в диалоге используйте код наподобие следующего:

x = oDlg.getControls()
For ii=LBound(x) To UBound(x)
    MsgBox x(ii).getImplementationName()
Next

Элементы управления могут быть размещены и прямо в документе, с помощью панели инструментов "Элементы управления". Им так же могут быть назначены макросы-обработчики событий (через свойства).

Обработка событий

Макрос может выполняться автоматически, когда происходит указанное событие программы, т.е. можно назначить нужный макрос нужному событию.

Меню "Сервис" - "Настройка...", вкладка События. В выпадающем списке "Сохранить в" можно выбрать, будет ли назначение глобально допустимым или действующим только в текущем документе (выбрать "OpenOffice.org" или имя текущего документа). Для каждого события в отображаемом здесь списке можно назначить соответствующий макрос или отменить такое назначение кнопками "Макрос..." и "Удалить".

Программно можно назначить макросы-обработчики для большего числа событий. Например, можно обрабатывать событие изменения данных указанной ячейки Calc. Первая процедура в примере регистрирует обработчик события (вторую процедуру):

Sub AddChartDataListener()
    oCell1 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("A2:A2")
    oListener = CreateUnoListener("MyApp_", "com.sun.star.chart.XChartDataChangeEventListener")
    oCell1.addChartDataChangeEventListener(oListener)
End Sub

Sub MyApp_chartDataChanged(oEvent)
    dCell = ThisComponent.getSheets().getByIndex(0).GetCellByPosition(0,1)
    MsgBox dCell.String 'dCell.Value
End Sub

Расширения

Расширения OpenOffice.org являются удобным способом переноса и распространения кода макросов. Библиотеку макросов можно сохранить в формате расширения OpenOffice.org, и затем быстро автоматически установить на любом другом компьютере, не прибегая к копи-пастингу кода и т.п. действиям.

Чтобы сохранить библиотеку макросов как расширение OpenOffice.org, воспользуйтесь меню "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11), далее кнопка "Управление...", вкладка "Библиотеки". Кнопка "Экспорт..." позволит сохранить выбранную библиотеку как расширение OpenOffice.org, в виде файла с расширением "oxt".

Примечание: файл с расширением "oxt" является zip-архивом, так же, как и любой документ OpenOffice.org. Например, если вы работаете в Windows и у вас установлен WinRAR, вы можете добавить к имени файла ".zip" в конце, а затем открыть его двойным щелчком в WinRAR.

Чтобы установить расширение OpenOffice.org, воспользуйтесь меню "Сервис" - "Управление расширениями...". Кнопка "Добавить" позволит выбрать файл с расширением "oxt" и установить его. В этом же диалоге можно временно включить/отключить нужное расширение (кнопки "Запретить" и "Разрешить"). После установки расширения его модули и макросы будут доступны в диалоге "Сервис" - "Макросы" - "Управление макросами" - "OpenOffice.org Бэйсик..." (Alt+F11). Примечание: если вы работаете в Windows, вы можете начать установку расширения просто двойным щелчком по файлу с расширением "oxt".

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.