2011-08-19 123 views
15

我有一个需要MS Excel运行的应用程序,否则它崩溃。所以我想检查并警告用户,以防Excel未安装在用户的机器上。如何以编程方式检查计算机上是否存在MS Excel?

我该怎么做?

+0

更简单的方法是检查注册表。阅读http://stackoverflow.com/questions/244517/where-is-a-reliable-registry-key-to-find-install-location-of-excel-2007 – Zenwalker

+0

你能告诉我们更多关于“它吗?崩溃?”也许在崩溃的地区包含一些相关代码,以便我们了解您的使用情况/需求? – ckittel

+0

很好的崩溃是excpeted,因为没有安装Excel中,错误的是这样的:“检索与COM工厂CLSID {00024500-0000-C000-0000000000046}失败,原因是出现以下错误:80040154没有注册类(从HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))。“一个try catch在这种情况下做得很好,就像你在下面提到的那样[我刚刚尝试过],但是我只是想让代码更”有针对性“并搜索只存在于Excel 。这里需要警告用户,在当前fase中,项目需要ms excel,并且不要尝试打开form1,所以这个msg是可以避免的 – Karapapas

回答

32
Type officeType = Type.GetTypeFromProgID("Excel.Application"); 
if (officeType == null) 
{ 
    //no Excel installed 
} 
else 
{ 
    //Excel installed 
} 
2

作为速战速决,你可以只捕获异常并执行适当的错误处理。然后你可以通知用户那里。

2

这此处的博客文章介绍如何verify if Excel is installed via the registry(VB.NET代码,但可以很容易地转换为C#)。基本上,您将通过HKEY_CLASSES_ROOT\Excel.Application\CurVer密钥进行验证。

3
const string ASSEMBLY2003 = "Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"; 

static bool IsAssemblyInstalled(string assembly) 
{ 
    try 
    { 
     s_assemblyExcel = Assembly.Load(assembly); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

这将这样的伎俩,只是做了所有版本

,它可以这样做也

RegistryKey key = Registry.ClassesRoot; 
RegistryKey excelKey = key.OpenSubKey("Excel.Application"); 
bool excelInstalled = excelKey == null ? false : true; 
+1

Downvoted是因为加载程序集来查看它是否安装非常低效(并且如果不在自己的应用程序域中执行,您也无法卸载它) – Larry

2

这不回答您的具体问题,但确实可以从另一方向解决它......

它真正的LY需要安装MS Excel中,或者你需要的计算机简单地能够显示Excel文件?例如,如果用户安装了LibreOffice或其他类似Excel文件兼容的应用程序,那么这可以接受吗?

我们有一个为用户打开Excel文件和PDF文件的应用程序。我们并不在乎他们用户使用哪些软件在他们的计算机上查看这些文件。这不是我们所关心的。我们只需要Process.Start(...)这个文件,并让操作系统从那里获取它。

我们做包裹中的呼叫Try/Catch块,并为用户提供建议,如果此调用导致错误;建议,就像他们可能没有安装Office(Excel),或者他们缺少PDF阅读器。基本上,与其主动尝试确定用户的计算机是否处于完全足够的状态来执行操作,我们假定它是,但是当它不是我们发现它时就处理这种情况。

+0

这是在我的应用程序中处理多个案例的好方法,我使用它有一半是我的方法,但是有一些方法使用interop来写在工作表中,不幸的是需要ms office。我知道必须有一种方法来做到这一点也与自由和开放式办公,但这必须需要不同的.dll不同的文件格式和通常完全不同的aproach。然而,我将来有计划让我的应用程序可供那些只有开放或自由办公室的人使用 – Karapapas

+0

@chris事实上,如果您打算与本地库/ apis进行任何互操作,那么我的建议是广泛的,标记。正如你所说,我的建议只有在显示时才有效,而不是创建这些文件。 – ckittel

相关问题