Exportar DataGrid a Excel desde WebForms en ASP.NET + VB.NET
Artículo escrito por Dani de la Cruz • Jun 5th, 2006 • Categoría: Informática y programaciónAviso para navegantes: este es un artículo únicamente dirigido a aquellos que programen en .NET y necesiten solucionar este problema. El resto, podeis pasar, porque seguramente os parecerá aburrido ![]()
Software necesario:
- Microsoft Visual Studio .NET
Microsoft IIS
Microsoft Excel
Microsoft SQL Server 2000
Introducción
El otro día, en el trabajo conseguí cómo hacer algo que en principio debería ser trivial, pero a muchos de los que programamos en .NET no nos lo parece en absoluto. O al menos, en la cantidad de foros que visité para saber cómo hacerlo, encontré infinidad de preguntas sin respuesta referentes al mismo tema.
Vereis, llevaba tiempo queriendo generar un informe en formato Excel utilizando una plantilla. Tengo una aplicación web desarrollada en ASP.NET que se dedica a interactuar con una base de datos en SQL Server 2000. En esta aplicación hay un DataGrid con una serie de datos que, al exportarlos a Excel, sirven para consultar una serie de estadísticas y gráficos que se generan mediante unas fórmulas de la plantilla.
Una vez puestos en situación, existen varias soluciones a este problema, de las cuales me quedo con dos:
Solución 1: Renderizar el DataGrid en un fichero de salida y renombrarlo a *.xls
Esta es la solución más chapucera, pero también la más sencilla y rápida. Y para según qué casos, sobre todo si no necesitáis usar una plantilla Excel, sólo exportar a este formato os puede resolver el problema enseguida.
Se trata de renderizar el DataGrid a html, y escribir mediante HTTP en un fichero, que guardaremos con extensión .xls. Es posible cambiar el formato del fichero de salida gracias al código HTML, pero poco más. El código es el siguiente:
Como veis, sólo se trata de escribir en un flujo de salida dirigido a un fichero, como si escribiéramos por http. Se puede utilizar código HTML, ya que el Excel lo entenderá. De esta forma se puede dar formato a un encabezado (por ejemplo) mediante las etiquetas HTML convencionales.
Fuente: El Rincón del Programador
Solución 2: Utilizando funciones de librerías .NET
La solución que utilicé yo, ya que con la anterior no se puede exportar a una plantilla. Sólo se puede crear un archivo vacío y sin formato (que le puede ser útil a mucha gente, no obstante). Lo detallaré paso a paso:
- 1. Instalar Excel en el servidor, y seguir los pasos de este tutorial para hacer que se puedan ejecutar procesos Excel en la máquina, y que se cierren correctamente.
- a. Microsoft Office Object Library (la versión que tengais instalada)
- b. Microsoft Escel Object Library (la misma versión que la anterior)
2. Una vez hecho esto, en nuestro proyecto .NET, agregar las siguientes librerías, en el menú de agregar Referencias, pestaña COM:
Hay que agregarlas en este orden, porque si no la segunda os dará error.
3. En el archivo web.config de vuestra aplicación ASP.NET, añadir la siguiente línea:
<identity impersonate="true"/>
4. En vuestra clase, importar éste namespace:
Imports System.Runtime.InteropServices.Marshal
5. Por último, el código que abre la aplicación Excel, coge la plantilla, y genera un archivo nuevo utilizando los datos del DataGrid y de la plantilla es el siguiente:
Está bastante comentado, por lo que no creo que os dé problemas. Si es así, dejadme un comentario e intentaré resolverlo. Suerte! ![]()
Fuente: El Guille




