Introduction
Knowing which version of MS Office is installed on the client computer is vital. Many a programmer sees this as an afterthought, sadly. This happens because not enough research of the client’s needs and abilities was done. This article will show you 4 different ways to determine the Office versions installed.
Design
Create a new project in either VB.NET or C#. You can name it something descriptive. Add four buttons to your form, and leave all the default names. You can however change the Text Properties of the buttons, as follows:
Figure 1 – Our Design
Coding
There are numerous ways and tools at our disposal. We can use Late Binding, Assembly and even the Registry. Let us have a closer look.
Method 1 – CreateObject / CreateInstance
Add the following code:
VB.NET
Private Sub Determine_OfficeVersion_1() Dim objEApp As Excel.Application 'Excel Object Dim strEVersion As String 'Identify Version objEApp = DirectCast(CreateObject("Excel.Application"), Excel.Application) 'Cast To Excel App Select Case objEApp.Version 'Determine Version Case "7.0" strEVersion = "95" Case "8.0" strEVersion = "97" Case "9.0" strEVersion = "2000" Case "10.0" strEVersion = "2002" Case "11.0" strEVersion = "2003" Case "12.0" strEVersion = "2007" Case "14.0" strEVersion = "2010" End Select MessageBox.Show("Excel Version: " & strEVersion) 'Display Result objEApp.Quit() 'Quit objEApp = Nothing 'Release Memory End Sub
C#
private void Determine_OfficeVersion_1() { //CreateObject Not Present In C# dynamic objEApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); //Excel object string strEVersion = null; //To identify version //Switch doesn't work on dynamic if (objEApp.Version == "7.0") { strEVersion = "95"; } else if (objEApp.Version == "8.0") { strEVersion = "97"; } else if (objEApp.Version == "9.0") { strEVersion = "2000"; } else if (objEApp.Version == "10.0") { strEVersion = "2002"; } else if (objEApp.Version == "11.0") { strEVersion = "2003"; } else if (objEApp.Version == "12.0") { strEVersion = "2007"; } else if (objEApp.Version == "14.0") { strEVersion = "2010"; } MessageBox.Show("Excel Version: " + strEVersion); objEApp.Quit(); //quit objEApp = null; }
Remember I spoke about Late Binding? Have a read through this article concerning late binding. Before we can run this, we need to add a Reference to the Excel object library. Click Project, Add Reference…. Select the COM tab and select your Excel version. Add the following Imports / Usings above your class name:
VB.NET
Imports Microsoft.Office.Interop
C#
using Microsoft.Office.Interop;
This allows us to make use of Office from within our code.
Our code instantiates an Excel object, then we determine its version. Based on that, we display the appropriate message. The C# code does not make use of CreateObject, as that is not available in C#. The nearest equivalent in C# is Activator.CreateInstance. This basically achieves the same thing as CreateObject. Because we do not know what will be returned by CreateInstance, we had to make the Excel object variable dynamic. The C# equivalent of Select case is switch. We cannot use switch here, because the data is dynamic / uncertain and not “fixed” such as a Boolean or character data type. Hence, the If statements.
Method 2 – The Registry
Add the following code:
Private Sub Determine_OfficeVersion_2() Dim strEVersionSubKey As String = "\Excel.Application\CurVer" '/HKEY_CLASSES_ROOT/Excel.Application/Curver Dim strValue As String 'Value Present In Above Key Dim strVersion As String 'Determines Excel Version Dim rkVersion As RegistryKey = Nothing 'Registry Key To Determine Excel Version rkVersion = Registry.ClassesRoot.OpenSubKey(name:=strEVersionSubKey, writable:=False) 'Open Registry Key If Not rkVersion Is Nothing Then 'If Key Exists strValue = rkVersion.GetValue(String.Empty) 'get Value strValue = strValue.Substring(strValue.LastIndexOf(".") + 1) 'Store Value Select Case strValue 'Determine Version Case "7" strVersion = "95" Case "8" strVersion = "97" Case "9" strVersion = "2000" Case "10" strVersion = "2002" Case "11" strVersion = "2003" Case "12" strVersion = "2007" Case "14" strVersion = "2010" End Select MessageBox.Show("Excel " & strVersion & " Installed!") 'Display Result End If End Sub
C#
private void Determine_OfficeVersion_2() { string strEVersionSubKey = "\\Excel.Application\\CurVer"; //HKEY_CLASSES_ROOT/Excel.Application/Curver string strValue = null; //Value Present In Above Key string strVersion = null; //Determines Excel Version RegistryKey rkVersion = null; //Registry Key To Determine Excel Version rkVersion = Registry.ClassesRoot.OpenSubKey(strEVersionSubKey, false); //Open Registry Key if ((rkVersion != null)) //If Key Exists { strValue = (string)rkVersion.GetValue(string.Empty); //Get Value strValue = strValue.Substring(strValue.LastIndexOf(".") + 1); //Store Value switch (strValue) //Determine Version { case "7": strVersion = "95"; break; case "8": strVersion = "97"; break; case "9": strVersion = "2000"; break; case "10": strVersion = "2002"; break; case "11": strVersion = "2003"; break; case "12": strVersion = "2007"; break; case "14": strVersion = "2010"; break; } MessageBox.Show("Excel " + strVersion + " Installed!"); //Display Result } }
Here, we made use of the registry to obtain our needed info. Before we forget, add the Wind32 Namespace:
VB.NET
Imports Microsoft.Win32 'For registry functions
C#
using Microsoft.Win32;
OK, I said we made use of the registry, let’s pause a bit here. Many people do not know what the registry is, or how to use it. I used to be scared of the registry. Why? Well, because the registry is the place where all of the settings are saved. It’s like an inventory where all of the info about the programs, and the controls are stored. For more info regarding the Registry, have a read through this article I wrote a while back.
With the above code segment, we explored the HKEY_CLASSES_ROOT\Excel.Application\CurVer key. This is where the information about Excel is stored. CurVer means Current Version. Now, we have to get the information out of there and use it to determine our actual comprehensible version. The information is stored like this:
Excel.Application.12
Very few people will know that this actually means Office 2007, because it is the 12th Office to be created. With some string manipulation we extract the “12” and then do the test to see what version is present on the system. Not too difficult now is it?
Method 3 – Type
Add the following sub:
VB.NET
Private Sub Determine_OfficeVersion_3(ByVal strVersion As String) Dim typOffice As Type = Type.GetTypeFromProgID(strVersion) '//Gets the type associated with the specified program identifier (ProgID). ProgID is a valid entry in the registry strVersion = strVersion.Substring(strVersion.LastIndexOf(".") + 1) 'Get Last 2 Characters in String Dim strTemp As String If Not typOffice Is Nothing Then 'Do We Have A Value? Select Case strVersion 'Determine Version Case "7" strTemp = "95" Case "8" strTemp = "97" Case "9" strTemp = "2000" Case "10" strTemp = "2002" Case "11" strTemp = "2003" Case "12" strTemp = "2007" Case "14" strTemp = "2010" End Select MessageBox.Show("Excel " & strTemp & " Installed") 'Display Result End If End Sub
C#
private void Determine_OfficeVersion_3(string strVersion) { Type typOffice = Type.GetTypeFromProgID(strVersion); //Gets the type associated with the specified program identifier (ProgID). ProgID is a valid entry in the registry strVersion = strVersion.Substring(strVersion.LastIndexOf(".") + 1); //Get Last 2 Characters in String string strTemp = null; //Initialize if ((typOffice != null)) //Do We Have A Value? { switch (strVersion) //Determine Version { case "7": strTemp = "95"; break; case "8": strTemp = "97"; break; case "9": strTemp = "2000"; break; case "10": strTemp = "2002"; break; case "11": strTemp = "2003"; break; case "12": strTemp = "2007"; break; case "14": strTemp = "2010"; break; } MessageBox.Show("Excel " + strTemp + " Installed"); //Display Result } }
Many familiar terms in here. What is new is the little word Type. This gets the type associated with the specified program identifier (ProgID). OK, what does this mean? It means it checks the Type associated with the Program ID you supply. This Program ID must be a valid registry entry such as Excel.Application.12 back in Method 2. Once we have established that what was supplied was indeed valid, we do some string manipulation again and obtain the version again.
Method 4 – Assembly
Add the last sub:
VB.NET
Private Sub Determine_OfficeVersion_4() 'Assembly we're looking for Dim strAssemblyOff2007 As String = "Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Try ' Use Try Instead of IF, Because On Error, Program Will Crash Dim xslExcelAssembly As [Assembly] = [Assembly].Load(strAssemblyOff2007) 'Load Assembly If Not xslExcelAssembly Is Nothing Then 'If Exists MessageBox.Show("Excel 2007 Installed") 'Success End If Catch ex As Exception MessageBox.Show("Not Installed") 'Don't Exist End Try End Sub
C#
private void Determine_OfficeVersion_4() { //Assembly we're looking for string strAssemblyOff2007 = "Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"; try // Use Try Instead of IF, Because On Error, Program Will Crash { Assembly xslExcelAssembly = Assembly.Load(strAssemblyOff2007); //Load Assembly if ((xslExcelAssembly != null)) //If Exists { MessageBox.Show("Excel 2007 Installed"); //Success! } } catch (Exception ex) { MessageBox.Show("Not Installed"); //Don't Exist } }
Add the Reflection Namespace:
VB.NET
Imports System.Reflection
C#
using System.Reflection;
Assembly is part of the Reflection namespace. We specify the exact assembly we’re looking for, and try to load it. If the Load was successful, we display a message saying that the program we’re looking for has been found. If the Load was not successful, an error will be generated.
All that is left now is to call these subs from our buttons. Add the next code:
VB.NET
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Determine_OfficeVersion_1() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Determine_OfficeVersion_2() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Determine_OfficeVersion_3("Excel.Application.12") End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Determine_OfficeVersion_4() End Sub
C#
private void Button1_Click(object sender, EventArgs e) { Determine_OfficeVersion_1(); } private void Button2_Click(object sender, EventArgs e) { Determine_OfficeVersion_2(); } private void Button3_Click(object sender, EventArgs e) { Determine_OfficeVersion_3("Excel.Application.12"); } private void Button4_Click(object sender, EventArgs e) { Determine_OfficeVersion_4(); }
If you run this application now, you will be able to click on all 4 buttons and get the same result. Just a note. I used Excel 2007 with my program. You can just modify at the various places the Office version or Office application you’re looking for. I am attaching my programs here, for you to experiment with.
Conclusion
There! Now you have 4 ways to determine if Office is installed on the client computer. Do not forget to use them! I hope you have benefited from this article. Until next time, cheers!