Передача переменной из Excel в Python с помощью XLwings

Я пытаюсь написать простую определяемую пользователем функцию на Python, которой я передаю значение из Excel через Xlwings. Я наткнулся на несколько примеров с надстройкой, в которой вам нужно импортировать пользовательские функции, но это кажется слишком сложным.

Почему мой пример не работает?

VBA:

Function Hello(name As String) As String
    RunPython ("import Test; Test.sayhi(name)")
End Function

Питон (Test.py):

from xlwings import Workbook, Range

def sayhi(name):
    wb = Workbook.caller()
    return 'Hello {}'.format(name)

Ошибка:

NameError: name 'name' is not defined

person user2242044    schedule 08.12.2015    source источник
comment
Возможно RunPython ("import Test; Test.sayhi('" & name & "')")   -  person Tim Williams    schedule 09.12.2015
comment
@TimWilliams ... Ха, упс, я разочаровался в xlwings и упустил из виду очевидное. Отправьте как ответ, пожалуйста.   -  person user2242044    schedule 09.12.2015


Ответы (2)


Убедитесь, что вы правильно указали аргумент:

RunPython ("import Test; Test.sayhi('" &  name & "')") 
person Tim Williams    schedule 09.12.2015

Текст внутри RunPython() должен быть допустимым скриптом Python. Так что комментарий от "Тима Уильямса" - быстрое решение. Вам просто нужно быть осторожным, чтобы избежать символа ' внутри переменной имени, чтобы сломать скрипт Python.

Если вам нужно много писать UDF (определяемую пользователем функцию) или вам нужно передать значение, чтобы получить вывод, а затем обработать результат через VBA, попробуйте использовать ExcelPython вместо Xlwings.

Обратите внимание, что ExcelPython и Xlwings могут работать вместе, вы можете использовать оба без конфликтов.

Я думаю, вам лучше поиграть на примере, чтобы понять разницу. Мое понимание ограничено моими знаниями, которые могут быть неверными.

Подводя итог разницы:

  • ExcelPython требует установки установщика, он хорош в UDF, что помогает, если вы хотите передавать аргументы внутрь и наружу, а функция кэшируется в памяти, поэтому последующий вызов будет очень быстрым.
  • Xlwings проще, просто добавьте модуль VBA, установка не требуется. Он запускает Python в фоновом режиме каждый раз для запуска скрипта (каждый вызов запускает новый процесс), в скрипте вы можете манипулировать (читать/записывать) Excel через COM.

У меня тот же вопрос в начале, но позже я узнаю, что использование VBA на стороне Excel (intellisense) плюс ExcelPython на UDF (просто обработать и вернуть данные обратно) — хорошая комбинация, поэтому я думаю, что ExcelPython — это только то, что мне нужно.

Как упоминалось ранее, эти 2 компонента не конфликтуют, вы можете иметь оба. Если 2 автора тоже согласны, было бы неплохо их объединить.

person bobyuan    schedule 09.12.2015
comment
не знаком с ExcelPython, посмотрел, но можете ли вы пояснить разницу между этим и xlwings? - person user2242044; 09.12.2015
comment
ExcelPython был интегрирован в xlwings версии 0.6.0, см. что нового и документы - person Felix Zumstein; 09.12.2015
comment
Обратите внимание, что вызов RunPython в настоящее время имеет то преимущество, что является кросс-платформенным. Если это не проблема, используйте синтаксис на основе декоратора из интегрированного проекта ExcelPython. - person Felix Zumstein; 09.12.2015
comment
Благодаря Феликсу я заметил, что теперь они объединены, что, безусловно, является хорошей новостью. - person bobyuan; 11.12.2015