понедельник, 30 декабря 2013 г.

Чтение Excel через ODBC и .NET

Если вам необходимо программно прочитать данные из Excel файла, это можно сделать с помощью ODBC. В данной статье я покажу как. 
Итак у нас есть документ Excel в котором присутствуют некоторые данные, например такие как показано ниже:
Для того что бы иметь возможность обратится к ним из .NET кода через ODBC необходимо создать в системе соответствующий источник данных. Для этого заходим в Пуск->Панель Управления->Система и Безопасность->Администрирование->Источники данных (ODBC) и создаем источник данных на базе драйвера Excel:

Далее для этого источника данных необходимо указать название источника, его описание (на картинке ниже это TestExcel) и путь к Excel файлу, где находятся интересующие нас данные (на картинке ниже это D:\test.xls.

 Итак, источник данных готов, теперь немного магии на C# и фокус готов. Для этого будем использовать соединение, команды и ридер ODBC. В общем код примерно такой:
using System;
using System.Data.Odbc;

namespace ODBCExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var connection = new OdbcConnection("DSN=TestExcel;"))
            {
                var command = new OdbcCommand("Select Title, Description, Id from [Sheet1$]", connection);

                try
                {       
                    connection.Open();
                    OdbcDataReader reader = command.ExecuteReader();

                    var count = reader.FieldCount;
                    for (int i = 0; i < count; i++)
                    {
                        Console.Write(reader.GetName(i) + "\t");
                    }
                    Console.WriteLine();

                    while (reader.Read())
                    {
                        for (int i = 0; i < count; i++)
                        {
                            Console.Write(reader.GetValue(i).ToString() + "\t");
                        }
                        Console.WriteLine();
                    }
                }
                catch (Exception ex)
                {
                    Console.Write(ex.Message);
                }
            }

            Console.ReadKey();
        }
    }
}


Тут думаю все интуитивно понятно, поэтому объяснять нечего. В строке соединения указываем имя нашего ODBC источника, в SQL запросе название листа Excel (Sheet1) плюс магический символ доллара (куда же без доллара в наши дни) трактуется как название таблицы. Самая первая строка в файле Excel формирует поля таблицы, которые мы и запрашиваем в выражении Select у таблицы [Sheet1$]. Результат будет примерно такой:


Что собственно и требовалось получить.