前几天在完成python脚本编写后,用pyinstaller打包成EXE扔笔记本上准备在检查表格的时候,忽然发现脚本直接异常退出,在vscode上重新运行脚本后发现pywin32在开始调用Excel.Application时出现如下错误:(文件名部分隐去)
Traceback (most recent call last):
File "d:/XXXX/XX/10月/XXXXX检查/XXXX.py", line 54, in <module>
xlApp=DispatchEx('Excel.Application')
File "C:\Python\lib\site-packages\win32com\client\__init__.py", line 113, in DispatchEx
dispatch = pythoncom.CoCreateInstanceEx(clsid, None, clsctx, serverInfo, (pythoncom.IID_IDispatch,))[0]
pywintypes.com_error: (-2147024703, 'OLE error 0x800700c1', None, None)
如果是出现上述的错误,并不能只通过修改注册表中Excel产品ID中LocalServer和LocalServer32键值指向的程序路径就了事
实际操作中,还是要先看HKEY_CLASSES_ROOT\Excel.Application\CLSID默认的键值
笔者的公司电脑是Excel2007,私人笔记本是Excel2019,在遍寻注册表的过程中以及搜索DCOM配置中找到了以下几个程序ID,有趣的是,两台电脑上的Excel程序ID居然是一样的
组件服务/DCOM配置中记录的Microsoft Excel Application的应用程序ID:
{00020812-0000-0000-C000-000000000046}
一个指向不明的ID,有可能是之前安装Excel2013残留在注册表中的值:
{00020820-0000-0000-C000-000000000046}
WPS表格的程序ID,笔者的WPS表格在注册表里对应的缩写为KET:
{45540001-5750-5300-4B49-4E47534F4655}
笔者电脑上HKEY_CLASSES_ROOT\Excel.Application\CLSID真正正确的键值:
{00024500-0000-0000-C000-000000000046}
如果拿{00020812-0000-0000-C000-000000000046}这串键值去注册表搜索,可以看到这串程序ID是对应到文件关联的,每一种Excel支持的文件格式都会引用这串程序ID
但至于为什么Excel.Application对应的键值是{00024500-0000-0000-C000-000000000046},这个实在没弄明白,但是如果同样搜索这串ID你会发现这串ID其实最后还是关联到了前面的{00020812-0000-0000-C000-000000000046},这样相当于{00020812-0000-0000-C000-000000000046}是被间接引用的,要正确调用Excel.Application就要先调用{00024500-0000-0000-C000-000000000046},然后通过它找到{00020812-0000-0000-C000-000000000046},最后找到Excel程序的路径正常打开EXCEL.EXE
而笔者的电脑上由于重装Excel2019后没有再出现报错,因此无法断定到底是哪里出了问题,但是可以肯定的是当时搜索{00020812-0000-0000-C000-000000000046}时,没有一个叫Excel.Application的键有这串程序ID,在修改这串ID后,报错的信息又和当时一模一样,可见当时引发错误的,就是Excel.Application的键值不正确,因为当时{00020812-0000-0000-C000-000000000046}和{00024500-0000-0000-C000-000000000046}都被笔者添加了其他的键值,但是依然无法正常调用
参考来源:
【0】雨非林-解决WPS导致Excel.Application调用错误问题 https://www.weivol.cn/2019/02/wps-excel-application-issue/
【1】onereal-关于导出excel,调用Excel.Application报错的解决方法 https://blog.csdn.net/onereal/article/details/87393243?
【2】雪落雨伤-关于调用Excel.Application报错的解决方法 https://blog.csdn.net/l490134872/article/details/80250395