簡體   English   中英

從python運行Libreoffice BASIC宏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM