Leyendo un hoja de excel con Visual C#
Les cuento estos dias un cliente me pidio que una tarea, consistia en lo siguiente, leer un hoja de calculo de excel y actualizar una tabla, esto es porque las listas de precio que le entregan sus proveedores son en excel.
Como sabemos los archivos de Microsoft Excel, son libros formados por varias hojas de calculos dentro de un solo archivo, ver figura 1

Los archivos de excel lo manejamos con el namespace "System.Data.OleDb".
Crearemos un dataset y un providerfactories el cual utilizaremos para leer es esquela del libro de excel:
DataSet dsMsExcel = new DataSet();
DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
Con esta instrución leeremos el esquema del libro de excel
try
{
DataTable worksheets;
DbConnection connection = factory.CreateConnection();
connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" + this.txtRutaArchivo.Text
+ ";Extended Properties=Excel 8.0;";
connection.ConnectionString =
connectionString;
connection.Open();
worksheets = connection.GetSchema("Tables");
this.dGridViewTabla.DataSource = worksheets;
}
catch (Exception)
{
MessageBox.Show("Se produjo un
error. Puede ser que la hoja de calculo a abrir no
exista o posea un esquema diferente.");
}

una vez leido el esquema del libro de excel, leeremos el esquema de la hoja, para obtener las calumnas. Mediante la siguiente instrucción obtendremos lo mencionado.
try
{
DataTable columns;
string[] restrictions = { null,
null, this.txtHolaExcel.Text,
null };
DbConnection connection = factory.CreateConnection();
connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" + this.txtRutaArchivo.Text
+ ";Extended Properties=Excel 8.0;";
connection.ConnectionString =
connectionString;
connection.Open();
columns = connection.GetSchema("Columns", restrictions);
this.dGridViewColumns.DataSource = columns;
}
catch (Exception)
{
MessageBox.Show("Se
produjo un error. Puede ser que la hoja de calculo a abrir no exista o posea un
esquema diferente.");
}

leeremos los datos de la hoja de calculo de excel, con la siguiente instrucción como siempre lo mostraremos en un DataGridView
try
{
connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" + this.txtRutaArchivo.Text
+ ";Extended Properties=Excel 8.0;";
DbDataAdapter adapter = factory.CreateDataAdapter();
DbCommand selectCommand = factory.CreateCommand();
string losCampos = string.Empty;
// Introdusco los campos en una listbox, para
luego leerlo y armar una instrucción sql con los datos a buscar.
foreach (string theCampo in this.lstCampo.Items)
{
losCampos += (theCampo + ",
");
}
losCampos = losCampos.Remove(losCampos.Length - 2, 2);
//selectCommand.CommandText
= "SELECT Codigo, Descripcion, Categoria, CodigoBarras FROM
[Enero$]";
selectCommand.CommandText = "SELECT " + losCampos + " FROM [" + this.txtHolaExcel.Text
+ "]";
DbConnection connection = factory.CreateConnection();
connection.ConnectionString =
connectionString;
selectCommand.Connection =
connection;
adapter.SelectCommand =
selectCommand;
this.dsMsExcel.Tables.Clear();
adapter.Fill(this.dsMsExcel);
dGridViewDatos.DataSource = this.dsMsExcel.Tables[0];
}
catch (Exception ex1)
{
MessageBox.Show(ex1.Message + "Se
produjo un error.");
}
Y al final obtendremos algo como esto.
como vemos realmente es muy facil leer un archivo de excel, com ADO.NET, utilice la ayuda del blog de David Hayden, para conseguir ciertos truquillos...