TeraBIThia

29/08/07

DataTable to Excel

Archivado en: Uncategorized — crisfervil @ 11:47 am

Esta mañana necesitaba una manera rápida y muy optima de exportar datos desde un dataset de una aplicación web a un archivo excel.

Esta es la solución que se me ocurrió.

Si Serializamos el DataTable a un archivo de texto plano, con las columnas separadas por tabulador y los registros por un salto de línea, lo guardamos con la extensión “xls” y lo abrimos, el excel lo reconoce inmediatamente y lo abre sin problemas.

Pros:
- Velocidad: Puedo serializar un dt de 10 columnas y 65535 filas que admite excel en 500 milisegundos.
- Sencillez: No hace falta ningún componente.

Contras:
- La hoja no estará formateada.
- No podemos decirle el Excel el tipo de datos de los campos.

La función que escribí es la que sigue:

/// <summary>
/// Serlializa el DataTable especificado en una cadena de texto separando 
/// los valores de cada columna por un caracter de tabulación
/// y las filas por un salto de línea.
/// </summary>
/// <param name="dt">DataTable a Serializar</param>
/// <returns>Cadena con el DataTable serializado</returns>
private static string SerializeDT(DataTable dt)
{
    const string FIELDSEPARATOR = "\t";
    const string ROWSEPARATOR = "\n";
    StringBuilder output = new StringBuilder();
 
    // Escribir encabezados
    foreach (DataColumn dc in dt.Columns)
    {
        output.Append(dc.ColumnName);
        output.Append(FIELDSEPARATOR);
    }
    output.Append(ROWSEPARATOR);
 
    // Escribir datos
    foreach (DataRow item in dt.Rows)
    {
        foreach (object value in item.ItemArray)
        {
            output.Append(value.ToString());
            output.Append(FIELDSEPARATOR);
        }
        // Escribir una línea de registro
        output.Append(ROWSEPARATOR);
    }
    // Valor de retorno
    return output.ToString();
}

Este sería el código para usarlo en una página aspx: El servidor devolverá los datos indicando al cliente que se trata de un archivo exel, y dependiendo de la configuración del navegador, se cargará directamente dentro de la misma ventana.

// Obtener los datos de la fuente que sea
// Bien una bd, un archivo, etc.
DataSet ds = GenerateData();
// Serializar los datos, usando nuestra función
string data = SerializeDT(ds.Tables[0]);
// Devolverlo al cliente, indicando que es un archivo xls
Response.ContentType = "application/vnd.ms-excel";
Response.Charset = "";
Response.Write(data);
Response.Flush();
Response.End();

Si en lugar de mostrar el resultado en la ventana del navegador preferimos que se muestre el díalogo de descarga de archivos, debemos guardar el resultado en un fichero del servidor, indicar en el Response que el lo que viene a continuación es para descargar  y posteriormente sustituir el Response.Write del código anterior por un Response.WriteFile().

Creamos una sobrecarga para nuestra función de serialización, que nos permita persistir lo serializado en un archivo:

/// <summary>
/// Serlializa el DataTable especificado en una cadena de texto separando 
/// los valores de cada columna por un caracter de tabulación
/// y las filas por un salto de línea.
/// </summary>
/// <param name="dt">DataTable a Serializar</param>
/// <param name="fileName">Archivo en el que se desean escribir los resultados</param>
private static void SerializeDT(DataTable dt, string fileName)
{
    StreamWriter sw = new StreamWriter(fileName);
    sw.Write(SerializeDT(dt));
    sw.Close();
}

Modificamos el código de la página sustituyendo el Response.Write por Response.WriteFile:

// Obtener los datos de la fuente que sea
// Bien una bd, un archivo, etc.
DataSet ds = GenerateData();
// Serializar los datos, usando nuestra función
// No olvidar especificar la extensión xls para que el 
// usuario lo abra con el Excel
const string FILE_NAME = "Datos.xls";
string exportFile = Server.MapPath(FILE_NAME);
SerializeDT(ds.Tables[0],exportFile);
// Devolverlo al cliente, indicando que es un archivo que debe ser descargado
Response.AppendHeader("content-disposition", "attachment; filename=" + FILE_NAME);
Response.WriteFile(exportFile);
Response.End();

Espero que a alguno le sirva.

Crossposted from crisfervil.com

Prueba CrossPosting

Archivado en: Uncategorized — crisfervil @ 10:34 am

Prueba CrossPosting


