大家!
我一直在使用Python中的win32com.client模块来访问包含VBA宏的Excel文件的单元格。
代码 xl = win32com.client.gencache.EnsureDispatch("Excel.Application")
中的一个语句一直在抛出一个错误:
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x6' has no attribute 'MinorVersion'
有没有人遇到类似的情况,如果是的话,可以采取什么措施来解决这个问题呢? (我已经看过GitHub上win32com的源代码,但是从它上面没有太多意义。)
如果我想确保python启动一个新的excel实例(例如访问我的xlsm文件中的宏),我使用
xlApp = win32com.client.DispatchEx("Excel.Application")
这样我可以关闭应用程序而不会伤害已经打开的实例。
否则,我可以简单地使用
xlApp = win32com.client.Dispatch("Excel.Application")
那对你有用吗?
此属性错误的主要原因是您的COM服务器已从后期绑定(动态)转换为早期绑定(静态)。
有两种方法可以解决此问题:
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()"
"excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
试用
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.gencache.EnsureDispatch"
由于win32com.client.gencache.EnsureDispatch强制MakePy进程。
虽然我相信之前的答案更好地了解EnsureDispatch,如果你来到这里是因为你有这个问题,但无法修改你的代码,或者不想,我能够通过重命名文件夹来解决这个问题。运行这些行引发了同样的错误:
from win32com.client.gencache import EnsureDispatch
import sys
xl = EnsureDispatch("Excel.Application") # Error here
print(sys.modules[xl.__module__].__file__)
现在,不幸的是,如果你收到错误,很难知道那个文件在哪里。对我来说这是这个文件夹:C:\Users\<username>\AppData\Local\Temp\gen_py\
。在该文件夹名称后面添加下划线(而不是删除)应该会在重新运行代码时重新创建该文件夹。
帽子提示
pyxll链接有另一个代码块,可以调用另一个文件夹位置。我没有使用它,所以我不在这里发布代码。上面的解决方案对我有用,但万一你可以进一步走下兔洞。
重命名GenPy
文件夹应该有效。
它出现在:C:\Users\ _insert_username_ \AppData\Local\Temp\gen_py
重命名它将创建一个新的Gen_py
文件夹,并允许您正确发送Excel。