1

Поскольку LibreOffice Calc поддерживает макросы, а встроенные функции несколько ограничены, я хотел бы написать свои собственные функции на Python, а затем использовать их в качестве формул в отдельных ячейках. В идеале у меня был бы файл Python вроде:

def VOL(a, b, c):
    v = a*b*c
    return v

либо встроенный в документ, либо в виде файла custom_functions.py в прямом месте. После этого я смогу написать =VOL(A1, A2, B3) в ячейке и рассчитать результат. Неправильный ввод или другие ошибки должны приводить к появлению текста ошибки в ячейке так же, как это делают встроенные функции calc.

Я могу перейти в Инструменты> Макросы> Упорядочить макросы ...> LibreOffice Basic. Это дает мне диалог, в котором я могу создать новую функцию, как я описал выше (я ее не тестировал). К сожалению, это требует написания на Basic, а не на Python. Я действительно не хочу изучать Basic только для этого, я хочу использовать свои знания и опыт в Python.

Если я зайду в Инструменты> Макросы> Упорядочить макросы ...> Python, параметры для создания новых макросов будут недоступны. Немного покопавшись в интернете, я обнаружил, что, очевидно, LibreOffice (ну, на самом деле, восходящий OpenOffice) не имеет своей собственной Python IDE "пока", поэтому они просто помещают в пользовательский интерфейс серую кнопку без объяснения в качестве заполнителя. Я говорю "пока" в кавычках, потому что я нашел людей, которые жалуются на это в 2012 году, просто чтобы сказать, что это будет исправлено в любой день.

Я также нашел некоторую информацию о написании расширений Python с использованием некоторой библиотеки взаимодействия Python. По-видимому, для этого требуется импортировать много здоровенных библиотек, даже для самых простых примеров требуются десятки строк сложного стандартного кода, и отладка, вероятно, является проблемой. Было бы намного проще просто написать обычный скрипт на Python, который считывает данные из электронной таблицы и затем записывает их обратно. Однако функции, которые я хочу, относительно тривиальны, и возможность эффективного просмотра и навигации по данным очень полезна для разработки и отладки моего поискового анализа, поэтому возможность определения функции в простом Python и ее использования внутри электронной таблицы Calc будет очень полезной. удобный. Есть ли способ сделать это?

Я использую LibreOffice 5.2.2.2 и Windows 7, я могу использовать Python 2 или 3, но предпочитаю 3.

1 ответ1

1

Некоторые вещи, о которых вы спрашивали, легко решаются, другие - не так много. Прежде всего, IDE. APSO - это расширение, которое теперь готово к использованию и предоставляет удобное меню для редактирования макросов Python.

После установки перейдите в Инструменты -> Макросы -> Организация сценариев Python. Разверните Мои макросы и перейдите в Меню -> Создать модуль. Назовите его «custom_functions.py».

Затем выберите файл и перейдите в Меню -> Редактировать. Чтобы это работало, вам нужно перейти в Tools -> Extension Manager и указать APSO путь к вашему любимому текстовому редактору. У меня установлен C:\Program Files (x86)\Vim\vim80\gvim.exe .

В текстовом редакторе введите следующий код.

def VOL(a, b, c):
    v = a*b*c
    return v

def call_vol():
    oSheet = XSCRIPTCONTEXT.getDocument().getSheets().getByIndex(0)
    cell_a = oSheet.getCellRangeByName("A1")
    cell_b = oSheet.getCellRangeByName("A2")
    cell_c = oSheet.getCellRangeByName("A3")
    cell_result = oSheet.getCellRangeByName("B1")
    cell_result.setValue(
        VOL(
            cell_a.getValue(),
            cell_b.getValue(),
            cell_c.getValue()))

g_exportedScripts = call_vol,

Чтобы запустить код, снова используйте APSO или перейдите во встроенные инструменты -> Макросы -> Запуск макроса. Найдите и выполните функцию call_vol . Например, если от A1 до A3 каждый содержит 2, то это даст 8 в B1, потому что 2 * 2 * 2 = 8.

Теперь, как превратить этот макрос в функцию электронной таблицы? Надлежащим способом является создание надстройки электронной таблицы. Я обнаружил, что такие функции работают хорошо, но для этого требуется несколько файлов конфигурации XML, и, похоже, вы хотите этого избежать.

Альтернативой созданию надстроек является пользовательская функция. Их можно вызывать только тогда, когда они написаны на основном языке.

Для UDF, где основная работа выполняется в Python, поместите функцию-обертку в Basic, которая вызывает Python из Basic, используя Script Provider.

В Windows последние версии LibreOffice обычно поставляются с Python 3. Apache OpenOffice поставляется с Python 2.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .