我在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程序。有可能这样做吗?
谢谢:)
答案 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。