如何检测已安装的MS-Office版本?
问题的原因是:在64位机器上安装32位的Office时,需要检查是否存在"SOFTWARE\Wow6432Node\Microsoft\Office\12.0\"路径,其中12.0需要替换为相应的版本号。这在64位Windows 7上安装Office 2007时是适用的。需要注意的是,Office 2010(== 14.0)是第一个有64位版本的Office。
解决方法:通过检查注册表中的特定路径来检测已安装的MS-Office的版本。以下是一个示例代码,用于检查32位Office 2007是否安装在64位Windows 7上:
import winreg def check_office_version(): key_path = r"SOFTWARE\Wow6432Node\Microsoft\Office\12.0\" try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) print("MS-Office 2007 (32-bit) is installed.") winreg.CloseKey(key) except FileNotFoundError: print("MS-Office 2007 (32-bit) is not installed.") check_office_version()
对于其他版本的Office,只需将版本号替换为相应的值即可。
这个方法可以帮助用户确定他们的机器上是否安装了特定版本的MS-Office。
如何检测安装的MS-Office版本?
在这个问题中,出现了原因是因为需要确定已安装的MS-Office版本。下面是一些讨论和解决方法。
其中一个解决方法是使用HKEY_CLASSES_ROOT\Word.Application\CurVer注册表项。这个方法避免了Wow64问题,并且支持安装了多个Office版本的情况。在Inno Setup中使用时,可以像这样使用:RegQueryStringValue(HKEY_CLASSES_ROOT, 'Word.Application\CurVer', '', myString)。
然而,这个方法只能获取内部版本号,比如Word.Application.15等,并不能返回文件或注册表路径。如果需要获取这些信息,仍然需要单独获取。
另一个问题是当安装了多个版本的Office或Office应用程序时,这种方法可能会出现问题。它似乎只会存储第一个安装的版本,而不是最新的版本。
另外,Word 2019显示的也是Word.Application.16。因此,问题在于如何区分2016和2019版本。
然而,根据一些用户的反馈(截至2022年1月,Office 16.0,版本2111),这种方法似乎并不一致。在某台机器上,Word.Application\CurVer的值为Word.Application.11,而PowerPoint.Application.11的值也是如此。但Outlook.Application.16和Excel.Application.16的值则是16。尽管我只安装了一个版本的Office。然而,在另一台安装了相同版本Office的机器上,所有Office程序的CurVer都显示为16。
检测已安装的MS-Office版本并不是一个简单的问题,可能需要综合考虑多个因素才能得出准确的结果。
如何检测已安装的MS-Office版本?
有一种检查已安装的Office版本的方法是检查感兴趣的Office应用程序的InstallRoot
注册表键。
例如,如果您想检查是否安装了Word 2007,您应该检查以下注册表键是否存在:
HKLM\Software\Microsoft\Office\12.0\Word\InstallRoot::Path
该条目包含可执行文件的路径。
用相应的版本号替换12.0(对于Office 2007):
Office 97 - 7.0Office 98 - 8.0
Office 2000 - 9.0
Office XP - 10.0
Office 2003 - 11.0
Office 2007 - 12.0
Office 2010 - 14.0 (sic!)
Office 2013 - 15.0
Office 2016 - 16.0
Office 2019 - 16.0 (sic!)
其他应用程序有类似的键:
HKLM\Software\Microsoft\Office\12.0\Excel\InstallRoot::Path HKLM\Software\Microsoft\Office\12.0\PowerPoint\InstallRoot::Path
或者您可以检查所有应用程序的公共根路径:
HKLM\Software\Microsoft\Office\12.0\Common\InstallRoot::Path
另一种不使用特定注册表键的选项是使用MSIEnumProducts
API查询MSI数据库,如此处所述。
顺便说一下,微软不官方支持并行安装不同版本的Office。它们在某种程度上可以工作,但可能会产生不希望出现的效果和不一致性。
更新:Office 2019和Office 365
从Office 2019开始,不再提供基于MSI的安装程序,现在只能使用Click-To-Run来部署Office。随着转向定期更新的Office 365,Office的主/次版本号也不再更新(至少目前如此)。这意味着-即使对于Office 2019-注册表键中使用的值和Application.Version
(例如在Word中)返回的值仍然是16.0
。
目前还没有记录的方法可以区分Office 2016和Office 2019。一个线索可能是winword.exe的文件版本;然而,对于修补过的Office 2016版本,该版本也会增加(请参见下面的评论)。
如果您需要在Office版本之间进行区分,例如确保某个特定功能存在或安装了Office的最低版本,可能最好的方法是查看一个主要Office应用程序的文件版本:
// 使用winword.exe的文件路径 // 从InstallRoot注册表键中检索路径 var fileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE"); var version = new Version(fileVersionInfo.FileVersion); // 在运行的实例中使用`Process`类 var process = Process.GetProcessesByName("winword").First(); string fileVersionInfo = process.MainModule.FileVersionInfo.FileVersion; var version = Version(fileVersionInfo);
Office 2019的文件版本为16.0.10730.20102,因此如果您看到的任何版本大于此值,则是Office 2019或当前的Office 365版本。
我们是否还需要检查HKCU?因为我的注册表键就在那里。谢谢!
我相信没有必要说出来,这似乎有点多余作为一个评论,但没有12.0和14.0之间的版本的原因与高层建筑没有类似编号的楼层的原因相同。
请注意,如果您使用的是Common键(用于检查所有Office应用程序的公共根),在版本15.0中将无法工作。
这还准确吗?我最近查看了很多安装了Word 2013的Windows 8系统,它们没有上述的InstallRoot键。Word是否已更改将键放在其他地方?
:这是一个Click-To-Run安装吗?他们可能会以不同的方式处理此问题。请还注意,在64位系统上使用regedit时,必须查看HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office
。
:这不是Click-To-Run - 64位系统的您的观点很有趣,因为我确实没有在regedit的该位置检查。然而,我发现在大多数64位机器上预期的(32位)位置上仍然存在该键,这有点令人困惑。我目前在这个问题上工作得很辛苦,因为这给我们的用户带来了一些严重的痛苦-如果我发现任何可以为将来澄清答案的东西,我会尽量更新这个问题。
如何检查Office的32位版本或64位版本?
这似乎没有一致地填充-我有两台安装了Excel 2016的机器,一台有上述的InstallRoot::Path
键,另一台没有。BobL2112下面提出的使用HKEY_CLASSES_ROOT\Word.Application\CurVer
更简单、更不易受损。
:您是否阅读了关于64位和32位注册表键的评论?
Word 2019的版本也显示为16.0。所以问题是如何区分2016版本和2019版本。
:感谢提示。希望我的更新有所帮助。
-vollmar:小心,对于Office 2019的构建版本;我使用的是Office 2016 Plus版本16.0.10827.20181,其中不包含Office 2019的新功能。