Как вы можете извлечь текущий диапазон ячеек в LibreOffice calc через Pyuno?

При использовании pyuno в макросе Python для вычисления LibreOffice / OpenOffice я хотел бы просто иметь возможность выбирать диапазон ячеек, а при запуске макроса все данные ячейки (например, как некоторый повторяемый объект) должны иметь возможность быть найдены в скрипте Python, так что им можно манипулировать. Я едва нашел какую-либо документацию по этому вопросу, и приветствовал бы некоторый пример кода, который демонстрирует, как это сделать.

2 ответа

Решение

После очень мучительного времени проб и ошибок (благодаря скудной документации и примерам использования 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))

Это может быть помещено в файл Python и сохранено (по крайней мере, в Ubuntu 14.04) в ~/.config/libreoffice/4/user/Scripts/python каталог, а затем до тех пор, пока libreoffice-script-provider-python пакет установлен, его можно запустить из LibreOffice Calc с помощью пункта меню "Сервис-> Макросы-> Запуск макроса". Или его можно привязать к сочетанию клавиш с помощью диалогового окна " Инструменты-> Настройка-> Клавиатура ".

Для более полного примера, который позволяет загружать данные из LibreOffice Calc в Octave для дальнейшего анализа, см. Этот скрипт pyuno.

Или вы можете попробовать что-то вроде этого, что, я думаю, легче понять.

    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
Другие вопросы по тегам