Меню Рубрики

Libreoffice macros python windows

Interface-oriented programming in OpenOffice / LibreOffice : automate your office tasks with Python Macros

OpenOffice and LibreOffice are the main open-source office suites, the opensource equivalent to Microsoft Office, to create text document, spreadsheets, presentations and drawings.

LibreOffice was a fork of OpenOffice.org (when OpenOffice went under Oracle’s umbrella) and is built on the original OpenOffice.org code base.

Both are equivalent, but the usual advise is to use LibreOffice (see the differences) since it is the project of the volunteers from the open-source community and has been developping more quickly.

I’ll speak about LibreOffice now, but the same is true for OpenOffice.

and in the menu bar LibreOffice > Preferences, enable macros

I would recommend you to set Macro security to Medium which will not block nor allow macros but alert you to choose if you trust the editor of the document :

Which language choice for writing your LibreOffice macros ?

Macros are scripting for the office suite.

Many languages are accepted by the LibreOffice API, thanks to the Universal Network Objects (UNO). Among them are : Visual Basic, Java, C/C++, Javascript, Python.

The API is interface-oriented, meaning your code communicate with the controller of the interface and the document has to be open. Many other Python libraries are not interface-oriented, creating directly the file in the Open Document format and saving it to disk with the correct extension

  • .odt for text files
  • .ods for spreadsheets
  • .odp for presentations
  • .odg for drawings

For the choice of the language, I would first insist on the multi-platform requirement, which means it’s better if the macro / script can be executed on different platforms such as Windows, Mac OS or Linux, because LibreOffice is also multi-platform and documents will be shared between users from which we cannot expect a particular platform. Visual Basic is not multi-platform and would require significant changes from one plateform to another (Visual Basic, Real Basic, AppleScript…).

Java and C/C++ require compilation, are much more complex and verbose.

For a scripting need, I would advise Javascript or Python. Both are very present in script development world wide and are standards de facto. Many tools have been built for task automation on Javascript, such as Cordova (the multi-platform mobile app framework) or Grunt. Many other tools are using Python as well, such as AWS CLI for example.

I would advise to write most of your code logic outside the interface-orientated architecture, following a standard code architecture, with your common NodeJS dependencies or Python libraries.

But, Javascript could be not precise enough to work nicely in your spreadsheets (even though there exists very nice libraries for numeric computation) and could be disconcerting for your Office users due to rounding errors ( 0.1 + 0.2 does not equals 0.3 in Javascript).

On the contrary, Python has been used extensively for numeric computation, with famous libraries such as Numpy, Numexpr … which make it perfect for spreadsheet macros.

Python has also numerous available libraries for other purposes, due to its success and support from big digital companies, such as Excel reading or writing libraries which make it the perfect choice for macro development.

Even though Python 2.7 still remains very used, and Python 3 introduced differences, the latest version of LibreOffice comes with Python 3.3, so the use of Python 3.3 is advised for durability.

First play with the Python shell to get familiar

Before creating your own macro, let’s play with the Python shell and interact with a document, let’s say a spreadsheet.

First launch LibreOffice Calc (Calc for spreadsheet open documents) with an open socket to communicate with from the shell on your Mac OS :

(for the Windows command : «C:\\Program Files (x86)\LibreOffice 5\program\soffice.exe» —calc —accept=»socket,host=localhost,port=2002;urp;» but if any trouble, have a look the proposed workarounds).

and launch the Python shell

(for the Windows command : «C:\\Program Files (x86)\LibreOffice 5\program\python.exe» ).

Python-Uno, the library to communicate via Uno, is already in the LibreOffice Python’s path.

To initialize your context, type the following lines in your python shell :

These lines are common for every documents (Text, Spreadsheet, Presentation, Drawing).

Now you can interact with the document.

Since we launched LibreOffice with —calc option, let’s try the spreadsheet interactions :

If you open a text document and access it with a new document writer, you can try the following interactions :

Here is a schema for what we’ve just done : the shell communicates with the LibreOffice runtime to command actions inside the current document.

Create your first macro

It is the other mode, the macro is called from inside the Libreoffice program :

OpenOffice.org does not offer a way to edit Python scripts. You have to use your own text editor (such as Sublim, Atom…) and your own commands.

There are 3 places where you can put your code. The first way is to add it as a library for LibreOffice in one of the directories in the PYTHONPATH

But this is only useful to be used in other macros.

The 2 other ways are to insert your script

either globally on your computer, in your local LibreOffice installation,

or inside the document, so that when shared another computer (by email, or whatever means), the document has still functional macros.

Let’s see how to install it in the LibreOffice install first, I’ll show you the document-inside install in the next section.

You can find and call your Macro scripts from the LibreOffice menu for macros Tools > Macros > Organize Macros.

