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.
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:
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 🙂 .
127 replies on “Exportar el contenido de un GridView a Excel”
saludos me puedes facilitar el ejemplo
gracias de antemano
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).
saludos maestro me puedes proporcionar el codigo de este ejemplo.
Hans, el código ya está publicado, puedes encontrarlo al final del artículo
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
Gracias por el comentario.
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
Saludos.
favor si me puedes ayudar con el ejemplo gracias.
Hernan R
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!
Me funciono de maravilla para un proyecto de la univ muchas gracias 🙂
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.
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?
Ni idea, pero creo que sería mejor si quitas esas columnas.
Saludos
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)
@diego: acabo de probar un ejemplo simple y no veo ningún problema -al menos con el evento ItemDataBound.
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!
Bien por ti diego, aunque me parece un poco extraño guardar un Datagrid en la sesión 🙂
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
{
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
Se agradece el proyecto, funciona sin problemas.
Gracias. 😉
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?
Para Diego....me pasarias el codigo para guardar un datagrid en una session??? como lo recupero despues????
Mil Gracias
Perdon...obviamente tengo ajax adentro...no hay problema de pasarlo????
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
Hola! ¿Y para Excel 2007?
¿Me sirve el mismo código?
gracias pero ya lo hace automatico !!
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;
Me puedes facilitar el ejemplo.
Gracias.
Gracias me fue de mucha ayuda tu ejemplo, en verdad gracias y felicitaciones por esa labor
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!!
me puede ayudar bastante si me facilitas el ejemplo,
gracias de antemano,
necesito exportar solo un dataview a exel ayuda porfa, respuestas al syncmaster7771@hotmail.com
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
Muchas 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...
puchas pelonas se venden pitos con mecos puto el que lo lea
chico fusca chica ardiente qu coja amage y chupe los mecos
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...
Simplemente maravilloso....
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
Gracias
MASTER Dario LA CAGASTE FILTE EL CODIGOOOOOO FUNCO A LA PRIMERA TE PASATE
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.
Excelente, muchas 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
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
Acerca del mensaje, no tienes porqué preocuparte.
ejemplo del proyecto... gracias
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 favor podrias enviarme un ejemplo del codigo fuente usado en el sitio web, gracias de antemano
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