В настоящее время я работаю над управлением подключениями 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.