目录

# 用 Python 脚本编程

Python 宏是 .py 文件 (即模块) 中的单个函数。与 LibreOffice Basic 及其丰富的 UNO 对象函数或服务 不同，Python 宏使用 XSCRIPTCONTEXT UNO 单对象，与 JavaScript 和 BeanShell 共享。全局变量 g_exportedScripts 可列出模块中可选择的宏。Python 模块包含自动代码逻辑，互相独立。

## XSCRIPTCONTEXT 全局变量

可从 XSCRIPTCONTEXT 全局变量推断出所有 Basic UNO 对象。参考 LibreOffice API 中完整的 XSCRIPTCONTEXT 描述。XSCRIPTCONTEXT 方法小结:

方法 | 描述 | 在 Basic 中映射为
--- | --- | ---
getDocument() | 脚本可操作的文档引用。 | ThisComponent
getDesktop() | 脚本可操作的桌面引用。 | StarDesktop
getComponentContext() | 脚本可用来创建其他 uno 组件的组件上下文。 | GetDefaultContext

安装的共享脚本「HelloWorld」与「Capitalise」演示了利用 XSCRIPTCONTEXT 全局变量的 UNO 相关的宏。

从「工具 - 宏 - 运行宏」菜单运行 Python 宏时，Python 标准输出文件不可用。更多信息请参考「屏幕输入/输出」。

## 模块导入

XSCRIPTCONTEXT 对导入模块不可用。

LibreOffice Basic 库包含类、例行程序与变量，Python 模块包含类、函数与变量。常用的 Python 或 UNO 功能必须存储在「我的宏」，路径为「(用户配置文件目录)/Scripts/python/pythonpath」。Python 库有助于组织模块，避免模块命名冲突。在共享模块中导入「uno.py」。

可使用 uno.py 模块推断出所有 Basic UNO 对象。可通过「Python 交互式 shell」使用 dir() 与 help() Python 命令获取完整的模块描述。

函数 | 描述 | 在 Basic 中映射为
--- | --- | ---
absolutize() | 从指定 url 返回文件的绝对 url。 |
createUnoStruct() | 根据 typeName 创建 UNO 结构或异常。 | CreateUNOStruct()
fileUrlToSystemPath() | 返回系统路径。 | ConvertFromURL()
getClass() | 返回具体 UNO 异常、结构或接口的类。 |
getComponentContext() | 返回用于初始化 Python 运行时的 UNO 组件上下文。 | GetDefaultContext()
Enum() getConstantByName() | 通过精确名称查找 IDL 常量的值。 | 参见「API 常量组」
isInterface() | 当 obj 为 UNO 接口的类时返回 True。 |
systemPathToFileUrl() | 返回指定系统路径的文件 URL。 | ConvertToURL()

LibreLogo, NamedRanges, SetCellColor and TableSample preinstalled scripts use uno.py module.

## 更多 Python-Basic 示例

Python UNO | Basic UNO 功能
--- | ---
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() obj = smgr.createInstanceWithContext( .. , ctx) | CreateUnoService()
参见《打开对话框》 | CreateUnoDialog()
参见《创建监听器》 | CreateUnoListener()
参见「UNO 数据类型」 | CreateUnoValue() CreateObject()
Use "==" or "!=" comparison operators | EqualUnoObjects()
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() | GetProcessServiceManager()
def hasUnoInterfaces(obj, *interfaces): return set(interfaces).issubset(t.typeName for t in obj.Types) | HasUnoInterfaces()
| IsUnoStruct()
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() DESK = 'com.sun.star.frame.Desktop' desktop = smgr.createInstanceWithContext(DESK , ctx) | StarDesktop
desktop = smgr.createInstanceWithContext(DESK , ctx) doc = desktop.CurrentComponent | ThisComponent

## Importing an embedded Module

Similarly to LibreOffice Basic that supports browsing and dynamic loading of libraries, Python libraries can be explored and imported on demand. For more information on library containers, visit LibreOffice Application Programming Interface (API) or download LibreOffice Software Development Kit (SDK).

Importing a Python document embedded module is illustrated below, exception handling is not detailed:

                import uno, sys, zipimport

                def load_library(library_name: str, module_name=None):
                    """ 载入库并导入模块

                    引自 Hubert Lambert《函数库》
                    位于 https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
                    doc = XSCRIPTCONTEXT.getDocument()  # 当前文档
                    url = uno.fileUrlToSystemPath( \
                        '{}/{}'.format(doc.URL, 'Scripts/python'+library_name))  # ConvertToURL()
                    if not url in sys.path:  # 如果需要，添加路径
                        sys.path.insert(0, url)  # doclib 优先
                    if module_name:  # 如果需要则导入
                        return zipimport.zipimporter(url).load_module(module_name)

                def import_embedded_python():
                    ui = load_library("my_gui",'screen_io')  # 添加 <lib> 库路径 + 导入 <module> 模块
                    ui.MsgBox(sys.modules.keys())

                g_exportedScripts = (import_embedded_python,)  # Public macros

相关主题

Basic UNO 对象、函数与服务

导入 Python 模块

屏幕输入/输出

LibreOffice Python 脚本帮助