Cómo exportar datos con laravel excel 3

Cómo exportar datos con Laravel Excel 3

Tenia mucha curiosidad de probar las novedades de este paquete y debo de decir que a sido toda una sorpresa!, Así que en esta entrega vamos a ver Cómo exportar datos con laravel excel 3.

De entrada debo de decir que, ahora es mucho mas sencillo, exportar archivos se vuelve una actividad entretenida.

Lo bueno

Adiós a los closure, ahora se usan donde realmente se requieren

estamos agradecidos

Así que tu controlador ya no tiene que lucir así.

Ahora es mas simple

Otro cambio importante es que ya no requieres usar Export injection

Así que ya no es complejo hacer uso de la inyección de dependencias ya que se puede usar de forma natural

Mucho mejor,  ¿no lo crees?

Lo malo

Y no tan malo, pero siempre es un aprieto, no existe compatibilidad con la versión anterior, así que vas a tener que hacer trabajo adicional para migrar tus reportes a esta nueva versión.

Puedes ver los detalles en la guía de actualización.

Bien creo que es hora de entrar en materia y ver un ejemplo, creando un reporte (UserExport) usando el modelo User.

Vamos a comenzar con lo básico y vamos a ir avanzando poco a poco y al final de este articulo vas a poder crear tus reportes con esta nueva versión y ademas todo esto con una simple llamada como esta:

Si tienes curiosidad de como lograr esto, sigue leyendo

Instalación de Laravel Excel 3

Como es usual esta parte la vamos a realizar mediante composer

$ composer require maatwebsite/excel

Esto sirve para Laravel 5.5 y 5.6.

Migraciones

Como lo mencione antes vas a utilizar la bien conocida clase User con la siguiente migración

Si observas solo agregue un campo adicional: is_anabled y debido a esto vamos a agregar los cambios necesarios a nuestro factory en database/factories/UserFactory.php.

Con esto ya esta listo todo lo que requerimos para utilizar laravel excel.

Facade Excel

Esta es una de las partes que sigue sin cambios o mas bien casi sin cambios ya que ahora en lugar de utilizar un Closure se utilizan objetos que pueden variar de acuerdo a una serie de responsabilidades que nos proporciona el paquete.

Dicho esto, que te parece si creamos una ruta para el modelo User en routes/web.php

Ya que tenemos la ruta vamos a crear el controlador UserExportController.

Debido a que solo requiero una acción para este ejemplo he decido usar el método mágico __invoker.

Como puedes apreciar ahora Excel::download espera una clase UserExport que todavía no tenemos, pero que veremos como hacerla en breve. El segundo argumento es el nombre del archivo que descargaremos cuando solicitemos la ruta /users/export.

Muy bien, para exportar nuestros datos a Excel, tenemos que crear una clase que implemente el contrato FromCollection o FromQuery.

Veamos como podemos usar estas interfaces.

Utilizando FromCollection

Este contrato va ser útil si queremos exportar mediante el uso de collections de Eloquent como por ejemplo cuando ejecutamos User::all() pero en este ejemplo, vamos a ver como queda obtener solamente 10 elementos de la base de datos.

Y eso es todo!, si, así de simple. ahora ejecuta la ruta /users/export en tu proyecto vas a descargar el archivo users.xlsx.

Pero que pasa si queremos hacer cosas mas complejas como por ejemplo obtener solo los usuarios habilitados  (is_enabled = 1) esto se resuelve de forma muy sencilla usando el contrato FromQuery.

Utilizando FromQuery

Para utilizar FromQuery solamente tenemos que implementar la interfaz y crear la consulta mediante Eloquent usando el query builder sin utilizar get, veamos un ejemplo solicitando 10 usuario que estén habilitados.

Si ejecutas el ejemplo nuevamente descargaras un archivo users.xlsx.

Es muy probable que te estés preguntando cual de los dos contratos debes de usar

y mi recomendación es que uses FromCollection cuando tu reporte no sea muy grande en cantidad de datos.

Y el uso de FromQuery lo debes de usar si tu reporte va a exportar una cantidad considerable de datos ya que Laravel Excel se encarga de usar chunk.

Como punto adicional también te puede servir para ir construyendo tu reporte de forma dinámica, ya que Laravel Excel se encarga de llamar al método get() por ti.

Esto podemos verlo en el siguiente ejemplo

Si ejecutas nuevamente tu ruta obtendrás 10 usuario creados en el año en curso y que ademas estan habilitados en tu aplicación.

Pero sin necesidad de hacer un cambio adicional yo puedo pedir los usuarios creados en el 2016:

Uso del Trait Exportable

Este Trait tiene una característica interesante, nos permite hacer que cualquier clase funcione como el Facade Excel si regresamos a nuestro ejemplo solo tenemos que agregar su uso en la clase UserExport:

Muy bien ahora solo tenemos que instancia la clase UserExport en lugar de usar el Facade Excel

Ahora ejecuta nuevamente el ejemplo y observa como puedes exportar nuevamente los usuario activos del presente año.

Y si lo pensaste, sí también es posible hacer que el propio modelo se auto exporte, con algunos cambios en el modelo User puede tener algo como:

