使用Python在Open Office中读写数据数组,有人有示例代码吗?

6 投票
4 回答
5944 浏览
提问于 2025-04-16 14:18

我写了一个类,可以很方便地用Python和Excel或者Gnumeric进行交互。现在我想把这个类扩展一下,让它也能支持Open Office。如果我能做到以下几点,30分钟就能搞定:

  • 在任意的工作表和工作簿上设置一个值
  • 在任意的工作表和工作簿上获取一个值

如果这些操作比较慢,或者有其他方法,我还需要能:

  • 设置/获取一个数组 '''
  • 设置/获取一个矩阵 '''

另外,能够创建和重命名工作表也是很不错的功能。

如果有人之前做过类似的事情,这里是个呼喊。如果他们能给我一些信息,我会在文件开头提到他们的名字。

我的项目可以在这里找到:https://sourceforge.net/projects/pyworkbooks/,我鼓励大家去看看。

4 个回答

1

你也可以试试 ezodf 这是我找到的最好的Python ODF库。

1

连接LibreOffice(还有OpenOffice和StarOffice)的进程间接口叫做UNO。你可以在LibreOffice API文档网站上找到相关的说明。

正如jsbueno所说,它需要一个后台程序在运行,以便进行通信。启动这个后台程序的‘soffice’命令行参数会决定你在UNO调用中需要提供哪些主机和端口值。

8

其实,要通过Python访问OpenOffice或LibreOffice,你得面对一大堆复杂的代码,这些都是从StarOffice时代遗留下来的,感觉从那时起就没有好好记录或简化过。

我曾经讲过这个话题,光是准备下面的例子就花了将近40分钟。

不过,最新的LibreOffice版本3.3可以正常工作,我相信OpenOffice也没问题(但我不建议大家继续使用OpenOffice,现在它已经是Oracle的死胡同了)。

下面的例子使用的是一种比较慢的方法,从“外部”连接到正在运行的LibreOffice实例。这种方式非常慢——为了提高性能,你需要查阅文档,了解如何在程序“内部”作为宏来运行。(这种方式真的很慢)。

不过,这种方法可以让你在Python终端中探索开发者可用的方法和功能。

第一个不太好记录的部分是,你需要用以下命令启动Open/LibreOffice:

soffice "-accept=socket,host=0,port=2002;urp;"

这样才能接受连接。然后,通过它的界面创建一个新的电子表格,接着用Office套件自带的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)

如你所见,连接的部分是我多年前在别处找到的代码,真怀疑现在还有人能理解这些东西。不过,一旦你进入“sheets”对象,里面的属性和方法就开始变得有意义了。

网上有一份完整的开发者手册,甚至可以帮助你理解连接的部分:

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

撰写回答