[英]Running Libreoffice BASIC macro from python
我在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程序。 是否有可能做到這一點?
謝謝 :)
我的首選方式是將python腳本放入LibreOffice用戶目錄的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 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.