miércoles, 26 de octubre de 2011

Exportar GridView o DataTable a Excel (En HTML o TXT) con C#

Buen Día a Todos


Cuantas veces hemos querido exportar los datos que poseemos en una tabla (GridView) de un WebForm, una pagina web, a una hoja de Excel, o a cualquier Programa Manejador de Hojas de Calculo como OpenOffice, a PDF o a un simple archivo de Texto.


Aquí coloco una solución simple pero funcional.

//Codigo para C#
//Suponemos que tenemos una GridView llamada gridView_
//la cual queremos bajar a Excel
//Este codigo lo podemos colocar en el evento click de algun botón
//Se ocupa: 
//using System.Text;
//using System.IO;

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        Page pagina = new Page();
        HtmlForm form = new HtmlForm();
        
        pagina.Controls.Add(form);
        form.Controls.Add(gridView_);
        pagina.EnableEventValidation = false;
        pagina.DesignerInitialize();
        pagina.RenderControl(hw);
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("Content-Disposition", "attachment;filename=data.xls");
        Response.Charset = "UTF-8";
        Response.ContentEncoding = Encoding.Default;
        Response.Write(sb.ToString());
        Response.End();



Ahora suponiendo que no tenemos un GridView, pero si un DataTable que queremos bajar a Excel
En ese caso, tendremos que generar el GridView:



//Codigo para C#
//Suponemos que tenemos una DataTable llamada tabla
//la cual queremos bajar a Excel
//Este codigo lo podemos colocar en el evento click de algun botón
//Se ocupa: 
//using System.Text;
//using System.IO;

        GridView gridView_ = new GridView();
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        Page pagina = new Page();
        HtmlForm form = new HtmlForm();

        gridView_.DataSource = tabla;
        gridView_.DataBind();
        

        pagina.Controls.Add(form);


        form.Controls.Add(gridView_);
        pagina.EnableEventValidation = false;
        pagina.DesignerInitialize();
        pagina.RenderControl(hw);
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("Content-Disposition", "attachment;filename=data.xls");
        Response.Charset = "UTF-8";
        Response.ContentEncoding = Encoding.Default;
        Response.Write(sb.ToString());
        Response.End();



Convertir DataTable a CSV y lanzarlo a Excel en el cliente



Ahora, queremos lanzar un archivo .CSV de una DataTable, el siguiente método hace lo necesario, y lanza el archivo armado para ser abierto con Excel,

public static void Exportar_DataTable_a_CSV(Page page, DataTable tabla)
    {
        string archivo = "";
        int i = 0;
        int j = 0;

        try
        {
            archivo += "Mando esta tabla, Fecha de hoy: " + DateTime.Now.ToShortDateString() + "\n";


            if (tabla.Rows.Count > 0)
            {
                //Imprimimos los encabezados (Headers)
                for (i = 0; i < tabla.Columns.Count; i++)
                {
                    archivo += tabla.Columns[i].ColumnName;
                    archivo += ",";
                }
                archivo += "\n";
                for (i = 0; i < tabla.Rows.Count; i++)
                {//Iteramos en los elementos extrayendo la info y colocandola en formato CSV
                    for (j = 0; j < tabla.Rows[i].ItemArray.Length; j++)
                    {
                        archivo += tabla.Rows[i].ItemArray[j].ToString();
                        archivo += ",";
                    }
                    archivo += "\n";
                }
            }
            else
            {
                archivo += "No existen Registros";
            }

            page.Response.Clear();
            page.Response.Buffer = true;
            page.Response.ContentType = "application/vnd.ms-excel";
            page.Response.AddHeader("Content-Disposition", "attachment;filename=mitablita.csv");
            page.Response.Charset = "UTF-8";
            page.Response.ContentEncoding = Encoding.Default;
            page.Response.Write(archivo);
            page.Response.End();
        }
        catch(Exception ex)
        {
            page.ClientScript.RegisterStartupScript(page.GetType(), "Redirecicon", "");
            Debug.WriteLine(ex);
            Debug.WriteLine(ex.StackTrace);
        }
    }



Lo podemos usar de la siguiente manera (tablita es un DataTable que contiene cierta info):

Exportar_DataTable_a_CSV(this, tablita)

Por cierto que para usarlo debemos agregar las librerias:
System.Data;
System.Web.SessionState;
System.IO;
System.Diagnostics;

Explico el codigo de manera rapida:


* El chiste de la descarga de la Tabla a Excel es bajar un archivo con codigo HTML que contendra una pagina web con una sola tabla (la gridview o datatble que deseamos), debido a que Excel es bonito y sabe interpretar HTML la podremos visualizar sin problema.


* Creamos un nuevo Html Form, es decir, una nueva pagina web, que contendra una gridview.


* La gridview que contendra dicha pagina web será la misma que queremos descargar a Excel, o en el otro caso asignamos la dataTable a un objeto girdview nuevo.


* Renderizamos los controles (Inicializamos)


* Descargamos la pagina web completa, que sea abierta por Excel y listo.


* En el caso de la descarga a csv, que es mucho mas ligera y rapida, ya que usa un algoritmo sencillísimo, cuidado si el campo contiene comas.


Con especiales gracias a:
Codigo en VB por Chalalo





Tags:

  • Exportar DataTable a Excel (ASP .Net)
  • Exportar GridView a Excel (ASP .Net)
  • Descargar GridView a Excel
  • Exportar DataTable en CSV
  • Exportar DataTable C#
  • Descargar DataTable a Excel
  • Descargar Tabla como CSV
  • Crear y descargar archivo del servidor



7 comentarios:

  1. Pero si mi GridView tiene paginacion; al dar descargar solo me descarga la primera pagina y las demas salen : Internet Explorer no puede descargar

    ResponderEliminar
    Respuestas
    1. Por desgracia así es Arly, digamos que te descarga lo que ves en ese momento. Lo que mejor se acomoda a tu caso es descargar toda la DataTable, prueba con el ejemplo 2.

      (La DataTable es la que contiene la info completa que quieres descargar)

      Eliminar
  2. tengo un gridview con llena con un datatable. el gridview esta dentro de un updatepanel, e intentado con los 2 primeros metodos y nada de nada.

    por cierto es un ASPxGridView de DevExpress

    ResponderEliminar
    Respuestas
    1. Hay un error muy conocido al usar updatepanel y el método Response.Write(), los ingeniebros de Mocosoft aun no han encontrado la manera de solucionarlo que yo sepa!!.

      Estoy suponiendo que el evento de descarga lo colocaste de tal manera que se ejecuta dentro del update panel!

      Te recomiendo que pruebes de nuevo sin usar la updatepanel

      Saludos!!

      Eliminar
  3. Hola, muy bueno tu aporte, me ayudó un resto.
    Pero ahora tengo un problema ya que tengo varios gridviews y necesito exportarlos a hojas diferentes de un libro de excel.
    Te agradecería mucho si me pudieses indicar que cambios hacerle al código.
    Muchas Gracias!!!

    ResponderEliminar
    Respuestas
    1. Hola Oswaldo, solicionaste tu problema????...si es asi puedes ayudarme?

      Eliminar
    2. Quiza armando el .xlsx desde el servidor y despues lanzarlo al cliente podria solucionar el problema:
      http://www.codeproject.com/Articles/20228/Using-C-to-Create-an-Excel-Document

      Con el Metodo que yo propongo aqui no es posible debido a que lanza un HTML, no un xlsx.

      Saludos.

      Eliminar