首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在LibreOffice + Windows中使用Python?

如何在LibreOffice + Windows中使用Python?
EN

Stack Overflow用户
提问于 2020-04-27 10:48:18
回答 1查看 9K关注 0票数 5

这个问题集中在Windows + LibreOffice +Python3上。

我已经安装了LibreOffice (6.3.4.2),也安装了pip install unoconvpip install unotools (pip install uno是另一个无关的库),但是在import uno之后仍然会出现这个错误

ModuleNotFoundError:没有名为“uno”的模块

更广泛地说,作为使用的一个例子,如何使用LibreOffice UNO打开.docx文档并将其导出到LibreOffice?中。

从几天以来,我已经对此进行了广泛的搜索,但还没有找到在Windows上工作的可重复的示例代码:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-27 18:54:58

为了与LibreOffice交互,启动一个监听套接字的实例。我不常使用COM,但我认为这相当于您询问的COM交互。这可以在命令行或使用shell脚本上最容易地完成,但它也可以使用时间延迟和子进程来处理系统调用。

代码语言:javascript
运行
复制
chdir "%ProgramFiles%\LibreOffice\program\"
start soffice -accept=socket,host=localhost,port=2002;urp;

接下来,运行LibreOffice附带的python的安装,它默认安装了uno

代码语言:javascript
运行
复制
"C:\Program Files\LibreOffice\program\python.exe"
>> import uno

如果您使用的是未随LibreOffice附带的在Windows上安装Python,那么要让它与UNO一起工作要困难得多,除非您喜欢黑客攻击,否则我不会推荐它。

现在,这是所有代码。在实际项目中,最好将其组织成类,但这是一个简化的版本。

代码语言:javascript
运行
复制
import os
import uno
from com.sun.star.beans import PropertyValue
def createProp(name, value):
    prop = PropertyValue()
    prop.Name = name
    prop.Value = value
    return prop

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")
smgr = ctx.ServiceManager
desktop = smgr.createInstanceWithContext(
    "com.sun.star.frame.Desktop", ctx)
dispatcher = smgr.createInstanceWithContext(
    "com.sun.star.frame.DispatchHelper", ctx)
filepath = r"C:\Users\JimStandard\Desktop\Untitled 1.docx"
fileUrl = uno.systemPathToFileUrl(os.path.realpath(filepath))
uno_args = (
    createProp("Minimized", True),
)
document = desktop.loadComponentFromURL(
    fileUrl, "_default", 0, uno_args)
uno_args = (
    createProp("FilterName", "writer_pdf_Export"),
    createProp("Overwrite", False),
)
newpath = filepath[:-len("docx")] + "pdf"
fileUrl = uno.systemPathToFileUrl(os.path.realpath(newpath))
try:
    document.storeToURL(fileUrl, uno_args)  # Export
except ErrorCodeIOException:
    raise
try:
    document.close(True)
except CloseVetoException:
    raise

最后,由于速度是一个关注点,所以使用LibreOffice的侦听实例可能会很慢。若要更快地完成此操作,请将代码移动到宏中。阿普索提供了一个菜单来组织Python宏。然后像这样调用宏:

代码语言:javascript
运行
复制
soffice "vnd.sun.star.script:myscript.py$name_of_maindef?language=Python&location=user"

在宏中,从XSCRIPTCONTEXT而不是解析器获取文档对象。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61457120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档