Collabora Office 23.05 帮助
您可以在 Python 脚本中调用 Collabora Office Basic 宏,从而访问一些重要的特性,比如:
Access2Base 库中Trace控制台之外的简单日志功能,
InputBox 和 MsgBox 等基于Basic的屏幕输入输出功能,从而方便Python中的开发,
调用 Xray,从而能够在调试过程中中断Python代码的执行,以对变量进行检查。
Collabora Office 的应用程序编程接口 (API) 脚本框架支持在 Python 和 Basic 之间(或者其他受支持的编程语言之间)的跨语言脚本执行。参数可以互相之间来回传递,仅需要该参数是各个语言都能够识别的基本数据类型、且脚本框架能够对该参数进行适当的类型转换。
我们建议您,在 Python, Basic, JavaScript 以及其他脚本引擎之间进行先跨语言调用之前,先熟悉 Python 的标准模块以及 Collabora Office 的API特性。
如果您是在集成开发环境 (IDE) 中运行 Python 脚本,此时 Collabora Office 内置的 Basic 引擎可能不存在,您应当避免在这种情况下进行从 Python 到 Collabora Office Basic 的调用。但无论如何,Python 环境以及“通用网络对象” (Universal Networks Objects, UNO) 总是可用的。更多信息,请参考:搭建集成开发环境以进行 Python 开发。
Collabora Office Basic macros can be personal, shared, or embedded in documents. In order to execute them, Python run time needs to be provided with Basic macro locations. Implementing the com.sun.star.script.provider.XScriptProvider interface allows the retrieval of executable scripts:
import uno
from com.sun.star.script.provider import Xscript
def getBasicScript(macro='Main', module='Module1', library='Standard',
isEmbedded=False) -> XScript:
'''Grab Basic script object before invocation.'''
ctx = uno.getComponentContext()
smgr = ctx.ServiceManager
if isEmbedded:
desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
scriptPro = desktop.CurrentComponent.getScriptProvider()
location = "document"
else:
mspf = smgr.createInstanceWithContext(
"com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
scriptPro = mspf.createScriptProvider("")
location = "application"
scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
"?language=Basic&location="+location
xScript = scriptPro.getScript(scriptName)
return xScript
Collabora Office 软件开发工具包 (SDK) 文档中的 com.sun.star.script.provider.XScript 界面部分详细描述了跨语言调用的约定。对函数的调用需要三个数组:
第一个列出被调用函数的各参数
第二个标注会被改变的参数
第三个存储返回值
results = script.invoke((prompt,buttons,title), (), ())
script.invoke((message,), tuple, ())
script.invoke((args), (), results)
Examples in Input/Output to Screen detail Python to Basic invocation calls. Monitoring Document Events illustrates the usage of *args Python idiom to print a variable number of parameters to Access2Base logging console dialog.
At time of development you can interrupt Python script execution using Xray extension in order to inspect properties and methods of UNO objects. The APSO extension debugger allows object introspection using either Xray either MRI extensions.
def xray(myObject):
script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
script.invoke((myObject,), (), ())
*argsPython simplified syntax can be used in conjunction with Collabora Office Basic routines that accept a variable number of arguments. Below Print and SUM Python functions call their Basic Print and SUM counterparts, using aforementioned getBasicScript function. Exception handling is not detailed.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
def Print(*args):
"""Outputs the specified strings or numeric expressions in a dialog box."""
xScript = getBasicScript("Print", "Scripting", embedded=True)
xScript.invoke((args), (), ())
def SUM(*args):
"""SUM the specified number expression."""
xScript = getBasicScript("SUM", "Scripting", embedded=True)
res = xScript.invoke((args), (), ())
return res[0]
# def getBasicScript() # see above
def playWithArgs():
Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
Print(SUM(45, -9.81, 297864.681974))
Print(SUM(45, -9.81, 297864.681974, 8762E+137))
g_exportedScripts = (playWithArgs,)
The Collabora Office Basic Print and SUM document-based routines accept a variable number of arguments. The Private or Public attributes have no effect. The arguments type checking is skipped for clarity.
Option Compatible ' "Standard.Scripting" module
Option Explicit
Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
''' Print item list of variable number '''
' all CStr() convertible args are accepted
Dim str As String, i As Integer
If UBound(args) >= 0 Then
For i = 0 To UBound(args)
str = str + Cstr(args(i))+ sep
Next i
End If
Print str
End Sub ' Standard.Scripting.Print()
Public Function SUM(ParamArray args() As Variant) As Variant
''' SUM a variable list of numbers '''
Dim ndx As Integer
If UBound(args) >= 0 Then
For ndx = 0 To UBound(args)
SUM = SUM + args(ndx)
Next ndx
End If
End Function ' Standard.Scripting.SUM()