从python运行Libreoffice BASIC宏

时间:2016-03-03 11:40:50

标签: python macros libreoffice basic libreoffice-calc

我在LibreOffice BASIC中有一个宏,我想从我的python程序中运行它。我找到了一些使用此代码的线程:

import os
import win32com.client

if os.path.exists("excelsheet.xlsm"):
    xl=win32com.client.Dispatch("Excel.Application")
    xl.Workbooks.Open(Filename="C:\Full Location\To\excelsheet.xlsm", ReadOnly=1)
    xl.Application.Run("excelsheet.xlsm!modulename.macroname")
##    xl.Application.Save() # if you want to save then uncomment this line and change delete the ", ReadOnly=1" part from the open function.
    xl.Application.Quit() # Comment this out if your excel script closes
    del xl

但这是针对Windows Excell程序而且我想要LibreOffice程序。有可能这样做吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

我首选的方法是将python脚本放在LibreOffice user directory的Scripts / python子文件夹中。然后在底部添加此功能:

def call_basic_macro():
    document = XSCRIPTCONTEXT.getDocument()
    frame = document.getCurrentController().getFrame()
    ctx = XSCRIPTCONTEXT.getComponentContext()
    dispatcher = ctx.ServiceManager.createInstanceWithContext(
        'com.sun.star.frame.DispatchHelper', ctx)
    url = document.getURL()
    macro_call = ('macro:///Standard.Module1.Macro1("%s")' % url)
    dispatcher.executeDispatch(frame, macro_call, "", 0, ())

g_exported_scripts=call_basic_macro,

现在通过转到Tools -> Macros -> Run Macro从Writer运行python脚本。展开My Macros并选择脚本名称。

另一种看起来更接近Excel示例的方法是使用系统调用启动LibreOffice的侦听实例:

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

我通常在shell脚本(Windows上的批处理文件)而不是python中执行该部分。然后在python中,从实例中获取文档上下文:

import uno
localContext = uno.getComponentContext()

之后,代码看起来与上面的类似。请注意,在Windows上使用此方法时,必须使用LibreOffice附带的python.exe才能加载uno模块。

第三种方法是简单地进行系统调用:

soffice "macro:///Standard.Module1.Macro1()"

有关第三种方法的更多信息,请参阅https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232