На самом деле, чтобы получить доступ к 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