我需要处理由许多单独的工作表组成的 Calc 电子表格。 Wiki 有一个详细的 Python 指南,我正在关注。我安装了
libreoffice-script-provider-python
软件包,并且能够毫无错误地导入 uno
软件包。然而,每次调用 create_instance
函数时,解释器都会因分段错误而崩溃。下面是一个小例子:
import uno
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
def create_instance(name, with_context=False):
if with_context:
instance = SM.createInstanceWithContext(name, CTX)
else:
instance = SM.createInstance(name)
return instance
path = uno.systemPathToFileUrl('/home/user/temp/test.ods')
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
如何使用
uno
打开 Calc 电子表格?
设置:
更新:一个更小的示例的日志。提前启动 Calc 并不会真正改变结果,而是为了完成而添加。
$ soffice --calc --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"
$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import uno
>>> CTX = uno.getComponentContext()
>>> SM = CTX.getServiceManager()
>>> name='com.sun.star.frame.Desktop'
>>> instance = SM.createInstanceWithContext(name, CTX)
Segmentation fault (core dumped)
好吧,我使用了你的设置(Ubuntu 22.04,Python 3.10,LO 7.3.7),事实上,问题中列出的代码确实产生了分段错误。
但看来您甚至没有尝试过该教程! 🙁 需要解析器才能连接到正在运行的 LibreOffice 实例。
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", localContext)
ctx = resolver.resolve(
"uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
您找到的代码不适合与该设置一起使用。当从 LibreOffice 作为宏运行时,它可以工作,其中
XSCRIPTCONTEXT
可用。