使用win32com访问Excel-fi的问题

2024-05-16 02:11:57 发布

您现在位置:Python中文网/ 问答频道 /正文

所有人!
我一直在使用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的源代码,但从中看不出什么意义。)


Tags: 模块文件代码clientapplication错误语句vba
3条回答

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

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

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

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

    "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
    
  2. 使用对camelcase敏感的关键字进行面向早期绑定的方式。示例使用:

    "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
    

试一试

"win32com.client.dynamic.Dispatch()" instead of "win32com.client.gencache.EnsureDispatch"

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

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

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

重命名它将创建一个新的Gen_py文件夹,并允许您正确地分派Excel。

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

xlApp = win32com.client.DispatchEx("Excel.Application")

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

否则,我只能用

xlApp = win32com.client.Dispatch("Excel.Application")

这对你有用吗?

相关问题 更多 >