Categories
.NET ASP.NET Excel

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 replies on “Exportar el contenido de un GridView a Excel”

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).

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

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

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

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

GRACIAS!!!

me funciono de maravilla tu codigo...

excelentes aportes 😀

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

saludos!

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

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

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?

Me suma a los agradecimientos. Muchas gracias por el código me funcionó de maravillas

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.

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

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

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

Saludos

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

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

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?

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

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 '

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.

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

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).

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

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

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.

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)

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

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

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!

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)

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

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

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.

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?

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

que la pasen bien

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

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.

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í.

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!!

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

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?

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

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

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...

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?

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!!

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?

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.

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.

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.

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

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!!

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

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)

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

Gracias

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

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 = "";

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

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

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.

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

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

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

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

Gracias

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

Gracias!

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

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.

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

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

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!

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...

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

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?

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...

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...

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

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

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.

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

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

lamentablemente no se puede adjuntar el codigo asp... no se por que?
mmm...

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

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

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.

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?

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.

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

Hola, una pregunta como hago funcionar este codigo en visual basic express 2008, no es en ambiente web 🙁 Gracias

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

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.

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

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 .......

Muchas gracias por la contribucion, me sirvio en una tarea que estoy realizando

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??

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

hola amigo, me podrias facilitar un ejemplo a mi correo, te lo agradesco de antemano, saludos

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?

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

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.