Buscar (Don't Edit)

viernes, 21 de junio de 2013

Hazlo fácil: Exportar datos a Excel con ExcelLibrary en ASP.NET

La funcionalidad de un sistema de poder exportar datos a distintos formatos es algo de lo mas cotidiano, y que viene por defecto en cualquier requerimiento de cliente. Quizás uno de los formatos mas solicitados sea en hojas de cálculo, principalmente en Excel. Y es que si bien existen infinidad de formas de realizar esto, nunca está de más echar mano de una librería que facilite ésta tarea. Por eso les traigo éste nuevo tutorial, que espero pueda convertirse en una serie de tutoriales con la misma mecánica, sobre cómo exportar datos a Excel en ASP.NET de manera fácil... realmente fácil.



Importando la librería de Excel
Lo primero que tenemos que hacer es descargarnos la librería de Excel desde el siguiente enlace: ExcelLibrary. Nos descargará un zip y solo tendremos que descomprimirlo para obtener el archivo .dll.

A continuación nos iremos a nuestro proyecto, y en el explorador de soluciones damos click derecho sobre la carpeta References y seleccionamos Agregar Referencia.

En la ventana que aparece nos vamos a la pestaña de Examinar y buscamos la ruta donde descomprimimos nuestra librería. 
La seleccionamos, damos Aceptar y ya tendremos la librería importada y lista para usar en nuestro proyecto.

Hidratando el objeto DataSet
Ahora si, al código. Lo primero que necesitamos es un conjunto de datos, para éste ejemplo usaré un DataSet, el cuál contendrá los datos a exportar. Aunque el objetivo de éste tutorial es mostrar la manera de exportar datos a Excel y no de cómo cargarle datos a un DataSet, de igual manera lo mostraremos para cubrir todo el proceso.

Existen muchas maneras de cargar datos dentro de un DataSet, aunque la mas obvia es a través de una base de datos, así que empecemos. Crearemos una clase llamada getDataSet que retornará un objeto DataSet, el cuál sera nuestro objeto hidratado con la información de la BD.
La clase básicamente lo que hace es crear una query que recoge todos los datos de la tabla Expediente, y utiliza un objeto SqlDataAdapter para llenar nuestro DataSet a retornar. No olviden atrapar la excepción y siempre finalizar cerrando la conexión si esta sigue abierta.
Lo siguiente es crear un método donde llenaremos un GridView a partir de un DataSet, que será el mismo objeto que obtengamos de getDataSet.
Ahora en nuestra página .aspx crearemos el GridView donde se mostrarán los datos.


Ahora crearemos un botón (yo le llame btnConsultar) y en su evento Click crearemos un objeto DataSet llamado myDataSet, el cual será hidratado por nuestro método getDataSet que creamos anteriormente, para posteriormente mostrarlo en el grid.
Ahora en nuestro grid ya debemos poder visualizar los datos que nos devolvió la consulta.

Ahora creamos otro botón que será quien desencadene el evento para exportar nuestros datos a Excel. Dentro de éste crearemos un nuevo objeto DataSet y lo hidrataremos de igual manera que cuando ejecutamos la consulta. Este objeto myDataSet lo enviamos al método exportarAExcel de nuestra clase ReporteServices que en seguida les explicaré como funciona.

Exportando a Excel
La clase ReporteServices, nos servirá para manejar todas las peticiones de reportes y exportación de datos, es decir cuando queramos agregar otros formatos para exportar lo haremos dentro de ésta clase. Dentro de ella colocaremos nuestro método para exportar a Excel, el cuál recibirá como parámetros una cadena que indique la ruta y nombre de nuestra hoja de cálculo (que se la enviamos desde el evento del botón como "C:\\reporte.xls") y el objeto DataSet a exportar.
Como pueden ver lo único que tenemos que hacer es llamar a la clase DataSetHelper y al método CreateWorkbook que recibe el path de la hoja de cálculo y el DataSet.

¡Y Listo! Al dar click en el botón de exportar tendremos nuestro archivo reporte.xls generado en el directorio que especificamos. Como ven para poder crear una hoja de cálculo en Excel con nuestra información de BD únicamente hicimos uso de una sola línea de código en nuestra clase ReporteServices.

NOTA: Recuerden que los nombres de las columnas devueltas por la consulta en BD deben mapearse correctamente con los DataField de las columnas del Grid.

Saludos y hasta la próxima. ;)

