大家好!
我一直在使用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的源代码,但是它还没有从中获得很多意义。)
答案 0 :(得分:2)
一种解决方案是找到gen_py文件夹(C:\ Users \\ AppData \ Local \ Temp \ gen_py)并删除其内容。将COM与其他程序一起使用时,它对我有用。
答案 1 :(得分:1)
如果我想确保python启动一个新的excel实例(例如访问我的xlsm文件中的宏),我使用
xlApp = win32com.client.Dispatch("Excel.Application")
这样我可以关闭应用程序而不会伤害已经打开的实例。
否则,我可以简单地使用
d = {'h' : 11111111, 't' : 1010101, 'e' : 10101111, 'n' : 1}
my_list = [1010101, 11111111, 10101111, 1]
new_list = []
for i in my_list:
for key, value in d.items():
if value == i:
new_list.append(key)
print(new_list)
这对你有用吗?
答案 2 :(得分:1)
此属性错误的主要原因是因为您的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进程一样。
答案 3 :(得分:1)
虽然我相信前面的答案可以更好地理解SecureDispatch,但是如果您是因为有此问题而来这里的,但是却无法修改您的代码,或者不想这样做,那么我可以通过重命名文件夹来解决此问题。运行这些行会引发相同的错误:
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链接具有另一个代码块,以调用可能的另一个文件夹位置。我没有使用它,所以我不在这里发布代码。上面的修复程序对我有用,但以防万一您可以走得更远。
答案 4 :(得分:1)
重命名GenPy
文件夹应该可以。
它存在于:C:\Users\ _insert_username_ \AppData\Local\Temp\gen_py
重命名它将创建一个新的Gen_py
文件夹,并使您可以正确地分派Excel。
答案 5 :(得分:0)
删除文件夹对我来说不起作用。 我通过使用conda安装新版本的pywin32解决了这个问题。 康达安装-c anaconda pywin32