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

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

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

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

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

ТАКЖЕ, возможность создавать и переименовывать листы была бы отличной.

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

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

Ответы [ 4 ]

8 голосов
/ 24 марта 2011

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

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

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

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

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

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

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

1 голос
/ 26 сентября 2012

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

1 голос
/ 10 июля 2012

Межпроцессный API для подключения к LibreOffice (а также OpenOffice и StarOffice) называется UNO.Он задокументирован на документации по LibreOffice API site.

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

0 голосов
/ 23 ноября 2014

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

...