Libreoffice Basic: как передавать переменные CellRange в скрипты PythonPython

Программы на Python
Ответить
Anonymous
 Libreoffice Basic: как передавать переменные CellRange в скрипты Python

Сообщение Anonymous »

Я работаю над своим первым скриптом Python для Libre Office Calc.
Следуя различным руководствам, я установил APSO и успешно создал оболочку Basic, которая вызывает скрипт Python.

Это его подпись:

Код: Выделить всё

Function python(functionName As String, ParamArray params) As Variant
Где:

Код: Выделить всё

functionName
— имя вызываемого метода Python.
— передаваемые параметры.

(ПРИМЕЧАНИЕ. Поскольку метод Python варьируется в зависимости от имени функции, массив params не имеет предопределенного размера и типов элементов)< /p>
Это работает очень хорошо, за исключением случаев, когда параметр является диапазоном ячеек. В этом случае диапазон ячеек передается в Python как кортеж, без информации о ссылках на строки и столбцы.
Почему необходимо конвертировать диапазон ячеек в кортеж, а не в объект CellRange ?

Есть ли способ определить типы элементов params, чтобы можно было по-разному управлять диапазонами ячеек? (Я пытался использовать TypeName(params(0)), но, похоже, он работает только с базовыми типами, такими как «Строки», если параметр представляет собой диапазон ячеек, он возвращает Variant()

РЕДАКТИРОВАТЬ 1

Немного подробнее, поскольку мой вопрос был недостаточно ясен

Вот полная оболочка, которую я написал на базовом языке. :

Код: Выделить всё

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")  
Вызывает метод Python custom_concatenate, передавая ему две строки «Hello» и «world» и отображает в ячейке «Hello world»
или

Код: Выделить всё

 =python("sum_all", A1:A10)  
Вызывает метод Python sum_all, передавая кортеж значений, содержащийся в ячейках от A1 до A10, и показывает сумму в ячейке.До сих пор это работает отлично.
Теперь представьте, что я хочу создать метод, который принимает диапазон и возвращает сумму номера его первой и последней строки. номер.

Например

Код: Выделить всё

=python("sum_row_numbers", B13:C24)
метод должен вычислять сумму номера первой строки, 13, и последней строки, 24, и возвращать 37.
Это сигнатура метода Python:

Код: Выделить всё

def sum_row_numbers(range):
Проблема в том, что параметр range, передаваемый оболочкой, представляет собой всего лишь кортеж кортежей, и любая ссылка на строки и столбцы на данный момент неизвестна.

Проблема в том, что параметр диапазона, передаваемый оболочкой, представляет собой всего лишь кортеж кортежей, и на данный момент любая ссылка на строки и столбцы неизвестна.

p>
Как я могу убедиться, что оболочка передает всю информацию о диапазоне (включая ссылки на ячейки) методу Python?

Подробнее здесь: https://stackoverflow.com/questions/791 ... on-scripts
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»