xlwings проблема записи в ячейки в Excel 2010

В настоящее время я работаю над управлением подключениями SQL к файлу Excel с помощью скрипта Python. Сценарий использует xlwings для чтения и записи в книгу. К сожалению, работает только «читаемая» часть. Я довольно долго прочесывал Stackoverflow сегодня, и, похоже, ни у кого нет этой конкретной проблемы. Вот отладочный код, который я написал в соответствующем скрипте Python (он существует на листе как UDF, лист, на который я пытаюсь писать, другой); Я не очень разбираюсь в Python или xlwings, так что не стесняйтесь беспокоиться о структуре / синтаксисе :)

@xw.func
def compatTest():
    #use active workbook
    wb = xw.Book.caller()
    #does the sheet Notes exist?
    if wb.sheets['Notes']:
        status = "Status: "
        #does A1 in Notes have a value?
        if wb.sheets['Notes'].range('$A$1').value:
            status += "Good"
            #Can we write to the specified empty cell?
            try: 
                wb.sheets['Notes'].range('$E$1').value = 'something'
            #Nope :(
            except Exception as e:
                status = e.message
                return status + "can't write :("
            #This return statement shouldn't evaluate, just casting a wide net here
            return status + " " + str(wb.sheets['Notes'].range('$A$1').value)
        else:
            #A1 in notes is blank
            status += "Bad"
            wb.sheets['Notes'].range('$E$1').value = 'nothing'
            return status + " " + 'blank :('

Вывод в ячейке с UDF в ней: «не могу писать :(» - это означает, что сообщение об ошибке не возвращается.

Я использую надстройку xlwings 0.11.4 и ссылку на VBA (я не использую модуль VBA, поскольку он, похоже, перекрывается с надстройкой и генерирует ошибку VBA 49 'Неверное соглашение о вызовах DLL '). Я не касался кода надстройки, так как, в отличие от модуля, настройки не обрабатываются в файле. Все настройки, которые я ввел на ленте xlwings, точны.

Текущие настройки:
ОС: Windows Server 2008 R2 Enterprise (тестирование здесь из-за ограничений, скрипт здесь не развертывается)
Версия / дистрибутив Python: 2.7 / Anaconda2
версия xlwings : 0.11.4
Версия Excel: 2010 v. 14.0.7182.5000 (32-разрядная версия)


Изменить: Что интересно, когда я впервые открываю файл (после обновления ссылки и нажатие «Продолжить» для устаревших ссылок) в ячейке с UDF отображается «Статус: Хорошо». Если я дважды щелкну ячейку, чтобы повторно оценить UDF, она снова изменится на «не могу писать :(».
Если я изменю блок except на следующий:

 except:
            a = str(sys.exc_info()[0])
            b = str(sys.exc_info()[1])
            c = str(sys.exc_info()[2])
            status = str(a + " \ " + b + " \ " + c)
            return status

Я получил:

"<class 'pywintypes.com_error'> \ (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None) \ <traceback object at 0x0000000007B95708>"


Редактировать №2:
Как ни странно, я могу писать в ячейки с помощью декоратора xw.sub:

@xw.sub
def SomeFunction():
    wb = xw.Book.caller()
    wb.sheets['Notes'].range('B3').value = "hello world"

Этот код работает нормально, но я бы предпочел по возможности запускать как можно больше через UDF.


person VBAMadeMeDoIt    schedule 26.07.2017    source источник


Ответы (1)


Оказывается, я неправильно понял поведение функций в Excel и использование декоратора xw.func, который по сути преобразует этот блок кода в функцию Excel. Поведение функции описано здесь:
https://support.microsoft.com/en-us/help/170787/description-of-limitations-of-custom-functions-in-excel
Я надеялся обойти макросы полностью для сокращения накладных расходов, но, к сожалению, внутренние ограничения использования Excel предотвращают это - функции не могут изменять содержимое любой другой части книги. Я надеюсь, что это избавит кого-то от проблемы потерять пару дней работы, хотя они, безусловно, были образовательными. Если кто-то видит это и может предложить жизнеспособный обходной путь в моей среде, добро пожаловать.

person VBAMadeMeDoIt    schedule 27.07.2017