Excel的背面(1) — Pywin32调用异常、MSO与KET之争
在上一篇博文中我提到了Excel批注有关的问题,这里我并不打算马上更新Excel歪门邪道,毕竟我可供更新的内容实在是太少了,这也对应了我过去失败的29年,恍恍惚惚出生,恍恍惚惚工作,恍恍惚惚之间步入低谷,从来就没有哪一刻想过要成为成年人,最后不过是有着成年人躯壳的小孩。Excel相关的内容因为我个人经历太浅的原因,不会是长期的更新栏目,预计整个与Excel相关的内容会在10篇以内讲完,如果有勘误会在文末标出修改,之后也许会记录我和编程的缘分,作为一个业余写垃圾代码的人,说实话写太多多少有点不自量力了。
本篇是Excel的背面第一篇,内容很短,因为当初的情形无法复现,因此只能马后炮反过来分析可能产生的原因。
起因是当时还在第一任东家上班时,写了个python脚本帮我做检查工作(虽然这个脚本后来没用了,因为机器性能太差,其他人发我的表又有各种问题,只能放弃),脚本本身并不复杂,只是用pywin32调用一下Excel的COM组件实现在py中用调用vba代码检查表格。然而,这里如果顺风顺水就不会有后面的事情了:
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)
映入眼帘的是一个匪夷所思的错误:pywintypes.com_error: (-2147024703, 'OLE error 0x800700c1', None, None)
这个问题产生的原因我始终没有弄清,只不过在修复好后我简单对比了下Office和WPS的应用程序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}和{00024500-0000-0000-C000-000000000046}指向注册表项本身的结构几乎是一样的,键值都写明了组件是什么服务,同时也记录了启动程序的命令行。这个问题发生时,我电脑上先后装过Office 2007/2010/2013/2019 和WPS,因此有其他版本的键值残留其实也很正常,但我不能理解的是这个问题是装了WPS以后出现的,而且事后也尝试改了键值和CLSID的指向,只要HKEY_CLASSES_ROOT\Excel.Application\CLSID不指向{00024500-0000-0000-C000-000000000046},pywin32是肯定无法正常调用的,必定会有上面的报错。同时这个问题不能够通过修改注册表中Excel产品ID中LocalServer和LocalServer32键值指向的程序路径了事,因为关键很可能在于CLSID指向不正确而不是Excel程序引用的问题。
至于为什么标题要提到MSO和KET之争,我还想多说两句:
从我第一份工作到现在,我都尝试过在同一台电脑上安装WPS和MS Office,然而每次的结果都不尽人意,因为一旦安装WPS,Office的程序完整性就会被破坏,你也不知道WPS在后台到底在干些什么,从文件关联到VB库,每过一段时间曾经修好改好的设置又会犯病,不是Office打开文件出问题,就是宏用不了,这对于使用是最头疼的。所以现在在单位用WPS在家还是用Office2007,但从心底里说,我大概会选Office,WPS尽管在本地化、功能优化和降低使用门槛上花了大力气,实实在在地让许多人觉得体验友好,但就目前来说还是没能到彻底替代Office的地步,但对于我国特殊的国情而言,WPS应该会大面积铺开然后彻底替代掉Office,尤其是国产化浪潮下,想必也就是眼前的事情了。
参考资料:
【0】雨非林-解决WPS导致Excel.Application调用错误问题: 解决WPS导致Excel.Application调用错误问题 - 帷幄网
【1】onereal-关于导出excel,调用Excel.Application报错的解决方法: 关于导出excel,调用Excel.Application报错的解决方法_connecttonewobject("excel.application") 返回-2-CSDN博客
【2】雪落雨伤-关于调用Excel.Application报错的解决方法: 关于调用Excel.Application报错的解决方法-CSDN博客