LibreOffice Basic向Python脚本传递CellRange变量的问题咨询
LibreOffice Basic向Python脚本传递CellRange变量的问题咨询
我正在为LibreOffice Calc编写第一个Python脚本。跟着各类指南安装了APSO,还成功写了一个Basic包装器用来调用Python脚本,它的签名如下:Function python(functionName As String, ParamArray params) As Variant
其中:
functionName是要调用的Python方法名称params是需要传递的参数
(注:由于Python方法会根据functionName不同而变化,所以params数组没有预定义的大小和元素类型)
这个包装器大部分场景下都能正常工作,唯独当参数是单元格区域时会出问题:单元格区域被传递给Python时会被转换成一个元组,完全丢失了行和列的引用信息。
我有两个疑问:
- 为什么Basic会把单元格区域转换成元组,而不是直接传递CellRange对象?
- 有没有办法检测
params元素的类型,这样我就能单独对单元格区域做特殊处理?我试过用TypeName(params(0)),但它好像只对字符串这类基础类型有效,如果参数是单元格区域,它返回的是Variant()。
EDIT 1
可能刚才的问题描述不够清晰,补充一些细节。下面是我编写的完整Basic包装器代码:
REM ***** BASIC ***** option compatible Function python(functionName As String, ParamArray params) As Variant Dim scriptPro As Object, myScript As Object scriptPro = ThisComponent.getScriptProvider() scriptPath = "vnd.sun.star.script:development.py$" & functionName & "?language=Python&location=user" On Error GoTo ErrorHandler myScript = scriptPro.getScript(scriptPath) Dim outResult As Variant outResult = myScript.invoke(params, Array(), Array()) python = outResult(0) Exit Function ErrorHandler: python = CVErr(xlErrName) End Function
我是在Calc的公式栏中调用这个包装器的,举两个例子:
- 调用
=python("custom_concatenate", "Hello ", "world")时,会把两个字符串"Hello "和"world"传给Python方法custom_concatenate,最终单元格会显示Hello world,这个完全正常。 - 调用
=python("sum_all", A1:A10)时,会把A1到A10单元格里的值以值的元组形式传给Python方法sum_all,求和结果也能正常显示在单元格中。
现在我想实现一个新方法,接收一个单元格区域,返回它的首行号和末行号的和。比如调用=python("sum_row_numbers", B13:C24),这个方法应该计算首行号13和末行号24的和,返回37。
对应的Python方法签名是:def sum_row_numbers(range):
但问题在于,包装器传过来的range参数只是一个元组的元组,完全没有行和列的引用信息。
请问我该怎么让包装器把包含单元格引用的完整区域信息传递给Python方法呢?
备注:内容来源于stack exchange,提问作者user2572526
相关产品推荐
相关产品推荐

