Entwickler-Ecke

Basistechnologien - Excel Installation prüfen


besy - Do 08.07.10 08:06
Titel: Excel Installation prüfen
Hallo Forum,

ich habe eine WinForms Anwendung die viele dolle Dinge tut, unter anderem erzeugt sie ein TabControl, welches auf 2 seiner Tabs Grafiken darstellt. Selbige Grafiken werden in einer separaten Klasse mit Excel erzeugt (GDI+ war mir zu fisselig).

Jetzt setzt dieses Vorgehen natürlich vorraus das auf dem PC Excel installiert ist, andernfalls sollen die 2 Tabs deaktiviert werden.
Also muss herausgefunden werden ob Excel (bzw. Office) installiert ist, bis jetzt schaut das so aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
private bool isExcelInstalled()
{
    string programName = "Microsoft Office";
    string uninstallList = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    object obj;
    Microsoft.Win32.RegistryKey RegKeyUninstallList = Microsoft.Win32.Registry.LocalMachine;
    Microsoft.Win32.RegistryKey SubKeyUninstallList = Microsoft.Win32.Registry.LocalMachine;

    foreach (string subKey in RegKeyUninstallList.OpenSubKey(uninstallList).GetSubKeyNames())
    {
           obj = SubKeyUninstallList.OpenSubKey(uninstallList + "\\" + subKey).GetValue("DisplayName");
           if (obj != null)
           {
                if (obj.ToString().ToLower().Contains(programName.ToLower()))
                return true;
           }
    }

    return false;
}


Funktioniert soweit auch, mein Problem ist jetzt eher der "programName" nachdem gesucht wird. In dem Stück Code oben suche in nach "Microsoft Office", dummerweise setzt da ein Treffer nicht vorraus das auch Excel da ist. Es gibt zBsp den Microsoft Office Viewer, den Microsoft Office Communicator, und die geben auch alle true zurück.

Klar, ich kann auch nach "Microsoft Office Proffesional 2003" suchen, dann wirds bei mir hier super laufen, aber was wenn jmd nicht Proffesional hat, oder die 2010er Version, oder oder oder...

Wie kann ich wirklich sicherstellen das Excel installiert ist ? Gibt es vlt irgendwo eine Liste aller gängigen OfficeBezeichnungen auf die ich Abfragen könnte ? Oder gar einen ganz anderen Ansatz als meinen ?

Für Hilfe wär ich dankbar.


Christian S. - Do 08.07.10 19:40

Ich hab in einem alten Delphi-Programm von mir das hier gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function isExcelInstalled : Boolean;
var
  reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    Result := Reg.KeyExists('Excel.Application');
  finally
    Reg.Free;
  end;
end;

Sollte nicht schwer sein, das in C# umzusetzen.

Allerdings ist das schon lange her, seit ich das benutzt habe. Ob das funktioniert oder eine Jugendsünde ist, kann ich Dir daher nicht genau sagen :lol:


besy - Fr 09.07.10 11:10

Hallo,

danke für den Tipp.
Hab mich beim umbauen etwas schwer getan aber letztendlich sieht es nun so aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Microsoft.Win32.RegistryKey rootKey = Microsoft.Win32.Registry.ClassesRoot;
string[] subkeyNames = rootKey.GetSubKeyNames();
foreach (string name in subkeyNames)
{
    if (name == "Excel.Application")
         return true;
}
return false;


Funktioniert auch, bei mir zumindest mal.
Da ich aber blöderweise ja jetzt nicht anfangen möchte mein Excel (bzw. Office) zu deinstallieren ist das echt blöd zu testen. Da wird mir wenig anderes übrig bleiben als das Programm dann einfach so zu verteilen und auf Feedback zu warten...


besy - Fr 09.07.10 11:32

Da fällt mir ein ... ich bin mal so frech ...

Falls hier jemand liest der kein Excel oder Office auf dem PC hat, vlt hat er ja Lust die 2 Codestückchen zu kopieren und schnell in ein C# Projekt zu hauen, die sind ja alleine lauffähig, und zu schauen ob es funktioniert und hier dann Bescheid sagen.

Das wäre natürlich toll :)


IsNull - Di 20.07.10 19:07

user profile iconbesy hat folgendes geschrieben Zum zitierten Posting springen:
Da fällt mir ein ... ich bin mal so frech ...

Falls hier jemand liest der kein Excel oder Office auf dem PC hat, vlt hat er ja Lust die 2 Codestückchen zu kopieren und schnell in ein C# Projekt zu hauen, die sind ja alleine lauffähig, und zu schauen ob es funktioniert und hier dann Bescheid sagen.

Das wäre natürlich toll :)

Das ist ja die reinste CPU verschwendung ;)

Direkter Zugriff auf das Node ohne zu Loopen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
RegistryKey OurKey = Registry.ClassesRoot;
if( OurKey.OpenSubKey("Excel.Application"false) != null){
  // Ist installiert
}else{
  // Ist NICHT installiert
}


Und in deinem Fall läst sich das in 2 Zeilen lösen:

C#-Quelltext
1:
2:
            RegistryKey OurKey = Registry.ClassesRoot;
            return (OurKey.OpenSubKey("Excel.Application"false) != null);

Edit: Code gekürzt, danke Kha!


Kha - Di 20.07.10 20:40

Dein ternärer Operator ist etwas redundant ;) .


C#-Quelltext
1:
2:
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("Excel.Application"))
  return key != null;


IsNull - Mi 21.07.10 07:34

Hmpf, ja war ziemlich unnötig, danke. ;)


norman2306 - Mi 21.07.10 09:51

Einer geht noch:


C#-Quelltext
1:
return Registry.ClassesRoot.OpenSubKey("Excel.Application") != null;                    


Christian S. - Mi 21.07.10 09:56

RegistryKey implementiert IDisposable, also sollte man schon die using-Klausel drin lassen.