使用Python在Open Office中读写数据数组,有人有示例代码吗?
我写了一个类,可以很方便地用Python和Excel或者Gnumeric进行交互。现在我想把这个类扩展一下,让它也能支持Open Office。如果我能做到以下几点,30分钟就能搞定:
- 在任意的工作表和工作簿上设置一个值
- 在任意的工作表和工作簿上获取一个值
如果这些操作比较慢,或者有其他方法,我还需要能:
- 设置/获取一个数组 '''
- 设置/获取一个矩阵 '''
另外,能够创建和重命名工作表也是很不错的功能。
如果有人之前做过类似的事情,这里是个呼喊。如果他们能给我一些信息,我会在文件开头提到他们的名字。
我的项目可以在这里找到:https://sourceforge.net/projects/pyworkbooks/,我鼓励大家去看看。
4 个回答
你也可以试试 ezodf 这是我找到的最好的Python ODF库。
连接LibreOffice(还有OpenOffice和StarOffice)的进程间接口叫做UNO。你可以在LibreOffice API文档网站上找到相关的说明。
正如jsbueno所说,它需要一个后台程序在运行,以便进行通信。启动这个后台程序的‘soffice’命令行参数会决定你在UNO调用中需要提供哪些主机和端口值。
其实,要通过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