If you get a “Java SE 6 Error message” such as bellow

Let’s edit a first macro script file myscript.py that will print the Python version, creating a method PythonVersion :

and copy it to the Macro directory for LibreOffice :

(under Windows it is C:\Program Files (x86)\LibreOffice 5\share\Scripts\python directory).

Open a new text document and run it from the menu :

In case there are multiple methods, all of them will be exported, but we can also specify which one to export with the following statement at the end of the file :

Its spreadsheet counterpart would be :

For distribution of code, OXT format acts as containers of code that will be installed by the Extension Manager or with the command line /Applications/LibreOffice.app/Contents/MacOS/unopkg .

Pack your script inside the document : the OpenDocument format

OpenDocument files are zipped directories.

You can have a look at inside by creating and saving a opendocument spreadsheet document with LibreOffice and then unzipping it :

You’ll get the following list of files and subdirectories in your extracted file :

You can directly append your script to the file with the zipfile library. Let’s create include_macro.py :

such that to include your Python macro inside document.ods, just type command

After enabling macros,

you should be able to run your macro

Add a button control to launch your macro

Show the form control toolbar in the menu View > Toolbars > Form Controls, activate Design mode (first red arrow) and add a button (second red arrow) :

Right click on the button to open the control properties and link with your macro :

Toggle design mode to OFF, close your toolbars. Your document is ready.

You can download my example here. This document can be used to check everything works as espected on the LibreOffice version of your customer.

You can also add the button programmatically :

and add a listener

Start a macro when document starts / opens / is loaded

In the toolbar Tools > Customize, add the macro :

You have the choice to save the preference

either in the document itself, in this case the macro will be executed whenever the document is opened on any computer

or in the LibreOffice install on your local computer, in this case the macro will be executed for every opened document.

Add a listener when the cell content changes

Spreadsheet methods

Get a sheet

model.getCurrentController.setActiveSheet(sheet) set the sheet active

Protect / unprotect a sheet

Get a cell

Get cell range

Get cell value

cell.getType() cell type (in from com.sun.star.table.CellContentType import TEXT, EMPTY, VALUE, FORMULA)

cell.getValue() or cell.Value

cell.getString() or cell.String

cell.getFormula() or cell.Formula

You can also have a look at number formats, dates, …

Set cell value

cell.setValue(value) or cell.Value=value

cell.setString(string) or cell.String=string

cell.setFormula(formula) or cell.Formula=formula (example : cell.setFormula(“=A1”))

Cell background color (hexadecimal)

cell.CellBackColor=-1 (no color)

Get range value as an array

Document Path

Named Ranges

Named ranges are like “alias” or shortcuts defining ranges in the document :

Remove a named range :

get cell column and row

get cell sheet

get range column and rowstart/end start/end/count

range.Rows.getCount() number of rows

range.Columns.getCount() number of columns

clear contents

range.clearContents(4) clears the cells with a String as value other clearing flags

delete rows

Data pilots (equivalent to Excel’s data pivots)

Shapes

Charts

Change dataseries order :

Change color and transparency :

Deal with enumerations

Export as a CSV in UTF-8

Current print area

Save as PDF

Add filter data options (available options), such a page range :

or a selection of cells “$A$1:$B$3”

Determining the used area

Create a message box

Work on selections using the dispatcher

You can have a look at other actions such as Protection, Cancel, TerminateInplaceActivation, InsertContents (with properties ‘Flags’,’FormulaCommand’,’SkipEmptyCells’,’Transpose’,’AsLink’,’MoveMode’ )

Create a dialog

Let’s create and open a dialog with a push button and a label such as :

but clicking does not execute anything. Let’s close it, add listeners to increase the label counter when clicking the button, and re-open the dialog :

Working with a form

You might have created a listbox of name “Listbox”

and linked to data :

If the list box view is not in the current active sheet, you can access it with :

Please do not hesitate to do your contributions to my tutorial.

Well done !

Deep Learning with Theano

An overview of deep learning with code examples in Python: convolutional networks, recurrent networks, residual networks, memory networks, generative adversarial networks, and RL networks.

Источник

Добавляем фуригану к кандзи Python макросом для LibreOffice

Дамы и господа, план такой:

  • всё, что вы хотели знать о японской письменности, но боялись спросить
  • что такое ruby text
  • как писать аддоны для LibreOffice на Python
  • как сгенирировать чтение для канзи
  • собираем всё это вместе в фуриганайзер!

В современном японском языке используются, в основном, три письменных системы.

