使用 win32com 访问 Excel 文件的问题

wor*_*yer 14 python excel win32com

每个人!
我一直在 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 的源代码,但无法从中获得多大意义。)

小智 10

此属性错误的主要原因是您的 COM 服务器已从后期绑定(动态)转变为早期绑定(静态)。

  • 在后期绑定中,每当调用一个方法时,都会向对象查询该方法,如果成功,则可以进行调用。
  • 在早期绑定中,对象模型的信息是根据对象调用提供的类型信息预先确定的。早期绑定使用 MakePy。此外,早期绑定区分大小写。

有两种方法可以解决此问题:

  1. 使用动态模块强制您的代码以面向后期绑定的方式工作。使用示例:

    "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用驼峰敏感关键字作为早期面向绑定的方式。使用示例:

    "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
    
    Run Code Online (Sandbox Code Playgroud)

试用

"win32com.client.dynamic.Dispatch()" instead of "win32com.client.gencache.EnsureDispatch"
Run Code Online (Sandbox Code Playgroud)

由于 win32com.client.gencache.EnsureDispatch 强制 MakePy 进程。


小智 6

重命名GenPy文件夹应该可以。

它出现在: C:\Users\ _insert_username_ \AppData\Local\Temp\gen_py

重命名它将创建一个新Gen_py文件夹,并让您正确发送 Excel。


小智 5

解决方案是找到 gen_py 文件夹 (C:\Users\\AppData\Local\Temp\gen_py) 并删除其内容。当我将 COM 与另一个程序一起使用时,它对我有用。


小智 3

如果我想确保 python 启动一个新的 excel 实例(例如访问 xlsm 文件中的宏),我使用

xlApp = win32com.client.DispatchEx("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

这样我就可以关闭应用程序而不会损害已经打开的实例。

否则,我可以简单地使用

xlApp = win32com.client.Dispatch("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

那对你有用吗?