libreoffice表格python宏教程 一
一、安装python宏扩展
LibreOffice自带了一个宏编辑器,但是只能用basic语言,无法用Python。
所以,我们必须在单独的编辑器中编写Python代码。
需要安装apso扩展,此扩展可以创建删除管理python宏文件,同时还能设置偏好编辑器
下面是扩展下载地址
https://extensions.libreoffice.org/en/extensions/show/apso-alternative-script-organizer-for-python
二、创建宏
1、python宏位置
有三个位置,每个位置都叫做容器:
(1)我的宏
(2)应用程序宏
(3)嵌在文档中的宏
文档宏嵌入在文档中,仅在文档处于打开状态时可访问。
Python宏有三级组织:库、模块、宏
库是文件夹。要创建一个库,先在目标容器中新建文件夹。库的名称就是文件夹的名称。
模块是单个python文件。创建模块就是新建文件。
宏是模块中的单个函数。
2、创建宏
选择菜单“工具-宏-organize python scripts”调出对话框
选择任何一个容器
点击“menu-create module”,输入文件名,创建python文件
三、编写宏
右击上面创建的python文件,点击edit
之后就会使用默认编辑器打开python文件。
我用的是vscode,所以会自动使用vscode打开python文件。
宏就是函数,所以必须先定义函数,这样在运行python宏时,才能找到它并运行。
参考教程
https://help.libreoffice.org/latest/zh-CN/text/sbasic/python/main0000.html?&DbPAR=BASIC&System=UNIX
https://wiki.documentfoundation.org/Documentation/DevGuide
https://wiki.documentfoundation.org/Documentation/DevGuide/Professional_UNO
四、运行宏
编写完函数之后,就可以运行了
选择「工具 – 宏 – 运行宏 」调出对话框,选择相应的Python宏并运行
五、常用api
libreoffice提供给python的api,主要是uno.py。
但为了方便,还提供了一个全局对象XSCRIPTCONTEXT,可从XSCRIPTCONTEXT单对象推断出所有UNO对象。
当然也可以不使用全局对象,而是直接使用uno.py里面的函数,不过不如使用XSCRIPTCONTEXT方便。
先说一个约定,api中所有函数首字母小写,所有数据成员首字母大写。
(一)基本
获取libreoffice应用程序
odesktop = XSCRIPTCONTEXT.getDesktop()
获取上下文
ctx = XSCRIPTCONTEXT.getComponentContext()
或者
import uno
ctx = uno.getComponentContext()
创建服务的实例
smgr = ctx.getServiceManager()
obj = smgr.createInstanceWithContext( 'com.sun.star.frame.Desktop', ctx)
创建结构体对象
from com.sun.star.beans import PropertyValue
p=PropertyValue()
p.Name='FilterName'
p.Value='calc_pdf_Export'
或者
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'ToPoint'
struct.Value = 'Sheet1.A1'
文件的路径
由于libreOffice是一种与平台无关的应用程序,因此,它使用Internet Standard RFC 1738中的URL表示法。
此表示法以前缀file:///
开头,后跟本地路径。如果文件名包含子目录,则使用/分隔这些子目录。
以下路径表示C:的doc目录中的test.odt文件。
file:///C:/doc/test.odt
文件名中ascii字符只允许使用 0-9a-zA-Z 字符。其他ascii字符必须使用转义编码。转义编码是ascii码的十六进制值,并在前面加上百分号。例如,本地文件名中的空格为%20。
返回文件的系统路径。
uno.fileUrlToSystemPath()
例子
uno.fileUrlToSystemPath("file:///C:/doc/test.ods") #(under Windows) c:\doc\test.ods
返回指定系统路径的文件URL。
uno.systemPathToFileUrl()
例子
uno.systemPathToFileUrl("C:\doc\test.ods") #file:///C:/doc/test.ods
从指定url返回文件的绝对url。
uno.absolutize()
(二)文档
1、获取文档
获取当前文档
odoc = XSCRIPTCONTEXT.getDocument()
当前文档路径
odoc.URL
例子
import os, uno
odoc = XSCRIPTCONTEXT.getDocument()
if os.name == "nt":
directory = os.path.dirname(uno.fileUrlToSystemPath(odoc.URL))
else:
directory = os.path.dirname(odoc.URL)[7:]
2、打开文档
Desktop的loadComponentFromURL方法,负责创建、打开文档。
loadComponentFromURL( [in] string URL, [in] string TargetFrameName, [in] long SearchFlags, [in] sequence<com::sun::star::beans::PropertyValue> Arguments )
第一个参数是文件的URL。
第二个参数是框架的名称。一般就是 “_blank”
第三个是如何查找指定框架名称的标志。一般就是0
第四个指定了参数列表。是com::sun::star::beans::PropertyValue
结构体的元组。一般就是()
例子
odesktop = XSCRIPTCONTEXT.getDesktop()
Url = "file:///C:/test.ods"
odoc = odesktop.loadComponentFromURL(Url, "_blank", 0, ())
3、创建文档
创建文档也是使用loadComponentFromURL方法,只不过第一个参数改成"private:factory/scalc"
例子
odesktop = XSCRIPTCONTEXT.getDesktop()
odoc = odesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, ())
4、保存文档
(1)使用store
odoc = XSCRIPTCONTEXT.getDocument()
odoc.store()
(2)新文档需要使用 storeAsURL 方法。
这个方法就是另存为。
storeAsURL ([in] string sURL, [in] sequence< com::sun::star::beans::PropertyValue > lArguments)
第一个参数是文件url
第二个参数是参数列表。一般就是()。是com::sun::star::beans::PropertyValue
结构体的元组。PropertyValue结构体有以下属性
https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1MediaDescriptor.html
例子
odesktop = XSCRIPTCONTEXT.getDesktop()
odoc = odesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, ())
Url = "file:///C:/test3.ods"
odoc.storeAsURL(Url, ())
文档还提供了一些方法,这些方法在保存文档时非常有用。这些方法是:
hasLocation() 是否已经为文档指定了URL。
isReadonly() 文档是否具有只读保护。
isModified() 在上次保存后是否修改了文档。
例子
if odoc.isModified():
if odoc.hasLocation() and (not odoc.isReadOnly()):
odoc.store()
else
odoc.storeAsURL(Url, ())
本示例首先检查在上次保存后是否修改了相关文档。只有修改过,它才会继续执行保存过程。如果已经为文档指定了URL并且文档不是只读文档,则在现有URL下保存该文档。如果文档没有URL或以只读状态打开文档,则在新URL下保存文档。
使用第二个参数的例子
from com.sun.star.beans import PropertyValue
odoc = XSCRIPTCONTEXT.getDocument()
properties=[]
p=PropertyValue()
p.Name='Overwrite'
p.Value=True
properties.append(p)
Url = "file:///c:/test3.ods"
odoc.storeAsURL(Url, tuple(properties))
如果已存在同名文件,就覆盖保存。
(3)使用storeToURL
这个方法就是导出。
storeToURL ([in] string sURL, [in] sequence< com::sun::star::beans::PropertyValue > lArguments)
例子
导出为pdf
from com.sun.star.beans import PropertyValue
odoc = XSCRIPTCONTEXT.getDocument()
properties=[]
p=PropertyValue()
p.Name='FilterName'
p.Value='calc_pdf_Export'
properties.append(p)
odoc.storeToURL('file:///tmp/test.pdf',tuple(properties))
给文档设置密码:
from com.sun.star.beans import PropertyValue
odoc = XSCRIPTCONTEXT.getDocument()
properties=[]
p=PropertyValue()
p.Name='Password'
p.Value='123456'
properties.append(p)
odoc.storeToURL('file:///tmp/test.ods',tuple(properties))
5、关闭文档
odoc.dispose()
(三)工作表
每个文档可能包含几张表格,简称工作表。
文档的Sheets表示所有工作表。
1、获取工作表
(1)通过编号获取(编号从0开始)
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
或者
Sheet =odoc.Sheets[0]
(2)通过名称获取
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByName("Sheet 1")
2、设置工作表为当前工作表
odoc = XSCRIPTCONTEXT.getDocument()
osheet =odoc.Sheets.getByName("Sheet 1")
odoc.getCurrentController.setActiveSheet(osheet)
3、创建工作表
使用odoc.createInstance("com.sun.star.sheet.Spreadsheet")
创建工作表
使用sheets.insertByName
方法将其插入工作表列表中
例子
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
if odoc.Sheets.hasByName('MySheet'):
Sheet = odoc.Sheets.getByName('MySheet')
else:
Sheet = odoc.createInstance("com.sun.star.sheet.Spreadsheet")
odoc.Sheets.insertByName("MySheet", Sheet)
除了上面的方法还有一个方法
sheets.insertNewByName ([in] string aName, [in] short nPosition)
4、删除工作表
使用sheets.removeByName([in] string aName)
5、移动工作表
使用sheets.moveByName ([in] string aName, [in] short nDestination)
6、复制工作表
使用sheets.copyByName ([in] string aName, [in] string aCopy, [in] short nDestination)
7、设置密码
sheet.protect(password)
sheet.unprotect(password)
sheet.isProtected()
(四)行列
1、获取工作表的行和列
通过工作表的Rows和Columns获得。
以下示例获取工作表的第一行和第一列,编号从0开始。
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByName("Sheet 1")
FirstCol = Sheet.Columns[0]
FirstRow = Sheet.Rows[0]
获取总行数和总列数
Sheet.Rows.getCount()
Sheet.Columns.getCount()
设置列为最佳宽度
col.OptimalWidth = True
设置行为最佳高度
row.OptimalHeight = True
以下示例把工作表中的前五行设置为最佳高度。
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByName("Sheet 1")
for i in range(5):
row = Sheet.Rows[i]
row.OptimalHeight = True
2、增加行列
使用insertByIndex方法插入行或列
Sheet.Rows.insertByIndex(3, 1)
第1个参数是插入的位置,第二个参数是插入的行数
示例
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
Sheet.Columns.insertByIndex(3, 1)
Sheet.Rows.insertByIndex(3, 1)
在第四列的位置插入了一个新列(索引为3,编号从0开始),第二个参数指定要插入的列数。
3、删除行列
使用removeByIndex方法删除行或列
sheet.getRows().removeByIndex(start_row,nb_rows)
例子
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
Sheet.Columns.removeByIndex(5, 1)
Sheet.Rows.removeByIndex(5, 1)
删除了第六列(索引为5),第二个参数指定要删除的列数。
(五)单元格
单元格英文叫cell
1、获取单元格
(1)使用坐标获取单元格
左上角单元格位置为(0,0),x坐标向右,y坐标向下。
以下示例获取左上角单元格:
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
Cell = Sheet.getCellByPosition(0, 0)
(2)使用名称获取单元格
除了坐标以外,每个单元格都有名称,例如,左上角的单元格 (0,0) 称为A1。字母A表示列,数字1表示行。切勿将单元格的名称和坐标混淆,因为名称的行计数从1开始,而坐标计数从0开始。
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
Sheet.getCellRangeByName("C4")
获取单元格的行号和列号
cell.getCellAddress().Column
cell.getCellAddress().Row
获取单元格所在的工作表
cell.getCellAddress().Sheet
2、操作单元格
获取单元格之后,我们就可以操作单元格了
(1)读取单元格
单元格内容由单元格类型决定
类型有四种TEXT, EMPTY, VALUE, FORMULA(from com.sun.star.table.CellContentType import TEXT, EMPTY, VALUE, FORMULA)
使用如下函数获得类型
cell.getType()
或者直接使用
cell.Type
读取内容时,不同类型要读取不同的属性
当类型是VALUE时,使用cell.getValue() or cell.Value
当类型是TEXT时,使用cell.getString() or cell.String
当类型是FORMULA时,使用cell.getFormula() or cell.Formula
例子
from com.sun.star.table.CellContentType import EMPTY, VALUE, TEXT, FORMULA
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
Cell = Sheet.getCellByPosition(1,1)
if Cell.Type == EMPTY:
rlt = None
elif Cell.Type == VALUE:
rlt = cell.Value
elif Cell.Type == TEXT:
rlt = cell.String
elif Cell.Type == FORMULA:
rlt = cell.Formula
(2)写入单元格
同样要根据类型设置相应的属性
cell.setValue(value) or cell.Value=value
cell.setString(string) or cell.String=string
cell.setFormula(formula) or cell.Formula=formula
例子
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
Cell = Sheet.getCellByPosition(0, 0)
Cell.Value = 100
Cell = Sheet.getCellByPosition(0, 1)
Cell.String = "Test"
Cell = Sheet.getCellByPosition(0, 2)
Cell.Formula = "=A1"
本示例在单元格A1至A3中分别插入了一个数字、一段文本、一个公式。
使用String属性的单元格,其中的内容视为文本,即使该内容为数字也是如此。数字在单元格中左对齐,而不是右对齐。
在使用公式时,也要注意文本和数字的区别:
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
Cell = Sheet.getCellByPosition(0, 0)
Cell.Value = 100
Cell = Sheet.getCellByPosition(0, 1)
Cell.String = 1000
Cell = Sheet.getCellByPosition(0, 2)
Cell.Formula = "=A1+A2"
虽然单元格A1包含值100,单元格A2包含值1000,但公式A1+A2返回值100。这是因为单元格A2使用是String属性,而不是Value。
(3)设置单元格背景色
cell.CellBackColor=-1 (no color)
cell.CellBackColor=0 (black)
cell.CellBackColor=255 (blue)
cell.CellBackColor=0xFF0000 (red)
3、插入、删除、复制、移动单元格
同单元格区域
(六)单元格区域
单元格区域英文叫cellrange
1、获取单元格区域
(1)通过坐标获取单元格区域
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
CellRange = Sheet.getCellRangeByPosition(0,0,2,14)
四个参数分别表示左、上、右、下
(2)通过名称获取单元格区域
使用冒号(:)来指定单元格区域。
例如,A1:C15表示A、B、C列中1至15行的所有单元格。
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
CellRange = Sheet.getCellRangeByName("A1:C15")
还可以继续获取单元格区域中的单元格
以下示例获取单元格C3。
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
CellRange = Sheet.getCellRangeByName("B2:D4")
Cell = CellRange.GetCellByPosition(1, 1)
获取单元格区域的坐标范围
cellrange.getRangeAddress().StartRow
cellrange.getRangeAddress().StartColumn
cellrange.getRangeAddress().EndRow
cellrange.getRangeAddress().EndColumn
(3)获取使用区域
cursor = sheet.createCursor()
cursor.gotoStartOfUsedArea(False)
cursor.gotoEndOfUsedArea(True)
cellrangeaddress = cursor.getRangeAddress()
2、操作单元格区域
(1)读取单元格区域
将单元格区域内容读取为数组
cellrange.getDataArray()
(2)清除单元格区域内容
clearContents(flags) 方法简化了删除单元格区域内容的过程,因为它从单元格区域中删除一种特定类型的内容。
flags是com.sun.star.sheet.CellFlags中的常量。有以下值:
VALUE 未设置为日期或时间格式的数字值
DATETIME 设置为日期或时间格式的数字值
STRING 字符串
ANNOTATION 链接到单元格的注释
FORMULA 公式
HARDATTR 单元格的直接格式
STYLES 间接格式
OBJECTS 连接到单元格的绘图对象
EDITATTR 仅适用于部分单元格的字符格式
也可以将常量相加
以下示例从B2:C3区域中删除所有字符串和直接格式信息。
from com.sun.star.sheet.CellFlags import STRING, HARDATTR
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
CellRange = Sheet.getCellRangeByName("B2:C3")
Flags = STRING + HARDATTR
CellRange.clearContents(Flags)
(3)计算单元格区域的值
使用computeFunction(func) 方法计算单元格区域的值。
func是 com.sun.star.sheet.GeneralFunction枚举,表示要使用的数学函数。
可以使用以下值:
SUM 所有数字值的总和
COUNT 所有值的总数(包括非数字值)
COUNTNUMS 所有数字值的总数
AVERAGE 所有数字值的平均值
MAX 最大数字值
MIN 最小数字值
PRODUCT 所有数字值的乘积
STDEV 标准偏差
VAR 方差
STDEVP 基于总体的标准偏差
VARP 基于总体的方差
以下示例计算A1:C3区域的平均值:
from com.sun.star.sheet.GeneralFunction import AVERAGE
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
CellRange = Sheet.getCellRangeByName("A1:C3")
rlt = CellRange.computeFunction(AVERAGE)
(4)搜索和替换单元格内容
使用replaceAll(ReplaceDescriptor)替换全部搜索到的内容
ReplaceDescriptor是用于搜索和替换的描述符对象。
示例:
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
ReplaceDescriptor = Sheet.createReplaceDescriptor()
ReplaceDescriptor.SearchString = "is"
ReplaceDescriptor.ReplaceString = "was"
for i in range(odoc.Sheets.getCount()):
Sheet = odoc.Sheets[i]
Sheet.replaceAll(ReplaceDescriptor)
此示例使用文档的第一个工作表创建一个ReplaceDescriptor,然后通过循环将其应用于所有工作表。
3、插入、删除、复制、移动单元格区域
(1)插入单元格区域
使用insertCells(cellrangeaddress,cellinsertmode)
插入单元格区域
第一个参数是com.sun.star.table.CellRangeAddress结构。表示要插入的目标位置。
该结构中包含以下值:
Sheet (short) 工作表编号(编号从0开始)。
StartColumn (long) 单元格区域中的第一列(编号从0开始)。
StartRow (long) 单元格区域中的第一行(编号从0开始)。
EndColumn (long) 单元格区域中的最后一列(编号从0开始)。
EndRow (long) 单元格区域中的最后一行(编号从0开始)。
第二个参数是com.sun.star.sheet.CellInsertMode枚举值,它定义了如何处理位于插入位置的值。
CellInsertMode枚举有以下值:
NONE 当前值保留在目前位置。
DOWN 插入位置及其下面的单元格向下移动。
RIGHT 插入位置及其右侧的单元格向右移动。
ROWS 插入位置之后的行向下移动。
COLUMNS 插入位置之后的列向右移动。
示例
from com.sun.star.table import CellRangeAddress,CellAddress
from com.sun.star.sheet.CellInsertMode import DOWN
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
cellRangeAddress = CellRangeAddress()
cellRangeAddress.Sheet = 0
cellRangeAddress.StartColumn = 1
cellRangeAddress.StartRow = 1
cellRangeAddress.EndColumn = 2
cellRangeAddress.EndRow = 2
Sheet.insertCells(cellRangeAddress, DOWN)
本示例在第一个工作表(编号为0)中的第二列、第二行交叉处(行号和列号均为1)插入了一个大小为两行乘两列的单元格区域。指定单元格区域内的任何现有值都将移到该区域之下。
(2)删除单元格区域
使用removeRange(cellrangeadress, celldeletemode)
方法删除单元格区域
第一个参数是CellRangeAddress结构,表示要删除的目标区域。
第二个参数是com.sun.star.sheet.CellDeleteMode枚举,表示删除后其它单元格如何移动。
此枚举有以下值:
NONE 当前值保留在当前位置。
UP 插入位置及其下面的单元格向上移动。
LEFT 插入位置及其右侧的单元格向左移动。
ROWS 插入位置之后的行向上移动。
COLUMNS 插入位置之后的列向左移动。
例子
from com.sun.star.table import CellRangeAddress,CellAddress
from com.sun.star.sheet.CellDeleteMode import UP
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
cellRangeAddress = CellRangeAddress()
cellRangeAddress.Sheet = 0
cellRangeAddress.StartColumn = 1
cellRangeAddress.StartRow = 1
cellRangeAddress.EndColumn = 2
cellRangeAddress.EndRow = 2
Sheet.removeRange(cellRangeAddress, UP)
本示例删除B2:C3单元格区域,然后将下面的单元格向上移动两行。
(3)移动单元格
使用moveRange(celladress, CellRangeAddress)
方法移动单元格区域
第一个参数是com.sun.star.table.CellAddress结构,表示要移动到的目标位置。
CellAddress方法提供了以下值:
Sheet (short) 电子表格编号(编号从0开始)。
Column (long) 目标列的编号(编号从0开始)。
Row (long) 目标行的编号(编号从0开始)。
第二个参数是移动的来源单元格区域。
moveRange方法会覆盖目标区域中的单元格内容。
以下示例移动B2:C3区域到A6:
from com.sun.star.table import CellRangeAddress,CellAddress
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
cellRangeAddress = CellRangeAddress()
cellRangeAddress.Sheet = 0
cellRangeAddress.StartColumn = 1
cellRangeAddress.StartRow = 1
cellRangeAddress.EndColumn = 2
cellRangeAddress.EndRow = 2
cellAddress = CellAddress()
cellAddress.Sheet = 0
cellAddress.Column = 0
cellAddress.Row = 5
Sheet.moveRange(cellAddress, cellRangeAddress)
(4)复制单元格
copyRange方法与moveRange方法的工作方式相同,所不同的是copyRange插入单元格区域的副本而不是移动该区域。
以下示例复制第一张工作表的B2:C3区域到第三张工作表的A6:
from com.sun.star.table import CellRangeAddress,CellAddress
odoc = XSCRIPTCONTEXT.getDocument()
Sheet =odoc.Sheets.getByIndex(0)
cellRangeAddress = CellRangeAddress()
cellRangeAddress.Sheet = 0
cellRangeAddress.StartColumn = 1
cellRangeAddress.StartRow = 1
cellRangeAddress.EndColumn = 2
cellRangeAddress.EndRow = 2
cellAddress = CellAddress()
cellAddress.Sheet = 2
cellAddress.Column = 0
cellAddress.Row = 5
Sheet.copyRange(cellAddress, cellRangeAddress)
(七)创建消息框
python的print不显示,想要调试就要使用消息框
1、使用libreoffice自带的api
(1)第一种方法
例子
from com.sun.star.awt.MessageBoxType import MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX
from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY
from com.sun.star.awt.MessageBoxResults import OK, YES, NO, CANCEL
def pty():
result = MessageBox('hello')
def MessageBox(MsgText, MsgButtons=BUTTONS_OK):
odoc = XSCRIPTCONTEXT.getDocument()
parentwin = odoc.CurrentController.Frame.ContainerWindow
myBox = parentwin.getToolkit().createMessageBox(parentwin, MESSAGEBOX, MsgButtons, 'bt', MsgText)
return myBox.execute()
(2)第二种方法
注意:这种方法有一些问题,比如消息框位置不对,无法点击x关闭。
例子
from msgbox import MsgBox
def pty():
odoc = XSCRIPTCONTEXT.getDocument()
MessageBox('hello')
def MessageBox(MsgText):
mb = MsgBox(uno.getComponentContext())
mb.addButton("Ok")
mb.show(MsgText, 0, "bt")
2、使用apso扩展提供的api
apso扩展提供一个模块apso_utils。这个模块中有一个消息框函数
msgbox(message, title='Message', boxtype='message', buttons=1, win=None)
注意:使用这个函数,必须通过“工具-宏-organize python scripts”中的“Execute”来执行宏
例子
from apso_utils import msgbox
def pty():
odoc = XSCRIPTCONTEXT.getDocument()
msgbox(odoc.Title)
六、使用调度器
import uno
ctx = uno.getComponentContext()
smgr = ctx.getServiceManager()
dispatcher = smgr.createInstanceWithContext( "com.sun.star.frame.DispatchHelper", ctx)
odoc = XSCRIPTCONTEXT.getDocument()
ctlr = odoc.getCurrentController()
# enter a string
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'StringName'
struct.Value = 'Hello World!'
dispatcher.executeDispatch(ctlr, ".uno:EnterString", "", 0, tuple([struct]))
# focus / go to cell
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'ToPoint'
struct.Value = 'Sheet1.A1'
dispatcher.executeDispatch(ctlr, ".uno:GoToCell", "", 0, tuple([struct]))
# drag and autofill
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'EndCell'
struct.Value = 'Sheet1.A10'
dispatcher.executeDispatch(ctlr, ".uno:AutoFill", "", 0, tuple([struct]))
# recalculate
dispatcher.executeDispatch(ctlr, ".uno:Calculate", "", 0, tuple([]))
# unDo
dispatcher.executeDispatch(ctlr, ".uno:Undo", "", 0, ())
# reDo
dispatcher.executeDispatch(ctlr, ".uno:Redo", "", 0, ())
# quit LibreOffice
dispatcher.executeDispatch(ctlr, ".uno:Quit", "", 0, ())
# insert rows
dispatcher.executeDispatch(ctlr, ".uno:InsertRows", "", 0, ())
# delete rows
dispatcher.executeDispatch(ctlr, ".uno:DeleteRows", "", 0, ())
# insert columns
dispatcher.executeDispatch(ctlr, ".uno:InsertColumns", "", 0, ())
# delete columns
dispatcher.executeDispatch(ctlr, ".uno:DeleteColumns", "", 0, ())
# copy, cut, paste
dispatcher.executeDispatch(ctlr, ".uno:Copy", "", 0, ())
dispatcher.executeDispatch(ctlr, ".uno:Cut", "", 0, ())
dispatcher.executeDispatch(ctlr, ".uno:Paste", "", 0, ())
# clear contents of column A
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'Flags'
struct.Value = 'A'
dispatcher.executeDispatch(ctlr, ".uno:Delete", "", 0, tuple([struct]))
# saveAs
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'URL'
struct.Value = 'file:///Users/christopherbourez/Documents/test_save.ods'
dispatcher.executeDispatch(ctlr, ".uno:SaveAs", "", 0, tuple([struct]))
# open
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'URL'
struct.Value = 'file:///Users/christopherbourez/Documents/test.ods'
dispatcher.executeDispatch(ctlr, ".uno:Open", "", 0, tuple([struct]))
查找调度命令
http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_3.x_Commands
包含一个命令列表。
作者:int8