При использовании pyuno в макросе python LibreOffice/OpenOffice calc я хотел бы просто иметь возможность выбирать диапазон ячеек, а когда выполняется макрос, для всех данных ячейки (например, как некоторый итерируемый объект) который можно получить в скрипте python, чтобы его можно было манипулировать. Я почти ничего не нашел в документации, и хотел бы приветствовать некоторый пример кода, который демонстрирует, как это сделать.Как вы можете извлечь выбранный диапазон ячеек в LibreOffice calc через pyuno?
ответ
После очень болезненного времени проб и ошибок (благодаря скудной документации и примерам использования пиню в любом месте - пожалуйста, исправьте меня, если я что-то упустил), я получил следующий код, который, кажется, делает то, что Я после того, как:
import uno
doc = XSCRIPTCONTEXT.getDocument()
def mymodule():
ctrlr = doc.CurrentController
sel = ctrlr.getSelection()
x = sel.getDataArray()
# now the data is available as nested tuples in x, so do something with it
file('/tmp/out', 'w').write(repr(x))
Это можно поместить в файл питона, и хранятся (по крайней мере с Ubuntu 14.04) в директории ~/.config/libreoffice/4/user/Scripts/python
, а затем, пока установлен пакет libreoffice-script-provider-python
, он может быть запущен изнутри LibreOffice Calc через Инструменты-> Макросы-> Запустить макрос пункт меню. Или это может быть связано с сочетанием клавиш, используя диалог Tools-> Customize-> Keyboard.
Для получения более полного примера, позволяющего загружать данные из LibreOffice Calc в Octave для дальнейшего анализа, см. this pyuno script.
Или вы можете попробовать что-то вроде этого, что, я думаю, более легко понять.
desktop = XSCRIPTCONTEXT.getDesktop()
model = desktop.getCurrentComponent()
try:
sheets = model.getSheets()
except AttributeError:
raise Exception("This script is for Calc Spreadsheets only")
#sheet = sheets.getByName('Sheet1')
sheet = model.CurrentController.getActiveSheet()
oSelection = model.getCurrentSelection()
oArea = oSelection.getRangeAddress()
first_row = oArea.StartRow
last_row = oArea.EndRow
first_col = oArea.StartColumn
last_col = oArea.EndColumn