В течение последних нескольких дней я работал над автоматизацией генерации некоторых сводных таблиц для ряда отчетов.
Если свести к минимуму, следующий код работал без проблем:
import win32com.client
objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
objExcelApp.Visible = 1
Это выскочит экземпляр Excel, и я смогу продолжить работу в Python.Но внезапно, сегодня мои скрипты перестают работать со следующим:
>>>import win32com.client
>>> objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 534, in EnsureDispatch
mod = EnsureModule(tla[0], tla[1], tla[3], tla[4], bForDemand=bForDemand)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 391, in EnsureModule
module = GetModuleForTypelib(typelibCLSID, lcid, major, minor)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 266, in GetModuleForTypelib
AddModuleToCache(typelibCLSID, lcid, major, minor)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 552, in AddModuleToCache
dict = mod.CLSIDToClassMap
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'CLSIDToClassMap'
Код не изменился со вчерашнего дня до сегодняшнего дня.Понятия не имею, что происходит !!!.
Еще один интересный кикер.если я делаю тот же код в том же сеансе снова, я получаю другую ошибку:
>>> objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 534, in EnsureDispatch
mod = EnsureModule(tla[0], tla[1], tla[3], tla[4], bForDemand=bForDemand)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 447, in EnsureModule
if module.MinorVersion != tlbAttributes[4] or genpy.makepy_version != module.makepy_version:
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'MinorVersion'
>>>
Поэтому я перехожу на компьютер с Windows с новой установкой Windows, устанавливаю python37 и pip install pypiwin32.Запустите те же строки и откройте Excel так же, как это было вчера на моей оригинальной машине.
Я попытался удалить и переустановить безуспешно.Есть идеи, что здесь происходит?
ПРИМЕЧАНИЕ. Динамическая диспетчеризация все еще работает:
import win32com.client
objExcelApp = win32com.client.Dispatch("Excel.Application")
objExcelApp.Visible = 1
Но мне особенно нужна статическая диспетчеризация, так как сводные таблицы не будут работать с динамически отправляемым объектом (оченьпозже в моем коде):
objExcelPivotCache = objExcelWorkbook.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=objExcelPivotSourceRange)