Содержание статьи
warning
Перед запуском первого макроса LibreOffice может потребовать установить JRE (Java Runtime Environment). Скачать инсталлятор можно здесь.
Что такое LibreOffice
Пакет свободного ПО для работы с документами. Появился в 2010 году, но уже успел завоевать бешеную популярность во всем мире. С помощью его можно создавать и редактировать файлы чуть менее сотни различных форматов, в том числе документы Microsoft Office (.doc, .docx, .xls, .xlsx). Есть версии для Windows, Linux и OS X.
Еще LibreOffice можно установить на сервер и запускать в браузере. Для этого сервер должен управляться Linux и на нем должна быть установлена библиотека GTK3 (она нужна для трансляции графики в HTML5).
Программный пакет включает в себя следующие компоненты:
- Text — аналог Word;
- SpreadSheet — аналог Excel;
- Presentation — аналог PowerPoint;
- Drawing — векторный графический редактор;
- Database — панель управления базами данных, можно использовать для управления локальными базами (dBase) данных или для администрирования удаленных (MySQL, Oracle и другие);
- визуальный HTML-редактор;
- редактор формул;
- мастер по созданию визиток.
SRC
Специально для тебя мы сделали подборку исходников макросов для LibreOffice. Ищи их в репозиториях GitHub к этому номеру.
.bash и LibreOffice
Создавать и редактировать документы LibreOffice можно напрямую из shell, используя LibreOffice API. В качестве примера сконвертируем ODT-файл в docx:
libreoffice --headless --convert-to docx filetoconvert.odt
Языки, на которых можно написать макрос
-
LibreOffice Basic
Для написания макросов на этом языке не нужно устанавливать никаких дополнений. Пакет LibreOffice Basic поставляется с обширной коллекцией примеров кода для разных ситуаций, и этот способ автоматизации отлично документирован на сайте проекта. Большая часть нашей статьи посвящена этому способу.
Другие статьи в выпуске:Хакер #188. Ботнеты, изменившие мир
-
Bean Shell
Этот способ достался в наследство от OpenOffice (проект курировала компания Oracle). BeanShell — это скриптовый язык, созданный для тестирования и отладки Java-программ. Для написания макросов на этом языке необходимо изменить установить соответствующее расширение goo.gl/OzHo1W.
-
Python
Для того чтобы автоматизировать работу с LibreOffice на Python, нужно установить соответствующее дополнение:
sudo apt-get install libreoffice-script-provider-python
Если ты используешь LibreOffice под Windows, тогда надо установить это дополнение через Tools → Options → LibreOffice → General.
После установки можно редактировать Python-макросы из встроенного редактора.
Java Script
C JS ситуация аналогична ситуации с Python. Для выполнения макросов требуется установить libreoffice-script=provider-js.
Соответственно, для Windows способ установки также аналогичен предыдущему пункту.
info
Как и в MS Office, в LibreOffice есть возможность записывать макросы. Это можно сделать через пункт меню Record Macro.
info
Можно настроить несколько способов вызова макроса:
- из пункта меню;
- сочетанием клавиш;
- по событию;
- по гиперссылке;
- по элементу картинки;
- по форме или ее части.
Примеры макросов:
В принципе, на LibreOffice Basic можно имитировать любые действия пользователя. Для наглядности приведем примеры автоматизаций для различных компонентов LibreOffice.
Hello world
Пример простейшего макроса для вывода сообщения с текстом:
Sub Hello
Macro Print "Ты ведь невольно вспомнил про свою учительницу информатики?"End Sub
Text
А вот макрос вставляет в конец текстового документа строку, отформатированную определенным образом:Sub WriteGreenText()Dim oDoc As Object, xText As Object, xTextRange As Object
oDoc = ThisComponent ' Кладем в переменную текущий документxText = oDoc.getText() ' Кладем в переменную текст документа
xTextRange = xText.getEnd() ' Ищем конец текста' Начинаем задавать форматирование
xTextRange.CharBackColor = green
TextRange.CharHeight = 16.0
xTextRange.CharPosture = com.sun.star.awt.FontSlant.ITALIC ' курсивxTextRange.setString( "зеленый курсив" ) ' Запись текста
End Sub
SpreadSheet
Этот код красит первую ячейку во втором листе в книге в черный цвет:
Sub highlightcell
Dim oTextTables As Variant ' Массив — все листы книгиDim oTextTable As Variant ' Переменная для листа, с которым будем работать
Dim oCell As Variant ' Переменная для ячейкиoTextTables = ThisComponent.getTextTables() ' Кладем в переменную все листы книги
oTextTable = oTextTables.getByIndex(1) ' Кладем в переменную второй лист книгиoCell = oTextTable.getCellByPosition(1, 1) ' Первая ячейка второго листа
' Можно было сделать такoCell = oTextTable.getCellByName("B3")oCell.setPropertyValue("BackColor", RGB(0, 0, 0)) ' Красим!
End Sub
info
UNO — компонентная модель для взаимодействия объектов в OpenOffice и LibreOffice. Для программного управления этой моделью существуют UNO API. С помощью его производится обращение к LibreOffice из сторонних скриптов (Python, JS и BeanShell).
Presentation
Макрос для создания нового слайда в презентации:
Sub CreateSomeSlide
' Создаем чистый слайд в текущем документе oDoc = ThisComponent oDrawPages = oDoc.getDrawPages() oDrawPage = oDrawPages.insertNewByIndex(oDrawPages.getCount()) ' Создаем новое текстовое поле
oTextShape = oDoc.createInstance("com.sun.star.drawing.TextShape") ' Задаем форму полю для текста aPoint = CreateUnoStruct("com.sun.star.awt.Point") aSize = CreateUnoStruct("com.sun.star.awt.Size") ' Задаем полю координаты
aPoint.X = 1000
aPoint.Y = 1000
' Задаем ширину и высоту aSize.Width = 15000 aSize.Height = 5000 ' Применяем вышеназванные параметры
oTextShape.setPosition(aPoint) oTextShape.setSize(aSize) ' Вставляем текстовое поле на слайд oDrawPage.add(oTextShape) ' Пишем текст и настраиваем ему размер шрифта
oTextShape.setString("А вот и наш текст") oTextShape.CharHeight = 15.0
End Sub
Drawing
Этот макрос удаляет все линии с рисунка. Когда это может пригодиться? Допустим: нарисовали 30-страничную схему, где линиями соединены все объекты. Потом пришел твой шеф и сказал: «Нафиг линиями? И без них все понятно!»
Doc = ThisComponent ' Кладем в переменную текущий графический документc = Doc.DrawPage.count ' Считаем общее количество графических примитивов
i = c
Do While i >= 1
drawObject = Doc.DrawPage(i - 1) ' Не забываем, что у прогеров первая цифра — ноль if drawobject.ShapeType = "com.sun.star.drawing.LineShape" then Doc.DrawPage.remove(drawObject) ' В случае, если объект — линия, удаляем его
endif
i = i - 1
Loop
Аналогичным образом можно удалить все стрелочки или другие фигуры.
Автоматизация OpenOffice
Если ты олдфаг, привык к OpenOffice и не хочешь менять его не на что‑то другое, это не лишает тебя возможности автоматизировать свою работу. Многие примеры из этой статьи будут работать в этом пакете. А документации по автоматизации OpenOffice гораздо больше, чем по LibreOffice. Вот ссылка на отличный FAQ, в котором есть ответы на все вопросы по автоматизации OpenOffice:
Database
С помощью макросов можно выполнять запросы к базам данных (предварительно необходимо установить соединение с database-сервером):
' Стираем все строчки из таблицы с контактамиoForm.Activeconnection.CreateStatement.execute("DELETE * from contacts")
Pandoс
Утилита для обработки текстовых файлов. Она может конвертировать Markdown, LaTeX и HTML в целый калейдоскоп различных форматов. Вот некоторые из них:
- PDF;
- MediaWiki;
- DocBook;
- EPUB;
- Docx;
- ODT;
- HTML-слайды презентаций.
Заключение
LibreOffice Basic синтаксически идентичен VBA и всем остальным разновидностям бейсика, с которыми многим из нас пришлось столкнуться в школе и институте. Но не надо ставить LOB на один уровень с его братом от Microsoft. Во‑первых, редактор макросов в LB гораздо дружественнее и терпимее к промахам пользователя. В частности, в случае ошибки не надо гуглить ее код по форумам в стиле «информатика для школьника», чаще всего понять, что не так, можно, не выходя из окна с кодом. Во‑вторых, выполнение макроса никогда не парализует работу компьютера (как это иногда может сделать бесконечный цикл в VBA). А в‑третьих, благодаря возможностям UNO API автоматизировать можно почти все что угодно.