понедельник, 20 октября 2008 г.

Запись и чтение из файлов Excel при отсутствии установленного Excel

Получил на днях очередной бюллетень-молния Technet от Microsoft (кстати, интересная штука, кто еще не подписан - рекомендую. Такой же бюллетень есть и для MSDN). И были там две интересных ссылки: How Can I Write to Excel Without Using Excel? и How Can I Read from Excel Without Using Excel?

Собственно, идея очень простая - надо открыть OleDb-соединение и вперед, с песней :)

Берем вот такой .xls-файл:


Чтение данных делаем так:

            string fileName = @"test.xls";
            string sheetName = "Sheet$";
            string connString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " +
                                       fileName +
                                       "; Extended Properties=Excel 8.0";
            string query = "Select * from [" + sheetName + "]";

            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand cmd=new OleDbCommand(query, conn);
            conn.Open();

            OleDbDataReader reader = cmd.ExecuteReader();

            textBox1.Text = "";

            while (reader.Read())
            {
                textBox1.Text += System.Environment.NewLine;
                textBox1.Text += reader.GetString(0) + " ("+reader.FieldCount+")";
            }

            reader.Close();
            conn.Close();

Результат будет примерно таким:

А запись данных так:

            string fileName = @"test.xls";
            string sheetName = "Sheet$";
            string connString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " +
                                       fileName +
                                       "; Extended Properties=Excel 8.0";
            string wquery = "Insert into [Sheet$] (Name,Data) Values (?,?)";

            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand wcmd=new OleDbCommand(wquery, conn);
            conn.Open();

            OleDbParameter namep = wcmd.Parameters.Add("Name", OleDbType.VarChar, 80);
            OleDbParameter datap = wcmd.Parameters.Add("Data", OleDbType.UnsignedInt, 16);

            namep.Value = "aaa";
            datap.Value = 15;

            wcmd.ExecuteNonQuery();;

            conn.Close();

Результат, соответственно, такой:

Вот так вот всё просто. Я надеюсь, что найти где это можно применить сможете сами :)


4 комментария:

  1. Ой, спасибо! Спасибо Огромное! Классно! А главное просто! Но все пишет!

    ОтветитьУдалить
  2. Я сам удивился, что оно работает :)

    Странно, что про такую возможность практически никто не знает...

    ОтветитьУдалить
  3. Работает неправильно, если взять excel файл 2007 офиса
    Вот так годится Provider=Microsoft.ACE.OLEDB.12.0;

    Только это всё децкий пример.
    Как из byte[](файл excel) прочитать его содержимое, без создания файла

    ОтветитьУдалить
  4. Логично, новый эксел - новые глюки :) Тем более что Microsoft прекратило поддержку Jet. Помимо прочего - данный код вообще не будет работать (с указанной мной строкой подключения) на 64-битных платформах с 64-битной версией программы. По причине отсутствия Microsoft Jet 4.0 x64.

    А вот если верить вот этому блогу http://blogs.msdn.com/gzunino/archive/2004/08/02/206377.aspx то не использовать временный файл - нельзя.

    ОтветитьУдалить