Exportar el contenido de un GridView a Excel

Hace ya bastante tiempo publiqué un pequeño "control" para exportar un Datagrid a Excel, esa vez decidí no publicar el código fuente debido a que éste tenía demasiados errores de programación -recién empezaba con .NET :-D.

Para mi sorpresa, al parecer este control fue utilizado por un gran número de personas y desde ese entonces he recibido varias consultas sobre el funcionamiento del mismo, algunas simples y otras imposibles de hacer por la forma como se hacía la exportación.

Luego de este breve repaso de la historia del mencionado control, quiero mostrar en resumen que hacía exactamente, pero esta vez utilizando ASP.NET 2.0.

El ejemplo más básico para exportar los contenidos de un GridView a Excel -en realidad sólo se envian las cabeceras necesarias para que el contenido que se envía sea reconocido como un archivo con formato Excel.

csharp:
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter htw = new HtmlTextWriter(sw);

GridView1.EnableViewState = false;
GridView1.RenderControl(htw);

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();

El problema con el anterior código, es que si el GridView contiene elementos que hace postback (HyperLink, LinkButton, Button, etc), el runtime de ASP.NET mandará un lindo error:

Server Error in '/GridView' Application.

Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server.

Este error se produce porque este tipo de controles -los que realizan postback- hacen una llamada al método Page.VerifyRenderingInServerForm(), que como se muestra en la descripción del error, se asegura que el control que se le pase a ese método esté dentro de un elemento form con atributo runat="server".

Una forma de evitar este error, es crear una página al vuelo, que contenga un elemento Form y que éste a su vez contenga al GridView:

csharp:
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter htw = new HtmlTextWriter(sw);

Page page = new Page();
HtmlForm form = new HtmlForm();

GridView1.EnableViewState = false;

// Deshabilitar la validación de eventos, sólo asp.net 2
page.EnableEventValidation = false;

// Realiza las inicializaciones de la instancia de la clase Page que requieran los diseñadores RAD.
page.DesignerInitialize();

page.Controls.Add(form);
form.Controls.Add(GridView1);

page.RenderControl(htw);

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();

Esta última porción de código es la que está presente en el control, con algunas otras "características" más.

Si alguien desea un ejemplo del código mostrado en este artículo, que lo pida en los comentarios :) .

Archivos relacionados

