当你需要打开或者生成一个doc/xls文件,需要调用Office(WPS)。我在使用过程中一直遇到一个问题,在部分电脑上启动服务时失败,部分电脑可以通过修复注册表来解决,部分电脑修改注册表也解决不了。如果你知道解决方案请不吝赐教。
如果你也遇到了,希望以下我的经验能给你一点点帮助。
输出一个.xlsx文件,第一步根据文件默认打开方式判断用户安装的软件版本(office还是wps),第二步根据软件版本传递对应参数调用CreateDispatch。
BOOL bRet = CreateDispatch("Excel.Application", pErr); bRet是FALSE,打开失败。
第一步判断软件版本,查找“.xlsx”的打开方式。
检查HKEY_CURRENT_USER目录下"\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xlsx"。
如果没有再检查HKEY_CLASSES_ROOT目录下“\.xlsx”。
取到启动调用的exe名称,Excel.exe(Excel)、ET.exe(WPS)。
第二步检查启动Application的注册表项。
注册表中搜索“Excel.Application”,下级节点CurVer值为“Excel.Application.12”。
再搜索“Excel.Application.12”,你会看到CLSID “00024500-0000-0000-C000-000000000046”,这个CLSID在多个位置出现,它就是Excel COM注册的唯一ID。CLSID下级节点LocalServer32中会看到Excel.exe绝对路径。系统应该会按这个路径启动excel服务。
用户WPS启动失败,修改注册表方法。
一、用户HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE缺少注册表项。
解决前先确定 1、 HKEY_CURRENT_USER\Software\Classes\CLSID\{45540001-5750-5300-4B49-4E47534F4655} 有无。 2、[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\KET.Application] 有无。 3、 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{45540001-5750-5300-4B49-4E47534F4655}] 有无。
确定缺少的注册表项,从正常电脑注册表中导出.reg文件在用户电脑导入。注意CLSID\{4554...4655}\LocalServer32 要修改值,值为用户机器et.exe路径。
CreateDispatch的第一个参数"Excel.Application":
Excel或WPS兼容MSO模式
"ET.Application":V8
"Ket.Application":V9
"Word.Application":Word或WPS兼容MSO模式
"WPS.Application":V8
"Kwps.Application":V9
再说一下我的解决方案,业务方面要读、写excel文件,引入了libxl库,不再依赖用户安装office或者wps。而word文件只有编辑需求,且不再是常用功能,用户反馈越来越少。如果预算充足可以考虑Aspose.word,不需要依赖office和wps。