Во-первых, это две слоговые азбуки: хирагана и катакана. Хирагана более округлая, выглядит примерно вот так: これはひらがなです и является как-бы основной азбукой.。 Катакана более угловатая (カタカナデス) и используется в основном для заимствованных слов, в целом же набор знаков хираганы и катаканы практически аналогичный. Дальше будем называть всё это просто “кана”. “Слоговая азбука” значит, что вместо наших гласных и согласных “а”, “б” и “в” — только целые слоги типа “ка”, “са” и “то”. Гласные, правда тоже есть, пять штук (“а”, “и”, “у”, “э“, “о” + «я», «ю» и «ё») и только один согласный знак “н” в порядке исключения.

Именно поэтому японцам очень трудно выговаривать слова с подряд идущими согласными — они к такому просто не привыкли, но это нам сейчас не важно. Одной каной, в принципе, можно написать любую фразу на японском.

Еще одна система — это заимствованные из Китая иероглифы, которые мы будем дальше называть кандзи, потом что они так называются. После заимствования японские, да собсно и китайские тоже, кандзи существенно поменялись, и сейчас довольно таки различаются, хотя конечно, с другой стороны, во многом остались схожи. Скажем так, глядя на китайский текст японец может более-менее понять о чём там идёт речь. Кандзи выглядят примерно так: 友達、日本酒、世界。 Да, в японском — круглая точка.

Тут ключевой для понимания момент: японский и китайский языки на уровне грамматики вообще никак не родственные. Так что вот так вот просто взять китайские знаки и начать ими писать было не можно. Собственно с помощью кандзи можно писать отдельные слова, скорее даже основы слов, а для указания грамматических форм и связи слов между собой по-прежнему используется кана. Выглядит это примерно так: 送りがなはとっても便利です. Если присмотреться — видно что первый символ — кандзи, за ним идут несколько знаков каны и т.д. Таким трюком легко визуально отличить японский текст от китайского, которые выглядит графически более “плотным” т.к. там исключительно кандзи. Эта кана, которая прицепляется в кандзи для указания грамматической формы, называется “окуригана”.

Вот, ну и наконец… Число кандзи довольно велико, и, если вы не робот — то запомнить все сложно. Если слово написано кандзи — то часто не очевидно как собс-но его читать, при том, что что в устной речи слово вполне могла встречаться и человек его знает. Чтобы помочь в такой ситуации, особенно для редких кандзи или когда текст предназначен для детей, иностранцев, или других умственно ограниченных категорий граждан — чтение кандзи подписывают сверху с помощью каны. Это и называется “фуригана”. Выглядит как на картинке в начале поста.

Фух, переходим к следующему пункту.

Для добавления аннотации поверх текста используется так называемый ruby. К языку программирования отношения не имеет. Как я только что узнал из Википедии — по-русски называется “агат”

Поддержка руби есть в html с помощью тэга ruby:

Но сейчас нас интересует LibreOffice. В ручном режиме добавить руби аннотацию к тексту можно через меню Format -> Asian Phonetic Guide. Это несколько странно, ведь можно поле руби же не только для фонетики использовать, ну да фиг с ними. Если такого нет в меню — то можно попробовать добавить поддержку азиатских языков в Tools -> Options -> Language Settings.

Дальше, мы хотим это делать автоматически для выделенного текста. LibreOffice прекрасен тем, что в нём можно писать макросы на Python. Для этого должен стоять модуль libreoffice-script-provider-python (ставиться через apt-get), который по-умлочанию не стоит. Ах да, я всё делаю под Ubuntu, если у вас другая операционная система — то вы можете поделиться в комментариях рецептом для неё 🙂

Собственно макрос пишется как обычная функция на пайтоне. Документ виден через глобальную переменную с инстансом соответствующего класса и, собственно, в нём все нужные методы.

Вот простой пример:

Сохраняем в файл, кладём его или делаем символьную ссылку в папку, в которой LibreOffice держит скрипты. В моём случае это “

Открываем LibreOffice Writer (OpenOffice тоже должен работать), идём в Tools -> Macros -> Run Macro и видим там наш скрипт, если всё получилось.

Осталось написать такой скрипт, который бы брал кандзи из документа и добавлял их чтения в руби соответствующих символов. Тут всё просто: для генерации чтения есть специальные программы, мы просто запустим их из нашего скрипта-макроса, через стандартный ввод-вывод прогоним японский текст и вставим аутпут в документ.

Программа под названием kakasi берёт японский текст и выдаёт чтение целым куском, но это не совсем то, что надо, т.к. хочется фрагменты фонетической подсказки распределить между ruby полями соответствующих симоволов. Для этого с помощью mecab можно токенизировать японский текст, а потому уже кормить его kakasi по частям. На самом деле точность генерации чтения от этого чуть-чуть ухудшается, но улучшается вёрстка документа. Какие-то огрехи можно потом поправить вручную.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Libreoffice for windows 10
  • Lgokedvd для windows 7
  • Lge android mtp device отказ windows 7
  • Lga1155 драйвера windows 7
  • Lg x145 драйвер для windows 7