127 thoughts on “Exportar el contenido de un GridView a Excel”

  1. Ya he subido el proyecto de prueba, contiene una simple página para exportar los contenidos de la base de datos Northwind (adjuntado en el archivo).

  2. esta bueno, pero que pasa si quiero exportar mas de un gridview a un mismo archivo excel?

    adjunto tambien el codigo para visual studio (esto va dentro del evento click del boton exportar)

    Dim sb As StringBuilder = New StringBuilder()
    Dim SW As System.IO.StringWriter = New System.IO.StringWriter(sb)
    Dim htw As HtmlTextWriter = New HtmlTextWriter(SW)
    Dim Page As Page = New Page()
    Dim form As HtmlForm = New HtmlForm()
    GridView.EnableViewState = False
    Page.EnableEventValidation = False
    Page.DesignerInitialize()
    Page.Controls.Add(form)
    form.Controls.Add(GridView)
    Page.RenderControl(htw)
    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()

  3. Hola que tal, he leido tu articulo y es genial, es bueno encontrarse personas com tu, con ese talento. Felicidades, espero me sirva

  4. MUCHAAAAAAAAAsss.. gracias estoy en la pega y hera necesario que terminara un programilla hoy al cual solo le hacia falta exportar...

    y justamente hoy necesito salir temprano, por lo tanto te lo agradezco un millon.. MASTER

  5. Hola ,

    el codigo esta exelente , funciona muy bien , pero tengo un problema cuando edito las plantillas del gridview , para ser mas exacto cuando personalizo las columnas reemplazando el LABEL por el TEXTBOX entonces este campo ya no se transfiere al excel.

    ya se que es extraño usar textbox para presentar datos en el grid paro es que no puedo hacer el la etiqueta label conserve el tamaño original del campo.

    saludos,

    Arturo

  6. GRACIAS!!!

    me funciono de maravilla tu codigo...

    excelentes aportes :D

    siorven de mucho, sobre todo a los que nos iniciamos recien...

    saludos!

  7. Felicidades por tu espacio web, deberas que lo visito a menudo.

    He probado tu código de forma satisfactoria en varias páginas, pero ahora me encuentro con un problema, que aunque supongo tiene fácil solución, no logro dar con el.

    El problema es que mi datagrid está paginado, y al exportarlo me interesa que se muestren todos los registros sin paginar.

    He probado a poner "nombreGrid.AllowPaging = False" despues de la linea "nombreGid.EnableViewState = False" pero no se solucionó nada.

    Cualquier idea será bienvenida.

    Gracias de antemano

  8. Para que logre exportar todos los datos necesitas asignar la fuente de datos nuevamente.

    vbnet:
    nombreGrid.AllowPaging = False
    nombreGrid.EnableViewState = False
    nombreGrid.DataSource = TuDataSource
    nombreGrid.DataBind()

    Saludos

  9. Muchas gracias por el codigo, funciona muy bien aunque cuando tengo columnas con imagen para editar o eliminar una fila, al abrir el archivo generado en excel sale un recuadro gris que no me deja ver bien la tabla.

    Alguna idea de porque sucede esto?

  10. Buenos Dias.Quisiera saber si es posible mediante un codigo, enviar unos resultados de un programa que he echo en c sharp, a excel, para que excel me haga unos calculos que no puedo hacer en c hsrap como lo son la distribucion T. Invertida, Distribucion F de Fisher, emntre otras, y al final volver a tomarlos en C Sharp. Si me ayuda se lo agradeceria muchisimo, llevo bastante tiempo investigando y no he encontrado nada. la verdad es que soy nuevo en C sharp pero me parece muy bueno.

  11. Hola Jose, nunca he intentado hacer algo parecido a lo que pides, pero si fuera tu intentaría buscar las implementaciones en c# de las funciones que mencionas.

    Saludos

  12. Tu codigo me funciono, pero tengo el problema que necesito exportar mas de 200,000 registros, y teniendo el gridview al excel solo me pasa los 65,000 y tantos maximo que tiene, me podes ayudar con eso??? Necesito crear tantos exceles como datos quepan.. Te lo agradeceria muchisimo

  13. ksolanoo, debes paginar tus datos en porciones razonables, puesto que no sé que utilidad tenga poner tantos datos juntos en archivos Excel.

    Saludos

  14. Pero no se como hacerlo.. sabes teniendo el dataset, lo cargue todo en un datatable y he ido leyendo cada data.... pero no se como particionar el datatable... osea para que se me hagan tantos archivo como daatos hayan :( porfaaaa ayudame

  15. hola queria saber como importar un datagrid a excel no hacer una copia exacta porque quiero copiar ciertas celdas
    Muchas gracias

  16. Hola!
    Éste método es muy bueno, a mi me funciona perfectamente cuando exporto solo texto, pero si quiero exportar algun elemento de html me falla, tan solo parece que se recarga la pagina en blanco (con la informacion inicial, como si se "re-seteara") el problema sólo aparece cuando exporto mucha informacion (unos 10 000 registros) y entre ésta hay tags HTML, alguien tiene alguna idea?

  17. ksolanoo, haz la paginación a nivel de base de datos, no me parece muy adecuado tener todos los datos en memoria a la vez. El código para hacer esta tarea dependerá del DBMS que estés usando.

    Gustavo, no sé que nivel de personalización desees como para sugerirte algo concreto.

    Odin, no hice la prueba con textos que contienen etiquetas HTML. ¿Se reproduce ese mismo comportamiento cuando exportas pocos datos?

    Saludos

  18. Hola , encontre lo que estaba buscando baje el ejemplo que pusiste y si corre perfecto, pero al quererlo implementar en mi aplicacion web se genera este error:

    Sys.Webforms.PageRequestManagerParserErrorException, The message receive from the server could not be parsed. Common causes for this error are when the response is modified bye call to response.write(),response filters

    Details: Error Parsing near '

  19. Hola, tengo el siguiente problema. trato de exportar a EXCEL una tabla HTML inicialmente tiene un valores: como nombres titulos y valores por defecto para que puedan ser accedidos desde el net les puse que corran del lado del servidor y cuando trato de exportarlos me exportarlos los datos iniciales, como si el postback borrara los datos.
    Espero me entiendan y puedan ayudarme.

  20. Buen dia, primero quiero felicitarte por el codigo que publicaste, y segundo pedirte una ayuda, me sale el siguiente error:
    The Controls collection cannot be modified because the control contains code blocks (i.e. )
    y no se como exportar el gridview. El archivo .aspx si tiene las etiquetas pero no el cuerpo del gridview.
    Gracias

  21. Santiago, imagino que te manda ese error porque algún control está modificando en tiempo de ejecución la estructura de la página (como título, agregar elementos meta al documento html, etc).

  22. muy buen articulo felicidades, solo una duda mi gridview tiene un boundfield el cual uso para seleccionar alguna fila de mi gridview pero cuando quiero pasar la informacion a excel me marca error, hay alguna forma de corregir esto? el error lo marca en la linea frm.RenderControl(hw) y dice asi: Sólo se puede llamar a RegisterForEventValidation durante Render();

    gracias y saludos

  23. Hola, yo usé lo que dijiste para arreglar una funcion que obtenía el HTML de un control al sobreescribir la función "VerifyRenderingInServerForm" en la página.

    Tengo un problema, cuando rendereo un datagrid, no toma los "ItemCreated" ni los "ItemDataBound".... alguien sabe que se puede hacer???? muchas gracias

  24. Alexander y diego: actualmente estoy un poco ajustado de tiempo como para darle una revisión al código.

    Una alternativa que les sugiero que vean es hacer uso de Server.Execute para lograr resultados similares.

  25. Alexander: con esta línea arreglarías tu problema (obviamente antes de renderear):

    page.EnableEventValidation = false;

    Alex: Lamentablemente server.execute no me sirve en este caso =(

    sigo buscando, pero ya mire toda la red, castellano e inglés y no encontré nada que me pueda ayudar.... lamentablemente creo que voy a tener que volver al framework 1.1 donde esto funcionaba... (de hecho la idea es migrar una aplicación que funciona perfectamente del framework viejo al nuevo)

  26. muchas gracias ya funciona mi ejemplo y ya no tengo ningun problema como el que comentas diego, saludos

  27. te agradecería si me pasas tu ejemplo alex, si me funciona voy a poder ver qué diferencia tenemos en los códigos, no importa cuánto tiempo me lleve =)
    el problema es que estoy trabado con esto y no puedo seguir
    realmente si me pasás por mail ese ejemplo te voy a agradecer muchísimo
    PD: de nada alexander =)

    alex alexander, que confuso jajaja

  28. alex, ya lo pude arreglar!!!! el problema estaba en otro lado: yo guardaba el datagrid en un session y despues lo agarraba de neuvo, cuando lo agarraba (solo pasa esto en el framework 2.0, en el 1.1 no) pierde los itemdatabound e itemcreated, se los seteo de nuevo y listo, la aplicacion funciona 10 puntos =) =) =) =)

    muchas muchas gracias por todo!

  29. es muy util ^^
    haces un datagrid bonito con [asp:datagrid bleh bleh] en un aspx, despues lo guardas en el session vacío y lo podes usar para bindear y devolver el html dentro de un ajax

    magnifique (para datagrids chicos)

  30. Hola! Tengo dentro de un user control un gridview que quiero mandar por mail, he utilizado los ejemplos anteriores para volver el grid html ahora no sé cómo llamarlo desde la página aspx.cs para mandarlo por mail este es mi código

    csharp:
    protected string GetControlAsHtml(Control ctrl)
        {
            StringWriter sw = new StringWriter();
            HtmlTextWriter htm = new HtmlTextWriter(sw);
            ctrl.RenderControl(htm);
            return sw.ToString();
           
        }
        public string GridUsers(Control ctrl)
        {
            return GetControlAsHtml(GridView1);
        }
     

    me puedes ayudar a hacer una función publica que me devuelva el control a la pagina

    Gracias

  31. Hola, soy nuevo en esto de la programacion web asi que estoy dando mis primeros pasos. Probe el codigo y en mi aplicacion web se genera este error:

    Sys.Webforms.PageRequestManagerParserErrorException, The message receive from the server could not be parsed. Common causes for this error are when the response is modified bye call to response.write(),response filters

    Details: Error Parsing near '

    que puede ser?
    Gracias
    Pablo

  32. Saludos...

    Probé el ejemplo y lamentablemente no funciona cuando tienes todo dentro de un UpdatePanel, estoy usando Ajax y obviamente va en contra del Response.Write jeje...

    Alguna solucion??

    Gracias.

  33. Hola,

    Me funciona perfectamente el código para exportar un gridview a Exel.

    El problema lo tengo con el formato (colores, ancho de columna...), cómo puedo hacer para que se exporte el gridview exactamente igual al que se ven en el explorer?

  34. El Código de exportar los datos de asp a Excel .... me funicono de maravilla graciassssssss

    que la pasen bien

  35. Hola...me podrias enviar el codigo, en verdad me ayudaria mucho con unproyecto que estoy desarrollando actualmente...

  36. Fuera de este tema, tienes alguna idea de como hacer que el gridview funcione con MySQL como funciona con SQL Server de Microsoft? En especial me interesa la parte de editar, ya logre hacer desplegar la informacion en forma ligada a la base de datos (con algunos problemas como "ñ"'s o acentos) pero no logro haver la parte del edit (update y delete.
    Te agradecería tu asesoria. Gracias de antemano.

  37. Michel, para el problema de las ñ y tildes, sólo tienes que especificar la codificación adecuada en el Web.config.

    Por otro lado, para la parte de edición del DataGrid no importa si usas SQL Server o MySQL, supongo que debe haber un error por ahí.

  38. Hola, muy bueno tu codigo, funciona igual que en asp (no .NET), mi problema es como puedo generar un archivo de Excel en el cliente pasandole los datos del DataGrid??

    Saludos!!

  39. Hola a todos!, primero les informo que ya tengo la funcionalidad para exportar a excel un gridview ahora lo que necesitro hacer es exportar el mismo grid pero no todos los registros si no los que se han filtrado por medio de un dropdownlist es decir ahi eligo una categoria se refresca el gridview con los datos correspondientes a esa categoria y esos son los que deseo exportar a excel.?

    gracias y saludos a todos

  40. Saludos, Ayuda

    Tengo un Query(Oracle) que algunos de sus field son varchar2, parte de su contenido es '0204', o sea algunos tiene el '0' cero delante. Cuando es llevado a Excel el o los '0' zeros que tiene delante son quitados y aparace '406'. ¿Cómo puedo hacer para que los cero permanescan y no sean quitados?

  41. Saludos, Ayuda

    Tengo un Query(Oracle) que algunos de sus field son varchar2, parte de su contenido es '0204', o sea algunos tiene el '0' cero delante. Cuando es llevado a Excel el o los '0' zeros que tiene delante son quitados y aparace '406'. ¿Cómo puedo hacer para que los cero permanescan y no sean quitados?

    Gracias

  42. Tienes que poner lo siguientes antes de hacer el response.Write

    string sStyle = @" .CssText { mso-number-format:\@; } ";
    response.Write(psStyle);

    Con esto respetara los ceros de la izquierda

  43. Hola a tods.. me podrias ayudar por favor..necesito exportar a excel no solo el contenido del grid sino una imagen .jpg...gracias de antemano...

  44. hola otra vez eh regresado a terminar mi gris de datos que estoy desarrollando, ahora la pregunta es:
    como hago para activar o desactivar por medio de codigo la paginacion de un gridview, ya sea con un checkbox o con un boton de asp?
    y la ultima como recupero el indice de la columna por la cual esta ordenado el grid? ovio para esto en tiempo de ejecucion el usuario lo puede modificar y le quiero marcar o seleccionar la columna por la cual hace el ordenamiento?

    gracias y saludos a todos?

  45. Hola que tal:

    Ya tengo mi datagrid y en el evento click de un boton puso el codifo para exportarlo a excel y me aparece el error de:

    Sys.Webforms.PageRequestManagerParserErrorException, The message receive from the server could not be parsed. Common causes for this error are when the response is modified bye call to response.write(),response filters

    Details: Error Parsing near '<form method="post" '

    Efectivamente todo esto esta dentro de un updatepanel ya que corresponde a una seccion independiente d emi proyecto, alguien me puedo ayudar??!!

    Gracias!!

  46. Hola, he utilizado el control en ocasiones anteriores sin problemas, pero ahora, en una nueva aplicación que estoy desarrollando me arroja el error: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack. Mis sospechan van por el lado de la versión del excel, que es del office 2007, además he provado diferentes maneras de exportar a excel y todas fallan por lo mismo. No se si existe alguna referencia o antecedente respecto de esto?

  47. Hola Campeón.

    Muchas gracias por la ayuda. Requiero exportar a Excel desde un grid view en una aplicacion windows, por casualidad me puedes ayudar con un ejemplo.

    Exitos y eres un gran mentor.

  48. Hola, por favor ayudenme, tengo una base de datos en excell de 65000 clientes y quiero que llegue a 120,000 pero obvio ya no caben filas, que hago x fa , lo tengo que entregar en esta semana.

  49. Hola, por favor ayudenme, tengo una base de datos en excell de 65000 clientes y quiero que llegue a 120,000 pero obvio ya no caben filas, que hago x fa , lo tengo que entregar en esta semana.
    quiero evitar clientes duplicados , por fa ayudenme ustedes que son unos expertos y maestros.

  50. The HTML export to Excel in a real web world works only when you have a few records. Moreover you have no output control (numer of decimal digits, numeric fields, etc)

    If you need real controlled exports you must obtain iether a real XML format export to Excel 2003 or xlsx format export to Excel 2007. Look at http://www.gridviewtoexcel.com

  51. Hola!!!! necesito exportar varios datagrids en el mismo excel uno debajo del otro o sino en diferentes hojas, cualquiera de las dos formas, quisiera saber si existe alguna forma de hacerlo usando este control. Muchas Gracias!!

  52. hola soy nuevo en esto. y el codigo es bueno;
    me gustaria si pueden mandar mas informacion sobre el tema u otros.
    gracias

  53. Cuando ejecuto el código todo parece estar bien ya que me pregunta que quiero hacer con el archivo excel, pero ya sea que le de guardar o abrir, nada sucede. ¿Qué puede estar sucediendo? Mi codigo es este:
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    Page page = new Page();
    HtmlForm form = new HtmlForm();
    gvConsulta.AllowPaging = false;
    gvConsulta.EnableViewState = false;
    gvConsulta.DataSource = Session["gvConsulta"];
    gvConsulta.DataBind();
    // Deshabilitar la validación de eventos, sólo asp.net 2
    page.EnableEventValidation = false;
    // Realiza las inicializaciones de la instancia de la clase Page que requieran los diseñadores RAD.
    page.DesignerInitialize();
    page.Controls.Add(form);
    form.Controls.Add(gvUdaisAsoc);
    page.RenderControl(htw);
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("Content-Disposition", "attachment;filename=Consulta.xls");
    Response.Charset = "UTF-8";
    Response.ContentEncoding = Encoding.Default;
    Response.Write(sb.ToString());
    Response.End();

    ( En la sesion tengo guardada la List con que alimento el gridview)

  54. Me podrias enviar el codigo por favor? me sale un error de "Sólo se puede llamar a RegisterForEventValidation durante Render();"

    Gracias

  55. estimados, muy buenos aportes, espero que esto sirva

    el codino inicial o comun para exportar a excel es (vb.net):

    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader("Content-Disposition", "attachment;filename=AnyName.xls;")
    Response.Charset = String.Empty
    Me.EnableViewState = False
    Dim oStringWriter As New System.IO.StringWriter
    Dim oHtmlTextWriter As New System.Web.UI.HtmlTextWriter(oStringWriter)
    grvDatos.RenderControl(oHtmlTextWriter)
    Response.Write(oStringWriter.ToString)
    Response.End()

    este codigo arroja un error cuando se usa ocn la master page, pero con esta declaracion se soluciona

    Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)

    End Sub

  56. Para quienes tengan problemas con las eñes y con los tildes, pueden cambiar la codificación con:
    Response.ContentEncoding = System.Text.Encoding.UTF8;
    Response.Charset = "";

  57. estimados saludos, probando el codigo, funciona casi todo bien, excepto, con el tema de decimales, por ejemplo el numero 145,9700 se transforma en 1.459.700, esto psa al momento de la conversion a excel, espero que alguien me pueda ayudar, gracias

  58. Estoy haciendo un reporte desde visual y asp .net ... el reporte ya esta bien ... lo unico que necesito es saber como mandarle la imagen de la empresa al Reporte de Excel ... espero q alguien me pueda ayudar ... gracias

  59. Slds a todos los que colaboraron con la exportacion de Datagrid a Excel ya que intente diferentes formas de hacerlo y solo gracias a sus aportaciones encontre la solucion para hacerlo, pero tengo un inconveniente en el datagrid tengo casi 4000 registros y el grid tiene AllowPaging para no mostrar todos los datos en el WebForm al exportar los datos solo me exportar las primeras 10 filas de la paginacion, es necesario el pagineo ya que el reporte de datos tiene varios filtros, espero me pueda ayudar alguien para exportarlos todos.

  60. Hola estoy desarrollando una aplicacion web con asp net 2.0 y la programacion en visual Basic. Mediante el codigo descrito anteriormente consigo exportar un gridview a excel, pero el problema es que no tengo que exportar un gridview lo que tengo que hacer es que el cliente al pulsar un boton le genere un excel pero con un determinado formato y rellenar datos que leo de una base de datos.
    Gracias

  61. como hago para exportar un reporte a pdf, sin usar crystal report ya que en el ejemplo anterior si le cambamos la extencion de data.xls a data.pdf este genera un error gracias

  62. Algo mas simple de hacer... Si se quiere exportar a Excel 2003 o superior, como estos soportan XML, se puede hacer lo siguiente siempre y cuando el datasource de la Grilla sea un Dataset.

    Grilla.Datasource=miDs;
    Grilla.DataBind();

    // Funcion exportar
    miDs.WriteXML("C:\data.xls");

    eso generaria un archivo de excel con los datos. La condicion es que al hacerlo desde ASP.NET, tendriamos que escribir en otro directorio, ya que no podemos guardarlo en la PC del usuario.
    Saludos, espero les haya servido

  63. Buena tarde ... puedes facilitarme el codigo para exportar un gridview a excel... en aso.net

    Gracias

  64. Hola!
    Pues... a mi no me funciona!
    Se queda de "StringBuilder"...
    Esto funciona en ASP programado en VB?

    Gracias!

  65. xcheles, yo tenía el mismo error:

    Sys.Webforms.PageRequestManagerParserErrorException, The message receive from the server could not be parsed. Common causes for this error are when the response is modified bye call to response.write(),response filters

    Details: Error Parsing near ‘<form method=”post” ‘

    Se soluciona quitanto el UpdatePanel :-( o aislando el botón de export a XLS fuera del UP.

    Saludos

  66. Hola,

    Necesito saber si también es posible exportar a Excel desde una aplicación Windows Forms.

    Agradeceré mucho la respuesta, este tema me tiene en ascuas.

    Saludos.

  67. Hola yo lo estoy haciendo en Visual Studio 2008 - Visual Basic

    Antes que nada gracias por publicar este código.

    Me muestra el archivo “data.xls” pero esta vacio. sin datos (mis dato son muy simples dos campos string)

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim sb As StringBuilder, sw As StringWriter, htw As HtmlTextWriter, form As HtmlForm

    sb = New StringBuilder
    sw = New StringWriter
    htw = New HtmlTextWriter(sw)

    Page = New Page
    Form = New HtmlForm

    GridView1.EnableViewState = False
    ' GridView1.AllowPaging = False
    ' GridView1.DataBind()

    'Deshabilitar la validación de eventos, sólo asp.net 2
    Page.EnableEventValidation = False

    'Realiza las inicializaciones de la instancia de la clase Page que requieran los diseñadores RAD.
    Page.DesignerInitialize()

    Page.Controls.Add(form)
    form.Controls.Add(GridView1)

    Page.RenderControl(htw)

    Response.Clear()
    Response.Buffer = True
    'Response.ContentType = "application/vnd.ms-excel"
    Response.ContentType = "text/plain"
    Response.AddHeader("Content-Disposition", "attachment;filename=data.xls")
    Response.Charset = "UTF-8"
    Response.ContentEncoding = Encoding.Default
    Response.Write(sb.ToString())
    Response.End()

    End Sub

    Quien me podria ayudar, gracias

    Diego Rojas - dierojas@hotmail.com

  68. Muchas Gracias ya funciono.

    Saludos

    Diego Rojas
    Dim sb As StringBuilder = New StringBuilder()
    Dim sw As StringWriter = New StringWriter(sb)
    Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
    Dim pagina As Page = New Page
    Dim form = New HtmlForm
    GridView1.EnableViewState = False
    pagina.EnableEventValidation = False
    pagina.DesignerInitialize()
    pagina.Controls.Add(form)
    form.Controls.Add(GridView1)
    pagina.RenderControl(htw)
    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()

  69. Hola.... esto no va en asp....
    Me da este error:

    Error de compilación
    Descripción: Error durante la compilación de un recurso requerido para dar servicio a esta solicitud. Revise los detalles de error específicos siguientes y modifique el código fuente en consecuencia.

    Mensaje de error del compilador: BC30002: El tipo 'StringWriter' no está definido.

    Error de código fuente:

    Línea 669: Sub Button6_Click(sender As Object, e As EventArgs)
    Línea 670: Dim sb As StringBuilder = New StringBuilder()
    Línea 671: Dim sw As StringWriter = New StringWriter(sb)
    Línea 672: Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
    Línea 673: Dim pagina As Page = New Page

    Alguien puede ayudarme?

    Muchas gracias!

  70. buena tarde:
    Tengo un problema y agradeceria sus opiniones.
    Al usar MiDataSet.WriteXml("ruta a guardar") para exportar mi Dataset a Excel pierdo los ceros de la izquierda de algunos campos.
    Como se podria solucionar eso?

    Gracias...

    Jorcar...

  71. Saludos , pot favor orientame que es mas recomendable usar si la libreria de ajax o utilizarla interface icallbackevenhandler

  72. Oye te agradesco miles el aporte pero me sale el error "Sólo se puede llamar a RegisterForEventValidation durante Render();" podrias orientarme para saber que puede ser?

  73. que tal muy buen a porte,me sirve el codigo cuando creo apenas un sitio pero al anexarlo a un sistema me manda el siguiente error:
    The Controls collection cannot be modified because the control contains code blocks (i.e. ).
    me podrian ayudar...

  74. Oye te agradesco miles el aporte pero me sale el error “Sólo se puede llamar a RegisterForEventValidation durante Render();” podrias orientarme para saber que puede ser y/o como solucionarlo?

    de antemano muchas gracias...

  75. Hola que tal, quisiera saber cómo puedo dar formato de color de celda a excel; ya que efectivamente puedo exportar el gridview pero tiene cada columna un color diferente.

    Gracias de antemano

  76. hola, buena tarde, en la aplicacion que funciona en la empresa donde trabajo, se puede imprimir en pdf y exportar a exel sin problemas, pero cuando corro mi aplicación desde fuera de la empresa no se me permite imprimir ni exportar, se supone que en la empresa hay protección contra invasión por medio del proxy, crees que el error se deba a eso o tienes alguna sugerencia para corregirlo?? gracias de antemano

  77. Exelente codigo si funciono lo que buscaba, solo que tengo un problema la informacion que exporto al excel, la primer columna trae un text muy largo, la mayoria son numeros y quiero conservar los registros con el valor completo.

    Ejemplo los valores de la primer columna la mayoria son de este tipo 2458200905012360, pero al exportarlo a excel los cambia asi 2.4582E+15 y yo necesito conservarlo en excel de tipo texto..

    Espero me puedan ayudar.

  78. Esdras Mellanes y Onix:
    Yo tenia el mismo problema con este mensaje. Entonces además de agregar el codigo:
    public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
    {
    return;
    }
    hice lo siguiente:
    yo estaba sacando los datos desde una grilla paginada. entonces hice una nueva grilla sin paginacion (y oculta) y desde ésta estoy exportando a excel. No se si tendrá mucho que ver, pero me funcionó, les mando el codigo asp de mi "grilla Impresion":

    Por lo tanto, el codigo de boton Exportar quedaría de la siguiente manera:

    //Exporta el documento a excel
    Response.ClearContent();
    Response.AddHeader("content-disposition", "attachment; filename=Archivo.xls");
    Response.ContentType = "application/excel";
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    Grilla_Impresion.Visible = true;
    Grilla_Impresion.RenderControl(htw);
    Response.Write(sw.ToString());
    Response.End();

  79. Esdras Mellanes y Onix:
    Yo tenia el mismo problema con este mensaje. Entonces además de agregar el codigo:
    public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
    {
    return;
    }
    hice lo siguiente:
    yo estaba sacando los datos desde una grilla paginada. entonces hice una nueva grilla sin paginacion (y oculta) y desde ésta estoy exportando a excel. No se si tendrá mucho que ver, pero me funcionó, les mando el codigo asp de mi “grilla Impresion”:

    Por lo tanto, el codigo de boton Exportar quedaría de la siguiente manera:

    //Exporta el documento a excel
    Response.ClearContent();
    Response.AddHeader(”content-disposition”, “attachment; filename=Archivo.xls”);
    Response.ContentType = “application/excel”;
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    Grilla_Impresion.Visible = true;
    Grilla_Impresion.RenderControl(htw);
    Response.Write(sw.ToString());
    Response.End();

  80. holas...gracias por este coódigo
    pero no me funciona...quiero usarlo para exportar una tabla que se genera dinamicamente a partir de unos parametros. Agregué esta función pero me exporta el excel vacío....como hacer para exportar los datos de esta tabla que cree en tiempo de ejecución??

    atte.
    David

  81. Alguin sabe con este codigo como puedo agregarle titulo y subtitulos que se visualicen en el excel de esta manera. De ante mano gracias.

    Comercializadora Central de Mexico
    Comparativo de Cierre

    Del: 02-Abr-09 Al: 02-Abr-09

  82. q tal gente e tratado con muchos codigos y aun no logro esportar mi gridview a exel.

    el codigo anterior si funsiona solo q al momento de entrara exel me dice "el archivo q se intenta abrir tiene otro formato que el especificado por la extencion del archivo,compuruebe q el archivo no este dañado y procede de un origen de confianza antes de abrirlo¿Decea abrir el archivo a hora?" y si le digo q si me manda codigo unas lineas de codigo

    espero me ayuden por favor

    y si es posible tambien algun metodo para enviar a pdf gracias.

  83. buen aporte, tengo un problema, en el gridview tengo en una columna un numero grande 80047861029700000025, al expotar esta columna a excel con este método, al abrir el excel generado en esta columna aparece 8.00479E+19 como hago para que se exporte en formato de texto y aparezca el numero entero?

  84. Buenos días.. tengo el mismo problema que leonardo. Cuando intento abrir el archivo me sale el siguiente error: “el archivo q se intenta abrir "nombre.xls "tiene otro formato que el especificado por la extencion del archivo,compuruebe q el archivo no este dañado y procede de un origen de confianza antes de abrirlo¿Decea abrir el archivo a hora?”. si le doy que si me trae bien la informacion. pero quiero que al abrirlo no me salga ese mensaje.

    Alguien sabe como puedo solucionar ese problema.

    Gracias.

  85. De este modo tambien funciona muy rapido y bien
    mi pregunta como hacerlo funcionar dentro de un Pagina que esta Dentro de UN MASTERPAGE

    csharp:
     
    DataGrid ooDG = new DataGrid();
            CDb oooDb = new CDb();
            DataSet oooDs = new DataSet();
            oooDs = oooDb.SP_Account_Traffic_Report("", "0", "", "");

            ooDG.DataSource = oooDs;
            ooDG.DataBind();
            Response.Clear();
            Response.Buffer = true;
            Response.ContentType = "application/vnd.ms-excel";
            Response.Charset = "UTF-8";
            Response.ContentEncoding = Encoding.Default;

            this.EnableViewState = false;
            System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
            ooDG.RenderControl(oHtmlTextWriter);
            Response.Write(oStringWriter.ToString());
            Response.End();

  86. Hola, una pregunta como hago funcionar este codigo en visual basic express 2008, no es en ambiente web :( Gracias

  87. Yo tengo un código para enviar el GRIDVIEW a una hoja EXCEL, mi problema es que en la pagina aspx aparecen varios GRIDVIEW y los que se muestren en la pagina de consulta quisiera exportarlos a EXCEL, gracias de antemano

  88. Leyendo el aporte que hace Alex el 27 de febrero de 2007. les cuento que sobre una de las líneas

    nombreGrid.AllowPaging = False
    nombreGrid.EnableViewState = False
    nombreGrid.DataSource = TuDataSource ( Esta sobre, si se deja saca error )
    nombreGrid.DataBind() ( con esta es suficiente)

    A todos mil gracias, excelente los aportes me ayudaron mucho. Hace tiempo esta buscando esta valiosa ayuda.

  89. hola,
    me funciono el codigo muchas gracias nada mas que me sale un error al abrir el excel "El archivo que intenta abrir, 'data[3].xls', tiene otro formato que el especificado por la extension del archivo. Compruebe que el archivo no esta dañado y procede de un origen de confianza antes de abrirlo" y es que en mi Grid tengo 2 columnas con unos iconos que tienen la funcionalidad de Editar y Borrar y cuando esas 2 columnas se exportan se ve un cuadro girs......Como puedo hacer para darle formato y no me aparezcan esas columnas

    de ante mano gracias a quien conteste

  90. Buenas me funiono bien el codigo en CSHARP siguiente;
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter htw = new HtmlTextWriter(sw);

    Page page = new Page();
    HtmlForm form = new HtmlForm();

    gridMov.EnableViewState = false;

    // Deshabilitar la validación de eventos, sólo asp.net 2
    page.EnableEventValidation = false;

    // Realiza las inicializaciones de la instancia de la clase Page que requieran los diseñadores RAD.
    page.DesignerInitialize();

    page.Controls.Add(form);
    form.Controls.Add(gridMov);

    page.RenderControl(htw);

    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();

    Pero al abrir el archivo EXCEL sale disparado el cuadro del gridview como se puede dar formato o evitar eso solo que muestre los datos del gridview.......
    Gracias .......

  91. Por que en mi pagina el nombre del archivo descargado me pone toda la ruta c_intetpub_reportes .... y no solo el nombre del archivo??

  92. Esta es una clase en VB que genera un excel a partir de un DataSet.

    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.Drawing

    Imports Microsoft.Office.Interop.Excel
    Imports System.Reflection

    Imports config = System.Configuration
    Imports ficheros = System.IO
    Imports Variables.cVariables

    Namespace Exportar
    Public Class ExportarDades

    Public Sub New()
    End Sub

    Public Shared Sub Exportar_a_Excel(ByVal Titol As String, ByVal ExcelName As String, ByVal sheets As String, ByVal DS As DataSet)

    ' Prevenir conflicto de idiomas. Si no se pone genera este error:
    ' Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

    Try

    Dim _excel As New Application()
    Dim _wBook As Workbook = _excel.Workbooks.Add(Missing.Value)

    Dim idx As Integer = 0
    While idx < DS.Tables.Count

    Dim _sheet As Worksheet = DirectCast(_wBook.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value), Worksheet)
    _sheet.Name = sheets

    ' Situación del logo —si está en—: A1
    Dim imagen As Object = _sheet.Pictures.Insert("logo.jpg")
    Dim cell = _sheet.Cells(1, 1)

    'Centramos el ancho
    Dim ancho As Double = cell.Offset(0, 1).Left - cell.Left
    imagen.Left = cell.Left + ancho / 2 - imagen.Width / 2
    If imagen.Left < 1 Then imagen.Left = 1
    'Centramos el alto
    Dim alto As Double = cell.Offset(1, 0).Top - cell.Top
    imagen.Top = cell.Top + alto / 2 - imagen.Height / 2
    If imagen.Top < 1 Then imagen.Top = 1

    'Suponemos que el logo ocupa 5 filas..., montamos el título del informe en la fila 6 i damos el format establecido.
    Dim r As Integer = 6
    _sheet.Cells(r, 1) = Titol.ToString
    Dim rng As Range = DirectCast(_sheet.Cells(r, 1), Range)
    rng.EntireRow.Font.Bold = True
    rng.EntireRow.Font.Size = 20
    rng.EntireRow.Interior.ColorIndex = 40
    rng.EntireRow.Font.ColorIndex = 30

    '2 lineas mes i montamos las cabeceras de las columnes i damos el format
    r += 2
    Dim k = 0
    While k < DS.Tables(idx).Columns.Count
    _sheet.Cells(r, k + 1) = DS.Tables(idx).Columns(k).ColumnName.ToString()
    System.Math.Max(System.Threading.Interlocked.Increment(k), k - 1)
    End While
    rng = DirectCast(_sheet.Cells(r, DS.Tables(idx).Columns.Count), Range)
    rng.EntireRow.Font.Bold = True
    rng.EntireRow.Interior.ColorIndex = 30
    rng.EntireRow.Font.ColorIndex = 40

    'Y a partir de aquí, montamos todos los datos del DataSet
    r = 0
    While r < DS.Tables(idx).Rows.Count
    k = 0
    While k < DS.Tables(idx).Columns.Count
    _sheet.Cells(r + 9, k + 1) = DS.Tables(idx).Rows(r).ItemArray(k)
    System.Math.Max(System.Threading.Interlocked.Increment(k), k - 1)
    End While
    System.Math.Max(System.Threading.Interlocked.Increment(r), r - 1)

    End While
    System.Math.Max(System.Threading.Interlocked.Increment(idx), idx - 1)
    End While

    If ficheros.File.Exists(ExcelName) Then
    ficheros.File.Delete(ExcelName)
    End If

    ' Salimos del Excel
    _excel.ActiveCell.Worksheet.SaveAs(ExcelName, XlFileFormat.xlOpenXMLWorkbook, Missing.Value, Missing.Value, Missing.Value, Missing.Value, _
    Missing.Value, Missing.Value, Missing.Value, Missing.Value)
    _excel.Quit()

    ' Mostrar el excel
    _excel.Visible = False

    ' Matamos el proces si queda abierto
    deleteProcess()
    Catch ex As Exception
    Dim ss As String = ex.Message

    ' Matamos el proces si queda abierto
    deleteProcess("Excel")
    End Try

    End Sub

    Private Shared Sub deleteProcess(ByVal Process As String)

    Dim miproceso As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName(Processo)

    For Each pc As System.Diagnostics.Process In miproceso
    pc.Kill()
    Next

    End Sub

    End Class
    End Namespace

  93. Hola, muy buen articulo gracias, pero tengo un problema solo me exporta la primer pagina del Grid, como puedo hacer para que me exporte todo su contedido de todas la paginas del grid?

  94. Saludos.
    se que funciona tu codigo en paginas sin masterpage... pero cuando son este caso. NO funciona el codigo manda el mismo error de render, si lo defines la sobrecarga en la masterpage no lo permite y en la pagina content al igual no funciona. Hay alguna solucion?
    Mil gracias

  95. Amigos alguien sabe como hacerle para que en la pestaña del excel que se genero , me ponga el nombre HOJA1 en lugar del nombre con que estas generando el archivo.

    Gracias

Comments are closed.