如何在LibreOffice Calc中跨文档调用运行另一文档的脚本
问题1:解除test2文档宏安全限制
- 先配置全局受信任位置:打开LibreOffice,依次进入「工具」→「选项」→「安全」→「宏安全性」,将test1、test2所在的文件夹添加到「受信任位置」列表,该配置优先级高于单文档加载设置,是避免宏被系统拦截的核心前提。如果不想添加受信任位置,也可以将宏安全等级调整为「中」,每次打开文档时手动确认允许运行宏即可。
- 你现有代码里的
MacroExecutionMode属性配置无需修改,和上面的全局配置配合后,打开的test2就可以手动正常运行内置宏。
问题2:从test1脚本触发test2的指定宏
你可以通过加载完成的test2文档对象获取脚本提供者,再按路径调用对应宏即可,完整修改后的代码如下:
REM ***** BASIC ***** 'Script on Test1 Sub Main Dim urlDest As String Dim PropFich(1) As New com.sun.star.beans.PropertyValue Dim oDocDest As Object Dim oScriptProvider As Object Dim oScript As Object Dim sMacroPath As String ' 配置文档加载属性,允许宏运行 PropFich(0).Name = "MacroExecutionMode" PropFich(0).value = com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE ' 不需要隐藏test2窗口的话可以删掉下面两行配置 PropFich(1).Name = "Hidden" PropFich(1).value = False urlDest = ConvertToUrl("/home/patrick/Bureau/Test/test2.ods") oDocDest = StarDesktop.loadComponentFromUrl(urlDest, "_blank", 0, PropFich()) ' 宏路径规则:vnd.sun.star.script:[库名].[模块名].[方法名]?language=Basic&location=document ' location=document表示宏保存在文档内部,不是LibreOffice全局宏 sMacroPath = "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document" oScriptProvider = oDocDest.getScriptProvider() oScript = oScriptProvider.getScript(sMacroPath) ' 如果目标宏需要传参,将参数按顺序放到第一个Array()中即可 oScript.invoke(Array(), Array(), Array()) End Sub
如果调用时报找不到脚本的错误,打开test2按Alt+F11进入宏编辑器,确认目标宏的库名、模块名、方法名和路径里写的完全一致即可。
内容的提问来源于stack exchange,提问作者patol
相关产品推荐
相关产品推荐

