Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Win32 COM访问Excel文件时出现问题_Python_Excel_Win32com - Fatal编程技术网

Python 使用Win32 COM访问Excel文件时出现问题

Python 使用Win32 COM访问Excel文件时出现问题,python,excel,win32com,Python,Excel,Win32com,各位!我一直在使用Python中的win32com.client模块访问包含VBA宏的Excel文件的单元格codexl=win32com.client.gencache.EnsureDispatch(“Excel.Application”)中的一条语句抛出了一个错误:AttributeError:module'win32com.gen_py.00020813-0000-0000-C000-0000000000 46x0x1x6'没有属性'MinorVersion'是否有人遇到过类似情况,如果有

各位!
我一直在使用Python中的win32com.client模块访问包含VBA宏的Excel文件的单元格
code
xl=win32com.client.gencache.EnsureDispatch(“Excel.Application”)
中的一条语句抛出了一个错误:
AttributeError:module'win32com.gen_py.00020813-0000-0000-C000-0000000000 46x0x1x6'没有属性'MinorVersion'

是否有人遇到过类似情况,如果有,有什么可能的补救办法?(我已经在GitHub上查看了win32com的源代码,但还没有从中获得多少意义。)

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

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

否则,我可以简单地使用

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.Dispatch()" 
    
    "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
    
  • 试用

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

    因为win32com.client.gencache.requiredispatch强制执行MakePy进程

    虽然我相信前面的答案,但我更了解Redispatch,如果您来这里是因为您有此问题,但无法修改代码或不想修改代码,我可以通过重命名文件夹来解决此问题。运行这些行会引发相同的错误:

    from win32com.client.gencache import EnsureDispatch
    import sys
    xl = EnsureDispatch("Excel.Application")  # Error here
    print(sys.modules[xl.__module__].__file__)
    
    现在,不幸的是,如果出现错误,很难知道文件在哪里。对我来说,就是这个文件夹:
    C:\Users\\AppData\Local\Temp\gen\u py\
    。在该文件夹名称后添加下划线(或删除下划线)将导致在重新运行代码时重新创建该文件夹

    帽子提示


    pyxll链接还有另一段代码,可能需要调用另一个文件夹位置。我没有使用它,所以我不会在这里发布代码。上面的修复对我来说很有效,但只是为了以防万一,你可以进一步深入兔子洞。

    重命名
    GenPy
    文件夹应该可以

    它位于:
    C:\Users\\u insert\u username\uu\AppData\Local\Temp\gen\u py


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

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

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

    您确定您有最新版本吗?请尝试
    pip安装-U pypiwin32
    。这是否回答了您的问题?嘿,Joel,你应该把所有的代码语句转换成编码格式。作为参考,你可以看一看,这是唯一一件对我也有效的事情。这不是一种可靠的生产方式,因为我的最终用户无法在他们的机器上解决这样的问题。。。真可惜。