c# - 如何检测安装的 MS-Office 版本?

标签 c# excel .net-3.5 ms-office

有谁知道检测安装了哪个版本的 Office 的最佳方法是什么?另外,如果安装了多个版本的 Office,我想知道它们是什么版本。如果我能检测到安装的 Excel 的特定版本,那将是一个额外的好处。

最佳答案

检查已安装的 Office 版本的一种方法是检查感兴趣的 Office 应用程序的 InstallRoot 注册表项。

例如,如果您想检查是否安装了 Word 2007,您应该检查是否存在以下注册表项:

HKLM\Software\Microsoft\Office\12.0\Word\InstallRoot::Path

此条目包含可执行文件的路径。

用相应的版本号替换 12.0(适用于 Office 2007):

Office 97   -  7.0
Office 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!)

The other applications have similar keys:

HKLM\Software\Microsoft\Office\12.0\Excel\InstallRoot::Path
HKLM\Software\Microsoft\Office\12.0\PowerPoint\InstallRoot::Path

或者您可以检查所有应用程序的公共(public)根路径:

HKLM\Software\Microsoft\Office\12.0\Common\InstallRoot::Path

不使用特定注册表项的另一种选择是使用 MSIEnumProducts API 查询 MSI 数据库,如 here 所述。 .

顺便说一句,Microsoft 不正式支持并行安装不同的 Office 版本。它们确实有些作用,但您可能会得到不希望的效果和不一致。

更新:Office 2019 和 Office 365

从 Office 2019 开始,基于 MSI 的设置不再可用,即点即用是现在部署 Office 的唯一方式。随着对定期更新的 Office 365 的更改,Office 的主要/次要版本号也不再更新(至少目前是这样)。这意味着,即使对于 Office 2019,注册表项中使用的值和 Application.Version(例如在 Word 中)返回的值仍然是 16.0

目前,没有记录的方法来区分 Office 2016 和 Office 2019。一个线索可能是 winword.exe 的文件版本;但是,此版本也针对已打补丁的 Office 2016 版本进行了增加(请参阅下面@antonio 的评论)。

如果您需要以某种方式区分 Office 版本,例如确保存在特定功能或安装了最低版本的 Office,这可能是查看主要 Office 应用程序之一的文件版本的最佳方式:

// Using the file path to winword.exe
// Retrieve the path e.g. from the InstallRoot Registry key
var fileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE");
var version = new Version(fileVersionInfo.FileVersion);

// On a running instance using the `Process` class
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 版本。

关于c# - 如何检测安装的 MS-Office 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266675/

相关文章:

c# - 重定向后代码最终会运行吗?

c# - 如何按数字样式对字符串数组进行排序?

c# - 泛型类型的隐式运算符

Excel宏在单元格中查找文本并在单元格上插入超链接

c# - 在 Button_Click 上围绕控件绘制边框

c# - 新手 WPF 动画 : How to begin the Animation?

VBA 无法处理输入#Value 的字段

java - 无法使用 Apache POI 设置作者和标题

c# - int 的隐式运算符?

.net-3.5 - 如何强制 .NET 应用程序以 32 位模式运行