Работа с OpenOffice (LibreOffice) из Python

Иногда возникает необходимость программно работать с документами LibreOffice (OpenOffice) или даже с документами Microsoft Office. Это засада. Но и для этих целей тоже есть инструмент, Python-UNO.

Как это работает

Работает это так:

  • Запускаем LibreOffice (можно OpenOffice) так, чтобы он слушал порт на локальном хосте.
  • Пишем программу на Python, которая посылает команды на запущенный LibreOffice
  • Запускаем эту программу и она делает то, что мы хотим.

Устанавливаем необходимый софт

Я работаю на Ubuntu 11.04 Natty Narwhal, Так что все описываю для него.

Подразумевается, что LibreOffice уже установлен, нужно установить библиотеку для Python:

apt-get install python-uno

Запускаем LibreOffice

Необходимо запустить LibreOffice так, чтобы он слушал команды. Для этого пишем простенький скриптик:

1 #! /bin/bash
2 
3 /usr/bin/libreoffice  -accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" \
4 -norestore -nofirstwizard -nologo 
5 
6 exit 0

В скрипте по моему все очевидно. Итак, скрипт написан, запускаем, можно начинать эксперименты.

Работа с LibreOffice

Для работы пишем скриптик на питоне:

 1 #! /usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 
 4 import sys,uno
 5 
 6 local = uno.getComponentContext()
 7 resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)
 8 context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
 9 desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
10 
11 url = "private:factory/swriter"
12 document = desktop.loadComponentFromURL(url, "_blank", 0, ())
13 cursor = document.Text.createTextCursor()
14 
15 text = "This text is being added to openoffice using python and uno package.\n\n"
16 document.Text.insertString(cursor, text, 0)
17 
18 document.storeAsURL("file:///home/evgeny/tmp/002.odt",())
19 document.dispose()
20 
21 sys.exit()

Этот скриптик создает новый документ, пишет в него строку, сохраняет и закрывает документ.

Еще один скрипт:

 1 #! /usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 # Copyright Evgeny Kazanov 2011
 4 """
 5 """
 6 
 7 import sys,uno
 8 
 9 local = uno.getComponentContext()
10 resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)
11 context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
12 desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
13 url = "file:////home/evgeny/tmp//001.doc"
14 document = desktop.loadComponentFromURL(url,"_blank", 0, ())
15 print document.CharacterCount
16 document.dispose()
17 sys.exit()

Этот скрипт открывает файл Word, выводит на консоль количество символов в нем и закрывает документ.

Вот пока и все.

Ссылки

Опубликовано: June 3, 2011

Комментарии:


Имя: vovans

Вот было бы интересно добавить возможность в ОО показывать кол-во символов с пробелами и без! :) Жаль, ОО так и не научился это делать :(



Имя: Клим

vovans, а ты мозги включи и сделай



Имя: evgeny

Кстати о птичках. Глянул в свой LibreOffice, считает и с пробелами и без.



Имя: f

f



Имя: u

u



Имя: Алексанр

Привет! Почему на ubuntu 14.04 не ставиться uno



Имя: Фу

"Do not delete this. Write under the line!" - костыли!



Имя: Фу

Код не по PEP8



Комментировать:

Имя:

Комментарий: