使用win32com访问Excel文件的问题

问题描述 投票:0回答:4

大家! 我一直在使用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 win32com
4个回答
1
投票

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

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

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

否则,我可以简单地使用

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

那对你有用吗?


1
投票

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

  • 在Late Binding中,无论何时调用方法,都会查询该方法的对象,如果成功,则可以进行调用。
  • 在早期绑定中,对象模型的信息是由对象调用提供的类型信息预先确定的。早期绑定使用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进程。


1
投票

虽然我相信之前的答案更好地了解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链接有另一个代码块,可以调用另一个文件夹位置。我没有使用它,所以我不在这里发布代码。上面的解决方案对我有用,但万一你可以进一步走下兔洞。


1
投票

重命名GenPy文件夹应该有效。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.