W aplikacjach biznesowych bardzo często występuje funkcjonalność importu / eksportu danych z / do Excela. Jednym ze sposobów pobierania danych z Excela jest zastosowanie OLE DB jako dostawcy danych. Nie jest to może rozwiązanie najbardziej optymalne, ale czasami nie ma możliwości wpływu na jego wybór. W celu skorzystanie z tego sposobu należy zdefiniować łańcuch połączenia. I tu pojawia się problem ponieważ aby ten sposób zadziałał musi być zainstalowany Excel. Dodatkowo definicja łańcucha połączenia zależy od wersji Excela zainstalowanej na komputerze. Oba te warunki wymuszają sprawdzenie tego przed próbą pobrania danych z Excela.

Nie jednokrotnie w trakcie pisania programu jest to pomijane, przy jednoczesnym założeniu, że na każdym komputerze jest zainstalowany Excel.  Dodatkowo spotkać można również ciche założenie, że do importu plików XLS należy użyć łańcucha połączeń do wersji Excela 2003, a do plików XLSX – do wersji 2007. O ile z pierwszym przypadkiem na razie nie powinno być problemu ponieważ zarówno Excel 2007 i Excel 2010 zawierają odpowiednie komponenty, które pozwalają na tego rodzaju dostęp. Natomiast z drugim – import pliku XLSX – nie jest już tak różowo. Zadziała tylko na komputerze z Excelem 2007. Jeżeli ktoś ma zainstalowanego Excela 2010 to zgłoszony zostanie wyjątek.

Aby poprawnie rozwiązać ten problem należy przed rozpoczęciem importu pliku:

  1. sprawdzić czy Excel został zainstalowany na komputerze,
  2. sprawdzić jaka wersja Excela została zainstalowana na komputerze.

Obydwa warunki można sprawdzić w bardzo podobny sposób.

Zacznijmy od pierwszego. Zaprezentuję tutaj dwa rozwiązania. Pierwsze opiera się na pobraniu typu związanego ze sprawdzaną aplikacją (w naszym przypadku jest to Excel.Application). Natomiast drugie odczytuje informację o Excelu z rejestru.

Zacznę od sprawdzenia, czy Excel został zainstalowany na komputerze:

Pierwszy sposób:

try
    {
        Type officeType = Type.GetTypeFromProgID("Excel.Application");
        if (officeType == null)
        {
            MessageBox.Show("Excel is missing");
        }
        else
        {
            MessageBox.Show("Excel is present");
        }
    }
catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

Oraz drugi sposób:

RegistryKey subKey = Registry.ClassesRoot.OpenSubKey(@"Excel.Application\CurVer");
if (subKey == null)
    {
        MessageBox.Show("Excel is missing");
    }
else
    {
        MessageBox.Show("Excel is present");
    }

Drugim elementem jest sprawdzenie, która wersja Excela jest zainstalowana na komputerze. W przypadku skorzystania z pierwszego sposobu można to zrobić sprawdzając następującą własność:

officeType.Assembly.FullName;

W przypadku mojego komputera otrzymałem następującą wartość tej własności:

Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c

W przypadku drugiej metody należy zastosować następujące polecenie:

subKey.GetValue("");

W tym przypadku zostanie podana tylko wersja Excela, czyli:

Excel.Application.12

Należy tylko pamiętać o mapowaniu wersji Excela:

– Excel 2003 – wersja 11,
– Excel 2007 – wersja 12,
– Excel 2010 – wersja 14.

Ja preferuję drugą metodę i sprawdzanie od razu obu warunków. W tym celu można stworzyć następującą funkcję:

private int GetExcelVersion()
{
    RegistryKey subKey = Registry.ClassesRoot.OpenSubKey(@"Excel.Application\CurVer");
    if (subKey != null)
    {
        try
        {
            string[] temp = ((string)(subKey.GetValue(""))).Split('.');
            int excelVersion;
            if (int.TryParse(temp[temp.Length - 1], out excelVersion))
            {
                return excelVersion;
            }
            return 0;
        }
        catch
        {
            return 0;
        }
    }
    return 0;
}

W przypadku, gdy nie ma zainstalowanego Excela zwróci ona wartość 0. W każdym innym przypadku aktualną wersję Excela.