LibreOffice — это сила. С помощью это­го пакета мож­но делать прак­тичес­ки все: вес­ти бух­галтер­ский учет, рисовать век­торную гра­фику, адми­нис­три­ровать базы дан­ных, писать HTML-код, соз­давать визит­ки и про­чее, про­чее, про­чее. LibreOffice Basic — это трой­ная сила, так как она поз­воля­ет делать то же самое в разы быс­трее и лег­че. Как поль­зовать­ся столь бес­ценным тво­рени­ем, рас­ска­жет эта статья.

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 пос­тавля­ется с обширной кол­лекци­ей при­меров кода для раз­ных ситу­аций, и этот спо­соб авто­мати­зации отлично докумен­тирован на сай­те про­екта. Боль­шая часть нашей статьи пос­вящена это­му спо­собу.

    Открываем менеджер макросов
    От­кры­ваем менед­жер мак­росов
  • Bean Shell

    Этот спо­соб дос­тался в нас­ледс­тво от OpenOffice (про­ект куриро­вала ком­пания Oracle). BeanShell — это скрип­товый язык, соз­данный для тес­тирова­ния и отладки Java-прог­рамм. Для написа­ния мак­росов на этом язы­ке необ­ходимо изме­нить уста­новить соот­ветс­тву­ющее рас­ширение goo.gl/OzHo1W.

  • Python

    Кнопка Edit неактивна. С Python все не так просто
    Кноп­ка Edit неак­тивна. С 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 авто­мати­зиро­вать мож­но поч­ти все что угод­но.

Оставить мнение