所以我编写了一个类,它可以很容易地使用Python与Excel或Gnumeric进行交互,并且希望扩展该类以包含Open Office。如果我有能力执行以下操作,我可以在30分钟内完成此操作:
如果这些很慢/有办法执行以下操作,我还需要能够:
此外,创建和重命名工作表的能力也很棒。
如果有人之前已经开展过这项工作,那么这是一个呐喊。如果他们给我这些信息,我会在文件顶部引用它们
我的项目可以在这里找到:https://sourceforge.net/projects/pyworkbooks/我鼓励你查看。
答案 0 :(得分:8)
事实上,对于通过Python访问OpenOffice或LibreOffice,必须经历从StarOffice时代继承的绝对不透明的锅炉板 - 从那以后从未正确记录(一种感觉)或简化。
我曾经讲过这个主题,我花了40分钟,只是为了找回我演讲的部分内容来设置下面的例子。
另一方面,它只使用了最新的LibreOffice版本 - 3.3 - 我相信它也适用于OpenOffice(但我不建议任何人坚持使用OpenOffice,此时它是Oracle死胡同)< / p>
下面的示例使用从“外部”连接到正在运行的LibreOffice实例的慢速方法。这非常慢 - 您必须参考有关如何使其作为宏从程序“内部”工作的文档,以获得更好的性能。 (以这种方式真的慢)。
但是,此方法允许您使用Python终端和内省探索开发人员可用的方法。
第一个记录不完整的部分是您必须使用以下命令启动Open / LibreOffice:
soffice "-accept=socket,host=0,port=2002;urp;"
接受连接。然后,通过其界面创建一个新的电子表格
并使用Office Suite附带的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)
正如你所看到的,这个连接部分是我多年前在其他地方找到的样板,我怀疑任何活着的人都能在这些东西中找到任何理由。 但是,一旦你开始使用“sheet”对象,对象上的属性和方法就开始变得有意义了。
在线有完整的开发人员手册,甚至可以让人们理解连接部分:
http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide
答案 1 :(得分:1)
用于连接LibreOffice(以及OpenOffice和StarOffice)的进程间API称为UNO。它记录在LibreOffice API documentation站点。
正如jsbueno所说,它希望守护进程正在运行以进行通信。启动守护程序的'soffice'命令的命令行参数确定您在UNO调用中需要提供的主机和端口值。
答案 2 :(得分:1)
你也可以尝试ezodf这是我找到的最好的python odf库
答案 3 :(得分:0)
您可以使用pyoo。以下是我对类似问题 https://stackoverflow.com/a/27082610/886607
的回答