2011-08-19 67 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

相關問題