En tu controlador, genial, ¿no lo crees?

Utilizando Responsable

De forma adicional también podemos hacer que nuestro reporte de usuario sea devuelto como una respuesta HTTP gracias al contrato Responsable que viene incluido en Lravel 5.5 y 5.6.

Para usar esta característica solo tenemos que agregar la interfaz Responsable a nuestro ejemplo y recordar que esta funcionalidad debe de ir acompañada del trait Exportable y tienes que agregar la propiedad private $fileName para funcionar.

Y en nuestro controlador solo tenemos que crear y regresar la instancia de UserExport en el return como sigue.

Y listo obtenemos el mismo resultado!

Por cierto, espero que vayas notando como se va simplificando el código en cada ejemplo.

Formateando el contenido

Sí llegaste a este punto y probaste los ejemplos de seguro obtuviste un archivo como este:

user export

Así que abras notado, que el reporte no tiene encabezados, el formato es muy malo, ademas la hoja activa no tiene un nombre y es posible que hayas notado que los campos que tienen un valor de 0 aparecen como campos vacíos en el reporte.

Ademas no se si ya lo pensaste pero no he abordado como se pueden regresar solo los campos que requieres en el reporte.

Así que en el siguiente ejemplo vamos a solucionar lo siguiente:

  • Exportar columnas seleccionadas
  • Darle formato a los campos
  • Crear los encabezados
  • Nombrar la pestaña de la hoja de calculo
  • Que los campos con valor 0 sean exportado con ese mismo valor

Para llevar acabo esto seguiremos usando los contratos que nos proporciona Laravel Excel

Exportar columnas seleccionadas

Para hacer esto solo requerimos implementar la interfaz WithMapping en la clase UserExport.

Si ejecutas el ejemplo con este cambio solo exportaras los campos que especifique en el método map.

Crear los encabezados

Ya que tenemos lo campos que queremos exportar vamos a darles un encabezado apropiado para saber a que se refieren los datos que vamos a exportar,

Esto lo resolvemos de forma sencilla utilizando la interfaz WithHeadings.

Como puedes observar agregar los encabezados es igual de sencillo que obtener los campos seleccionados.

Ahora ¿cómo le damos formato a los campos?

Darle formato a los campos

El formato de las columnas como debes de haber deducido es igual mediante contrato, en este caso usaremos la interfaz WithColumnFormatting.

como puedes observar regresamos un arreglo que debe de tener como llaves las columnas de Excel mas el formato que requerimos para cada columna, es importante recordar que debes de exportar NumberFormat ( use PhpOffice\PhpSpreadsheet\Style\NumberFormat; )

Nombrar la pestaña de la hoja de calculo

solo necesitamos implementar el contrato WithTitle.

 

Que los campos con valor 0 sean exportado con ese mismo valor

Para finalizar, para hacer que tus campos se exporten con valor de cero, solo debes de agregar el contrato WithStrictNullComparison

No requieres implementar ningún método, así que agregare como va nuestra clase UserExport hasta este momento

Si ejecutas el ejemplo notaras que a mejorado el formato, pero… vas a seguir notando que las celdas no se ajustan al contenido sobre todo en la columna de nombre y E-mail y esto es muy molesto!.

Pero no te preocupes lo podemos resolver de forma sencilla usando eventos.

Extendiendo Laravel Excel

Antes de que te alarmes me gustaría decirte que mediante eventos es muy sencillo agregar cambios adicionales como hacer que las columnas se auto ajusten y como debes de estar pensado tenemos que implementar otra interfaz!!!

Veamos como hacer que se auto ajusten las columnas y hacer que el contenido de cada celda quede centrado todo usando eventos.

El método registerEvents regresa un arreglo que esta formado por el evento que se va a escuchar y un closure que es el listener para ese evento.

El evento AfterSheet se ejecuta después de haber llenado la hoja de calculo así que esto me permite cambiar por ejemplo el estilo y hacer columnas auto ajustables.

También podemos afectar el comportamiento antes de que se inicie el proceso de exportación

o antes de que se comience a escribir o descargar el archivo.

Por ejemplo si yo quiero agregar el creador del reporte, el titulo del archivo entre otros, lo podemos hacer usando el evento BeforeExport.

Si ejecutas nuevamente este ejemplo veras como todo a quedado ok!

Para finalizar

Hemos visto que Laravel Excel lo hace todo de forma mas sencilla que antes y nos permite una flexibilidad que era mas compleja de realizar con las versiones anteriores.

he dejado fuera de este articulo como implementar queues, como exportar a partir de una vista y como hacer pruebas.

Posiblemente lo veamos en otro articulo profundizando también en los eventos.

Por otro lado te invito a leer la documentación para complementar la lectura del articulo y ademas muy importante que en tus tiempos libres dediques tiempo para husmear en el código fuente del paquete.

Si estas usando alguna versión anterior a la 5.5 te recomiendo que veas nuestro articulo. para exportar en versiones anteriores de laravel excel.

Y finalmente espero que este articulo te ayude y si tienes dudas u otra idea deja tu comentario me gustaría saber tu opinión.

Y no olvides compartir!

 

Comparte este artículo

Entra en la discusión y deja tu comentario

Veces