Crossposted from crisfervil.com
CrossPosted from AvaBloggers

27/08/07

Para ser un buen programador

Archivado en: Uncategorized — crisfervil @ 11:58 am

Leo en MenéameDiez señales de que no eres tan buen programador como piensas“.

No discutiré sobre la validez del artículo, simplemente me centraré en el punto 2, en el que se referencia la importancia de tener algo de culturilla general. Y yo, como no la tengo, intento ponerle remedio.

Jobs:  A este lo conozco. Co-fundador y actual presidente de Apple.

Gates: Este también me suena.

Torvalds: Este lo mismo, … cuendo pienso en el nombre, me viene la imagen de un pinguino ;) Aunque la cara no la tengo tan presente. Si viera una foto suya, no le reconocería. Qué falta de cultura, por favor!

Turing: Este me suena cantidad. Empecé a leer hace un tiempo un libro de introducción a la física en el que se le citaba muchísimo. Como no consegúi acabármelo, pues no me quedé del todo con su nombre.

Von Neumman: Este me suena de Arquitectura de Primero. Que fué lo que hizo?

Dijkstra: Este, sólo por lo difícil que es escribir su nombre, merece la pena recordarlo. Me arriesgaré a meter la pata diciendo que me recueda a … rutas… árboles… sí, algo de eso debe ser.

(A partir de este punto ya no me suena ninguno, así que tiro de Wikipedia). Copio un resumen de cada uno, para los vagos que no quieran leerse las entradas a las que enlazo.

Knuth: Estadounidense de  69 años (en el momento de escribir esta entrada), profesor de la Universidad de Standford. Ha realizado numerosos aportes a varias ramas teóricas de la informática. Por lo visto es programador (será tan bueno como el cree?).
Es el creador de TEX (un leguaje utilizado para representar fórmulas matemáticas), del sistema de diseño de tipos MetaFont y del estilo de programación conocido como programación ilustrada (Literate programming).

Wirth, Niklaus: Suizo, nacido en 1934, diseñador de los lenguajes de programación Euler, Algol W, Pascal, Modula, Modula-2 y Oberon. También ocupó gran parte de su tiempo en el equipo de diseño e implementación de sistemas operativos Lilith y Oberon para el Lola en el diseño del hardware digital y el sistema de simulación. En cuando a ingeniería, su mayor aportación fué el concepto de desarrollo por refinamiento sucesivo.

Kernighan, Brian: Canadiense, de 1942, trabajó junto con Ken Thompson y Dennis Ritchie, en el desarrollo de Unix. Por lo visto, aunque lo niegue, realizó aportaciones al diseño del Lenguaje C. También trabajó en el desarrollo de los lenguajes AMPL y AWK.

Ritchie, Dennis: Estadounidense, de 1941, trabajó junto con Kernighan en el desarrollo de C y de Unix.

Engelbart, Douglas: Estadounidense, inventor del ratón. Trabajó en numerosos proyectos de investigación para el desarrollo de las interfaces hombre-máquina.

Corbató, Fernando José: Estadounidense de 1946, Fué pionero en el desarrollo de los sistemas operativos multitarea. Trabajó en el proyecto Multics, y su trabajo inspiró a Thompson, que a su vez inspiró a Torvalds, que a su vez…  
Realizó tambien varias aportaciones al campo de la ingeniería, entre ellas, la “Ley de Corbató” que establece que “El número de líneas de código que un programador puede escribir en un período de tiempo es el mismo independientemente del lenguaje usado”.

Hoare, Charles Antony Richard (Tony para los amigos): Británico, Inventor del grandioso Quicksort, que tantas horas me llevó escribir en clase de programación. Actualmente es investigador de los laboratorios de Microsoft Reasearch en Cambridge. Una cita suya: “Concluyo que hay dos formas de realizar el diseño de una aplicación: La primera es el hacerla tan sencilla que sea obvio para todos que no tenga deficiencias y la segunda es el hacerla tan complicada que no queden deficiencias obvias.”

Minsky, Marvin: Neoyorquino de 1927, cofundador del laboratorio de inteligencia artificial del MIT. Sus trabajos mas importantes se han realizado en el campo de la inteligencia artificial, más concretamente en el desarrollo de las redes neuronales.

Bien! si sigo leyendo menéame, con suerte, acabaré siendo tan buen programador como pienso! XDDDD

CrossPosted from AvaBloggers

Blog de WordPress.com.