使用 win32com 访问 Excel 文件时出现问题
Issue in using win32com to access Excel file
大家好!
我一直在使用 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 服务器已从后期绑定(动态)转变为早期绑定(静态)。
- 在后期绑定中,每当调用一个方法时,都会查询对象以查找该方法,如果成功,则可以进行调用。
- 在早期绑定中,对象模型的信息是根据对象调用提供的类型信息预先确定的。早期绑定使用 MakePy。此外,早期绑定区分大小写。
有两种方法可以解决此问题:
使用动态模块强制您的代码以面向后期绑定的方式工作。使用示例:
"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"
As 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\
。向该文件夹名称添加下划线(或删除它)应该会导致在代码重新 运行.
时重新创建该文件夹
给
的小费
- https://www.pyxll.com/_forum/index.php?topic=436.0
- https://gist.github.com/rdapaz/63590adb94a46039ca4a10994dff9dbe
pyxll link 有另一个代码块可以调用潜在的另一个文件夹位置。我没有使用它,所以我没有在这里发布代码。上面的修复对我有用,但以防万一你可以深入兔子洞。
重命名 GenPy
文件夹应该可行。
它出现在:C:\Users\ _insert_username_ \AppData\Local\Temp\gen_py
重命名将创建一个新的 Gen_py
文件夹,并让您正确发送 Excel。
如前所述删除文件夹对我不起作用。
我通过使用 conda 安装新版本的 pywin32 解决了这个问题。
conda install -c anaconda pywin32
一个解决方案是找到 gen_py 文件夹 (C:\Users\\AppData\Local\Temp\gen_py) 并删除其内容。当我将 COM 与另一个程序一起使用时,它对我有用。
大家好!
我一直在使用 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 服务器已从后期绑定(动态)转变为早期绑定(静态)。
- 在后期绑定中,每当调用一个方法时,都会查询对象以查找该方法,如果成功,则可以进行调用。
- 在早期绑定中,对象模型的信息是根据对象调用提供的类型信息预先确定的。早期绑定使用 MakePy。此外,早期绑定区分大小写。
有两种方法可以解决此问题:
使用动态模块强制您的代码以面向后期绑定的方式工作。使用示例:
"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"
As 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\
。向该文件夹名称添加下划线(或删除它)应该会导致在代码重新 运行.
给
的小费- https://www.pyxll.com/_forum/index.php?topic=436.0
- https://gist.github.com/rdapaz/63590adb94a46039ca4a10994dff9dbe
pyxll link 有另一个代码块可以调用潜在的另一个文件夹位置。我没有使用它,所以我没有在这里发布代码。上面的修复对我有用,但以防万一你可以深入兔子洞。
重命名 GenPy
文件夹应该可行。
它出现在:C:\Users\ _insert_username_ \AppData\Local\Temp\gen_py
重命名将创建一个新的 Gen_py
文件夹,并让您正确发送 Excel。
如前所述删除文件夹对我不起作用。 我通过使用 conda 安装新版本的 pywin32 解决了这个问题。 conda install -c anaconda pywin32
一个解决方案是找到 gen_py 文件夹 (C:\Users\\AppData\Local\Temp\gen_py) 并删除其内容。当我将 COM 与另一个程序一起使用时,它对我有用。