【问题标题】:Issue in using win32com to access Excel file使用win32com访问Excel文件的问题
【发布时间】:2021-04-02 04:29:40
【问题描述】:

大家!
我一直在使用 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


【解决方案1】:

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

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

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

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

    "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
    
  2. 在面向早期绑定的方式中使用区分大小写的关键字。使用示例:

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

试试

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

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

【讨论】:

    【解决方案2】:

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

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

    重命名它会创建一个新的Gen_py 文件夹,并让您正确分派 Excel。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 嘿乔尔,您应该将所有代码语句转换为编码格式。供参考,大家可以看看stackoverflow.com/help/how-to-answer
      • 这也是唯一对我有用的东西。这不是将某些东西投入生产的可靠方法,因为我的最终用户无法在他们的机器上解决这样的问题......真的很遗憾。
      • 它对我有用。谢谢
      【解决方案4】:

      虽然我相信前面的答案可以更好地理解 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 链接有另一个代码块来调用可能的另一个文件夹位置。我没有使用它,所以我没有在这里发布代码。上面的修复对我有用,但以防万一你可以更深入地了解兔子洞。

      【讨论】:

        【解决方案5】:

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

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

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

        否则,我可以简单地使用

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

        这对你有用吗?

        【讨论】:

          【解决方案6】:

          如前所述删除文件夹对我不起作用。 我通过使用 conda 安装新版本的 pywin32 解决了这个问题。 conda install -c anaconda pywin32

          【讨论】:

            猜你喜欢
            • 2011-06-15
            • 1970-01-01
            • 1970-01-01
            • 2014-02-23
            • 2018-09-24
            • 2021-05-11
            • 2020-10-29
            • 2015-06-06
            • 2021-08-08
            相关资源
            最近更新 更多