13 comentarios:

  1. MUY INTERESANTE LA SOLUCION, GRACIAS POR EL APORTE

    ResponderBorrar
  2. Hola disculpa pero no me funciona me envia que no existe el metodo DataSetHelper

    public class ReporteServices
    {
    public static void exportarAExcel(String pathArchivo, DataSet dataset)
    {
    ExcelLibrary.DataSetHelper.CreateWorkbook(pathArchivo, dataset);
    }
    }

    ResponderBorrar
  3. Que pasa cuando uso en vez de pathArchivo Stream, para abrir la ventana de dialogo y descargar el excel directamente, tengo este codigo pero no funciona

    DataSet ds = new DataSet();
    ds = llenarDataset;
    MemoryStream m = new MemoryStream();
    ExcelLibrary.DataSetHelper.CreateWorkbook(m, ds);
    m.WriteTo(Response.OutputStream);

    Pero en vez de abrir la ventana me saca simbolos.

    *ExcelLibrary.DataSetHelper.CreateWorkbook(Stream, dataset);

    ResponderBorrar
  4. HOLA QUE TAL, ESTA INTERESANTE TU ARTICULO, PERO MI DUDA ES SI EN MI GRID TENGO MAS DE 255 CARACTERES EN UNA CELDA COMO LE HAGO PARA QUE ME MUESTRE MAS CARACTERES.

    ResponderBorrar
    Respuestas
    1. Perdon en mi grid tengo solo 255 como le hago para poder cargar mas de esta cantidad?

      Borrar
  5. Hola muy buen aporte,me sirvió de mucho solo un pequeño problema, bueno me dice que invalid cell value, alguna sugerencia

    ResponderBorrar
    Respuestas
    1. Que tipo de valor es el que quieres mostrar en la celda?

      Borrar
    2. Buena tarde.
      me arroja igual invalid cell value porfavor ayuda¡¡¡

      Borrar
    3. Tengo un reporte de facturacion con treinta columnas: varchar , int y date que puedo hacer??
      El error se debe a excel o a programaciòn..

      Borrar
    4. Fijate si te llegan valores nulos

      Borrar
    5. gracias daniel. pero no porque la consulta la saco por sql server 2008 y la paso a excel y la envio a los clientes el problemas es que debo crear un aplicativo y crear alertas para que estos reportes sean enviados a determinadas horas ,, siempre arroja valores estoy seguro , aunque cuando una factura no corresponde a un pedido ese campo si lo trae nulo , 'pero en realidad no creo que se deba a eso , probé una consulta simple como los productos y tampoco.. estoy trabajando en esta posible solucion y creo que si me va a dar..


      'agregar referencia - COM - microsoft offise 14.0 object library

      Dim oExcel As Object
      Dim oBook As Object
      Dim oSheet As Object

      oExcel = CreateObject("Excel.Application") 'Iniciar un nuevo libro en Excel
      oBook = oExcel.Workbooks.Add 'Agregar datos a las celdas de la primera hoja en el libro nuevo
      oSheet = oBook.Worksheets(1) ' Agregamos Los datos que queremos agregar
      oSheet.Range("A1:AC1").Font.Bold = True

      oSheet.Range("A1").Value = "COD_EMPR"
      oSheet.Range("B1").Value = "PUNTO DE VENTA"

      'en este espacio recogere la consulta en un dataset y lo mostrare y si me funciona lo publicare
      oExcel.Visible = True
      oExcel.UserControl = True
      oBook.SaveAs(Environ("UserProfile") & "\desktop\Prueba.xlsx")

      Borrar
  6. HOLA NECESITO AGREGAR REGISTROS EN VARIAS HOJAS ALGO ASI:
    HojaExcel = LibroExcel.Worksheets.Add(After:=LibroExcel.Worksheets(LibroExcel.Worksheets.Count))

    Dim objCelda As Excel.Range

    nRow = 1
    objCelda = HojaExcel.Cells(nRow, 1)
    objCelda.Value = "CODIGO"
    objCelda.EntireColumn.NumberFormat = "@"
    objCelda = HojaExcel.Cells(nRow, 2)
    objCelda.Value = "NOMBRES"
    objCelda = HojaExcel.Cells(nRow, 3)
    objCelda.Value = "APELLIDOS"
    objCelda = HojaExcel.Cells(nRow, 4)
    objCelda.Value = "DIRECCION"

    ResponderBorrar