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

cod*_*ife 56 c# excel ms-office .net-3.5

有谁知道检测哪个版本的Office的最佳方法是什么?另外,如果安装了多个版本的Office,我想知道它们是什么版本.如果我能够检测到(/)安装的Excel的特定版本,则会获得奖励.

Dir*_*mar 72

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

例如,如果要检查是否已安装Word 2007,则应检查是否存在以下注册表项:

HKLM\Software\Microsoft\Office\12.0\Word\InstallRoot::Path
Run Code Online (Sandbox Code Playgroud)

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

将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!)

其他应用程序具有类似的键:

HKLM\Software\Microsoft\Office\12.0\Excel\InstallRoot::Path
HKLM\Software\Microsoft\Office\12.0\PowerPoint\InstallRoot::Path
Run Code Online (Sandbox Code Playgroud)

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

HKLM\Software\Microsoft\Office\12.0\Common\InstallRoot::Path
Run Code Online (Sandbox Code Playgroud)

不使用特定注册表项的另一个选项是使用此处所述的MSIEnumProductsAPI 查询MSI数据库.

另外,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);
Run Code Online (Sandbox Code Playgroud)

Office 2019的文件版本是16.0.10730.20102,因此,如果您看到任何大于您处理Office 2019或当前Office 365版本的文件.

  • 我确定它不需要说,并且作为评论有点多余,但是,在12.0和14.0之间没有版本的原因与高层建筑中没有相似的编号楼层的原因相同. (10认同)
  • @Hecksa:这是即点即用安装吗?他们可能会以不同方式处理 另请注意,在使用regedit时,在64位系统上,您必须查看`HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office`. (5认同)
  • 您将如何检查它是Office的32位版本还是64位版本? (2认同)

小智 23

HKEY_CLASSES_ROOT\Word.Application\CurVer怎么样?


Jas*_*son 16

如果您在64位计算机上安装了32位Office,则可能需要检查是否存在"SOFTWARE\Wow6432Node\Microsoft\Office\12.0 \",并使用相应的版本替换12.0.对于安装在64位Windows 7上的Office 2007,情况确实如此.

请注意,Office 2010(== 14.0)是第一个存在64位版本的Office.


pei*_*ent 9

I found this CodeProject which helped me out with this very problem: http://www.codeproject.com/Articles/26520/Getting-Office-s-Version


zee*_*zee 8

namespace Software_Info_v1._0
{
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Interop;

public class MS_Office
{
    public string GetOfficeVersion()
    {
        string sVersion = string.Empty;
        Microsoft.Office.Interop.Word.Application appVersion = new Microsoft.Office.Interop.Word.Application();
        appVersion.Visible = false;
        switch (appVersion.Version.ToString())
        {
            case "7.0":
                sVersion = "95";
                break;
            case "8.0":
                sVersion = "97";
                break;
            case "9.0":
                sVersion = "2000";
                break;
            case "10.0":
                sVersion = "2002";
                break;
            case "11.0":
                sVersion = "2003";
                break;
            case "12.0":
                sVersion = "2007";
                break;
            case "14.0":
                sVersion = "2010";
                break;
            default:
                sVersion = "Too Old!";
                break;
        }
        Console.WriteLine("MS office version: " + sVersion);
        return null;
    }



}
}
Run Code Online (Sandbox Code Playgroud)

  • 另一个(非常小的)问题是"switch"语句中的"default"子句说"太旧了"!对于未知版本.执行该代码的更可能原因是Word(或其他)的版本太新了.实际上,这个程序对Office 2010的更新进行了说明 - 在应用更新之前,该程序的先前版本说Office 2010太旧了! (4认同)
  • 这看起来与由Longball27链接的提议解决方案相同,除了更新以处理Office 2010之外.这有两个问题.即使安装了Word,也可能无法安装Microsoft.Office.Interop.Word dll,例如,如果在安装.Net之前安装了Word,或者部分安装了Office而不是完整安装.这可能是仅部分安装Outlook的最典型 - 相应的Microsoft.Office.Interop.Outlook dll通常不会安装,直到用户下载并安装Outlook的"Primary Interop Assembly". (2认同)

小智 6

尽管这个问题很久以前就得到了回答,但我发现了一些与上述答案相关的有趣事实要补充。

正如 Dirk 提到的,从 Office 365 / 2019 开始,MS 似乎有一种奇怪的版本控制方式。您无法再通过查看可执行路径来区分这三个(2016、2019、O365)。就像他自称的那样,查看可执行文件的构建,作为判断哪个是什么的手段,也不是很有效。

经过一番研究,我找到了一个可行的解决方案。解决方案位于注册表子项下Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\Licensing\LicensingNext

所以,我的逻辑如下:

情况一:如果电脑安装了MSOffice 2016,.下没有子项Licensing

情况 2:如果计算机安装了 MSOffice 2019,则有值的名称(Office 产品 ID 之一)。(例如Standard2019Volume

情况 3:如果计算机安装了 Office365,则有一个名为o365bussinessretail(也是产品 ID)的值以及一些其他值。

此处提供可能的 productId 。

为了区分这三个,我只是打开了钥匙,看看是否失败。如果打开失败,其Office 2016 . 然后我枚举LicensingNext并尝试查看是否有任何名称具有前缀o365,如果找到它,则它的O365。如果没有,那么它的Office 2019

坦率地说,我没有足够的时间来测试不同环境下的逻辑。所以请注意。

希望这对感兴趣的人有所帮助。


Joh*_*sco 5

为什么不检查HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\[office.exe],哪里[office.exe]代表特定的办公产品exe-filename,例如winword.exe,excel.exe等等.你得到可执行的路径并检查该文件的版本.

如何检查文件的版本:在C++/in C#中

对这种方法有任何批评吗?