viernes, 8 de octubre de 2010

Exportando e importando datos a Excel 2010 con C#

- Introducción.

A veces, la forma más elegante de presentar un listado a un usuario es generando una hoja de Excel con los datos. También puede ser útil leer datos de un libro de Excel, para procesarlos desde una aplicación C#.

Ambas tareas son una auténtica chorrada usando ADO: sólo hay que abrir el fichero de Excel como si fuera una base de datos cualquiera.

- Conexión

string plantilla = "TEMP\\prueba.xlsx";
string cadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+plantilla+";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";
OleDbConnection con = new OleDbConnection(cadenaConexion);
con.Open();


El fichero "plantilla" puede o no existir. En este ejemplo vamos a crear uno nuevo.

Tienes más ejemplos de cadenas de conexión en http://www.connectionstrings.com/

- Definiendo una tabla.


OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = @"create table [Hoja1] (F1 char(255), F2 char(255), F3 char(255))";
cmd.ExecuteNonQuery();


Esta orden creará un fichero llamado "prueba.xlsx" , y dentro una hoja llamada "Hoja1". En la primera fila de la hoja, aparecerán los nombres de campo F1, F2 y F3

- Insertando datos.


cmd.CommandText = @"insert into [Hoja1$] (F1, F2, F3) values (1, 2, 3)";
cmd.ExecuteNonQuery();


Los datos se insertarán en la primera fila libre tras la cabecera.

- Actualizando datos.

Como ya te habrás imaginado, actualizar datos es tan sencillo como ...


cmd.CommandText = @"update [Hoja1$] set F2 = '4' where F1 = '1'";
cmd.ExecuteNonQuery();

- Leyendo datos.


cmd.CommandText = "select * from [Hoja1$] order by F1";
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
                    // hacemos cosas con los datos
}
dr.Close();

- Para terminar.

Cerramos la conexión...

con.Close();

Si estás exportando datos, probablemente querrás abrir el fichero de Excel para que el usuario no tenga que buscarlo y abrirlo él.


System.Diagnostics.Process p = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(plantilla);
info.UseShellExecute = true;
p.StartInfo = info;
while(!p.Start());

Espero que te sea útil :)

No hay comentarios:

Publicar un comentario