Запись / чтение массивов данных в Open Office с использованием Python. У кого-нибудь есть пример кода?

поэтому я написал класс, который упрощает интерфейс с Excel или Gnumeric с помощью Python, и хотел бы расширить класс, чтобы включить Open Office. Я мог бы сделать это за 30 минут, если бы у меня была возможность сделать следующее:

  • установить одно значение на произвольном лист и книга
  • получить одно значение на произвольном листе и рабочей тетради

Если они медленные/есть способ сделать следующее, Мне также нужно уметь:

  • установить/получить массив "'
  • установить/получить матрицу "'

кроме того, возможность создавать и переименовывать листы было бы здорово.

Это крик, если кто-то работал над этим раньше. Если они дают мне информацию, я буду ссылаться на них в верхней части файла

мой проект можно найти здесь:https://sourceforge.net/projects/pyworkbooks/ и я призываю вас проверить это из.

4 ответов


на самом деле, чтобы acess OpenOffice или LibreOffice через Python, нужно пройти через абсолютно непрозрачное количество котельной плиты, унаследованной от StarOffice times - никогда должным образом не документированной (чувствуется) или упрощенной с тех пор.

С другой стороны, он просто работал с последней версией LibreOffice-3.3-I am уверен, что он работает и для OpenOffice (но я бы не советовал никому придерживаться OpenOffice, это тупиковый Оракул на данный момент)

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

однако, это метод позволяет исследовать методы, доступные разработчикам с помощью терминала Python и интроспекции.

первая плохо документированная часть заключается в том, что вы должны начать Open/LibreOffice с: soffice "-accept=socket,host=0,port=2002;urp;" Для соединений, котор нужно принять. Затем создайте новую электронную таблицу через ее интерфейс и с интерпретатором python, который поставляется с офисным пакетом, запустите следующий код (интерактивно или как скрипт):

import uno
import socket  # only needed on win32-OOo3.0.0 

# get the uno component context from the PyUNO runtime
localContext = uno.getComponentContext()     

# create the UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
                       "com.sun.star.bridge.UnoUrlResolver", localContext )

# connect to the running office
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager  
# get the central desktop object
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)

# access the current writer document
model = desktop.getCurrentComponent()

try:
    sheets = model.getSheets()
except Exception:
    raise TypeError("Model retrived was not a spreadsheet")

sheet1 = getattr(sheets, sheets.ElementNames[0])

# At this point, you can use "dir" to check the methods and 
# attributes available for the sheet
# the methots "getCellByPosition, to retrieve a cell object,
# which has "getFormula" and "setFormula"
# methods. 

for i in xrange(10):
    for j in xrange(10):
        cell = sheet1.getCellByPosition(i, j)
        cell.setFormula(str(i * j))

c1 = sheet1.getCellByPosition(1,1)

Как вы можете видеть, соединительные части это шаблон, который я получил где-то еще много лет назад, и я сомневаюсь, что любой живой человек мог бы найти какое-либо обоснование в таком материале. Однако, как только вы перейдете к объекту "листы", атрибуты и методы объекта начнут иметь смысл.

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

http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide


МЕЖПРОЦЕССНЫЙ API для подключения к LibreOffice (а также OpenOffice и StarOffice) называется UNO. Это задокументировано в документация по API LibreOffice сайт.

Как говорит jsbueno, он ожидает, что демон работает для связи. Аргументы командной строки для команды "soffice", запускающей демон, определяют, какие значения хоста и порта необходимо предоставить в вызовах UNO.


вы также можете попробовать ezodf Это была лучшая библиотека python odf, которую я нашел


можно использовать pyoo. Вот мой ответ на подобный вопрос https://stackoverflow.com/a/27082610/886607