Octubre 10th, 2006 a las 22:31
Muchas gracias, esta muy claro como hacerlo, yo necesitaba crear un archivo excel personalizado. De esta forma es mas sencillo ya que se puede tener una plantilla con el diseño y estilo que se desee y despues simplemente pasarle los datos…
Me gustaria saber como le puedo dar desde asp .net formato a las celdas, (negrita, fuente,etc)
Octubre 12th, 2006 a las 07:18
Alejandro, la solución a lo que buscas puede ser la primera de las que he escrito. Exportar el datagrid renderizándolo a html y guardándolo como documento Excel. Sólo has de dar el formato de salida que desees a las celdas del DataGrid antes de hacer la exportación.
Si lo que necesitas es una plantilla, también puedes pre-formatear las celdas en dicha plantilla, y al hacer la exportación se te conservará el formato de tipo de letra, negrita, etc. que tú le hayas dado.
Lo que ya no sé cómo se hace (porque no lo he hecho nunca, la verdad) es a cambiar el formato “al vuelo” desde VB.NET. Pero estoy seguro que tiene que ser algún método del objeto “sheets” o “cells”.
Siento no poder decirte más. Si buscas más ayuda, la página de El Guille está muy bien.
¡Suerte!
Octubre 30th, 2006 a las 23:34
Hola
una consulta, el datatable lo tengo como variable global pero no se por que cuando lo invoco desde el boton que llama a los procedimientos sub de tu codigo para crear el archivo excel, el datatable llega vacio… como hago para que almacene los datos que obtuvo de la consulta? para asi poder crear el excel
gracias
Octubre 31st, 2006 a las 08:45
Buenas tocayo!
Supongo que te refieres al código de la Solución 2, a la función DupData, no? La verdad es que sin ver el código no puedo ayudarte. Puedes pegarlo aquí en un comentario?
Octubre 31st, 2006 a las 16:26
hola daniel, te comento que ya solucione el problema del datatable. ahora mi problema es queal momento de exportar si fuese posible, lanzar la ventana para guardar el archivo de excel en una ubicacion elegida por el cliente, pues tengo problemas para abrirlo directamente. Me aparece solo lectura, y al abrirlo como tal se desaparecen los datos importados.
Gracias
Enero 24th, 2008 a las 02:24
saludos
alguien me podria ayudar a dar formato de celda en una hoja de excel desde vb.net, desde centrar texto hasta poner formulas y bordes se los agradeceria mucho
Julio 11th, 2008 a las 22:38
Me parece muy el codigo que me has dado pero tengo el incoveniente que datos como 10/2400 que los paso a excel este me los reconoce como fecha y les agrega un 01 terminando al final el dato asi 01/10/2400 y convirtiendolo a Oct-00 ese dato no es el que quiero en excel. Por eso agardeceria bastante si alguien ma dice como puedo enviar los datos con ese mismo firmato sin modificarlo y con alineacion centrada
Agosto 15th, 2008 a las 19:20
Pues gracias este si que es un buen articulo aunque seria mejor en C# ya que es el lenguaje que va a revolucionar el Visual Basic.
Saludos y gracias nuevamente.
Septiembre 19th, 2008 a las 01:19
Encontré otra solución, el código original esta en C# en .Net 2003 (Braulio Diez y Reyes García,Generando hojas Excel con ASP.NET, http://www.dotnetmania.com). Lo pase a VB.Net 2005 y funciona de maravilla, este a diferencia de los anteriores crea un archivo de excel a partir de una hoja de calculo xml para establecer el estilo con el que se quiere que se retorne al usuario. El archivo es generado sin la necesidad de tener instalado Excel. El excel es solo necesario para generar la plantilla. Si desean un poco mas de información pueden revisar este PDF (www.dotnetmania.com/Articulos/016/Apoyo/dnm016.pdf).
Y si necesitan el código actualizado puede escribirme a lsantiago84@hotmail.com
Octubre 22nd, 2008 a las 22:47
Dandel, muy bueno tu aporte. Pero me sale todo muy bien en mi servidor, es decir en el IIS de mi propia maquina. Pero cuando lo cuelgo en el servidor ya sea de desarrollo o de produccion, se me cae con un mensaje como este:
Error al recuperar un generador de clases COM 80080005
Parece q es por permisos. Necesariamente debo poner impersonate=True.
Por lo poco q he leido es por un problema de permisos en la carpeta del servidor donde guardo el excel que genero, y al usarlo con mi cuenta personal todo ok, pero si es otra cuenta o la de ASPNET se cae.
Intenté darle permisos a ASPNET y nada, en mi PC funciona pues mi cuneta tienes todos los perisos. Pero en otras maquinas (impersonate = tru o false) no me funciona.
Se podría tranjar con Impersonate = False?..y como sería entonces la programación. Ahora la otea pregunta que quizas sea un poco tonta. en caso el servidor de produccion no tenga excel instalado hay alguna manera de utilizar esos com+.
Gracias de antemano