2011-08-19 2 views
15

Ho un'applicazione che richiede l'esecuzione di MS Excel, altrimenti si blocca. Quindi voglio controllare e avvisare l'utente nel caso in cui Excel non sia installato sul computer dell'utente.Come verificare, a livello di programmazione, se MS Excel esiste su un PC?

Come posso fare?

+0

È molto più semplice controllare il registro. Leggi http://stackoverflow.com/questions/244517/where-is-a-reliable-registry-key-to-find-install-location-of-excel-2007 – Zenwalker

+0

Puoi dirci un po 'di più su " crash?" Forse includi del codice rilevante nell'area che si blocca in modo da poter avere un'idea del tuo utilizzo/necessità? – ckittel

+0

bene il crash è excpeted, dal momento che non è installato excel, l'errore è questo: "Recupero del COM factory con CLSID {00024500-0000-C000-0000000000046} non riuscito a causa del seguente errore: 80040154 Classe non registrata (Eccezione da HRESULT : 0x80040154 (REGDB_E_CLASSNOTREG)). "Un try catch fa un ottimo lavoro in questo caso come hai menzionato sotto [ho appena provato], tuttavia volevo solo rendere il codice un po 'più" mirato "e cercare solo l'esistenza di Excel .la necessità qui è di avvisare l'utente che nella fase corrente il progetto ha bisogno di ms excel e non provare ad aprire form1 quindi questo msg è evitato – Karapapas

risposta

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

Come soluzione rapida, è possibile rilevare l'eccezione e implementare la corretta gestione degli errori. Quindi puoi informare l'utente lì.

2

Questo post di blog qui descrive come verify if Excel is installed via the registry (codice VB.NET ma può essere facilmente convertito in C#). Fondamentalmente, si sta verificando tramite la chiave 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; 
    } 
} 

questo farà il trucco, basta farlo per tutte le versioni

e può essere fatto in questo modo anche

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

Downvoted perché caricare un assembly solo per vedere se è installato è grossolanamente inefficiente (e non è possibile anche scaricarlo senza farlo nel proprio appdomain) – Larry

2

questo non risponde alla tua domanda specifica , ma lo affronta da una direzione alternativa ...

Fa davvero È necessario installare MS Excel oppure è necessario che il computer sia in grado di visualizzare file Excel? Ad esempio, se l'utente ha installato LibreOffice o un'altra applicazione compatibile con file Excel simile, sarebbe accettabile?

Abbiamo un'applicazione che apre file Excel e file PDF per l'utente. Non ci interessa davvero quale software hanno gli utenti sul loro computer per visualizzare questi file. Non è davvero la nostra preoccupazione. Abbiamo semplicemente Process.Start(...) il file e lasciamo che il SO lo prenda da lì.

La chiamata viene chiusa in un blocco Try/Catch e offre all'utente i suggerimenti se questa chiamata genera un errore; suggerimenti, come che potrebbero non avere Office (Excel) installato, o mancano un visualizzatore di PDF. Fondamentalmente, invece di provare proattivamente per identificare se il computer dell'utente è in uno stato abbastanza completo per eseguire l'azione, assumiamo che lo sia, ma poi gestiamo la situazione quando non è stata scoperta.

+0

che è un buon modo per gestire molti casi nella mia applicazione e io lo uso in metà dei miei methonds, tuttavia ci sono alcuni metodi che usano l'interoperabilità per scrivere nei fogli di lavoro e che, sfortunatamente, ha bisogno dell'ufficio di MS. so che ci deve essere un modo per farlo anche con libre e open office, ma questo deve aver bisogno di un diverso formato di file .dll e in generale di un approccio totalmente diverso. Tuttavia, nel mio futuro ho intenzione di rendere la mia app disponibile a coloro che hanno solo un ufficio aperto o libre – Karapapas

+0

@chris In effetti, se stai andando a fare qualsiasi interop con le librerie native/apis, allora il mio suggerimento è ampio il segno. Come hai notato, il mio suggerimento funziona davvero solo durante la visualizzazione, non creando questi file. – ckittel