miércoles, 28 de enero de 2009

c# y excel

Me vais a disculpar la salida de tono en el blog, pero recientemente he tenido que ayudar a una persona a resolver la manera de procesar información de un fichero Excel desde una aplicación C#. Lo pongo aquí porque seguro que a alguién le sirve.
Con poco esfuerzo lo hacemos en Visual Basic también pero aquí os lo dejo tal cual en C#.

El ejemplo abre un hoja de cálculo Excel llamado "ficheroinput.xls" como una base de datos y exporta las filas deseadas a un fichero html llamado "output.html".


string strcon;

//Con la siguiente funciona, pero la otra más simplificada tambien sirve

strcon = "Dsn=Excel Files;Provider=Microsoft.Jet.OLEDB.4.0;DBQ=ficheroinput.xls;Extended Properties=\"Excel 12.0;Readonly=False;IMEX=0\"";
strcon = "Dsn=Excel Files;Provider=Microsoft.Jet.OLEDB.4.0;DBQ=ficheroinput.xls;";

//Abrimos la conexion
System.Data.Odbc.OdbcConnection conn;
conn = new System.Data.Odbc.OdbcConnection(strcon);
conn.Open();

//Nos vamos a interesar solamente los datos de las 2 primeras columnas y 3 filas de la hoja "Hoja1"
//Creamos la consulta y la mostramos por pantalla.
//Se considera a la primera fila no vacía como la cabecera de las columna de datos
//por lo que hay que poner nombres a las columnas
System.Data.Odbc.OdbcCommand misel;
misel = conn.CreateCommand();
misel.CommandText = " Select * from [h$A1:B4];";
System.Data.Odbc.OdbcDataReader r = misel.ExecuteReader();

//Guardamos los datos en el fichero en formato htm
System.IO.StreamWriter writer = new System.IO.StreamWriter("output.html", false);
string lineaweb;
writer.WriteLine("<"+"html><"+"body><"+"table>");
try {
while (r.Read()) {
lineaweb = "<"+"tr>";
for (int i = 0; i < 7; i++) {
lineaweb = lineaweb + "<"+"td>" + notnull(r, i) + "";
}
writer.WriteLine(lineaweb+"");
}
writer.WriteLine("");
}
catch {
Console.WriteLine("error leyendo del fichero");
}
r.Close();
writer.Close();
misel.Dispose();
conn.Close();




La función notnull de fabricación casera es la siguiente:


string notnull(System.Data.Odbc.OdbcDataReader result,int columna) {
string res;
try {
res = result.GetString(columna);
}
catch {
res = "";
}
return res;
}

No hay comentarios: