Índice de contenido
- Por qué usar Laravel Excel para generar y exportar archivos Excel en PHP
- Preparar el Proyecto
- Instalar Laravel Excel en un proyecto Laravel
- Publicar la configuración (opcional)
- Exportar datos a Excel en Laravel usando Eloquent
- Crear la clase de exportación
- Usar FromCollection para exportar registros
- Definir qué datos se exportan (evita exportar todo sin filtrar)
- Descargar el archivo Excel desde un controlador en Laravel
- Configurar la ruta para la descarga
- Exportar solo un subconjunto de datos con where en Eloquent
- ¿Cuándo usar FromCollection vs FromQuery?
- Buenas prácticas al exportar archivos Excel con Laravel
- Preguntas frecuentes sobre Laravel Excel
- Conclusión: Laravel Excel como solución práctica para reportes y exportaciones
Los archivos Excel siguen siendo uno de los formatos más utilizados para compartir y analizar datos. En proyectos Laravel, es muy común que en algún punto necesitemos exportar listados, generar reportes periódicos o simplemente sacar información de la aplicación para trabajarla fuera del sistema. En mi caso, esto suele aparecer cuando hay que entregar reportes a clientes, hacer análisis rápidos o permitir que otras personas manipulen los datos sin necesidad de acceder a la aplicación.
Para resolver todo esto de forma limpia y eficiente, Laravel Excel es, sin duda, la mejor opción dentro del ecosistema Laravel.
En este artículo te muestro cómo usar Laravel Excel para exportar datos a Excel paso a paso, sin rodeos, centrándonos en el caso real más habitual: exportar datos desde Eloquent a un archivo Excel descargable directamente desde el navegador.
Anteriormente vimos cómo utilizar las Colas o Queues y los Trabajos o Jobs para posponer Tareas en Laravel
Por qué usar Laravel Excel para generar y exportar archivos Excel en PHP
Laravel Excel es un paquete desarrollado por Maatwebsite que nos permite trabajar con archivos Excel (XLSX, CSV, entre otros) directamente desde Laravel. Su mayor ventaja es que se integra perfectamente con Eloquent, lo que hace que exportar datos sea casi tan sencillo como escribir una consulta.
En proyectos reales, exportar datos no suele ser un "extra", sino una necesidad recurrente: listados de usuarios, registros, posts, ventas, reportes mensuales, etc. Y aquí es donde Laravel Excel brilla, porque evita soluciones manuales, código repetido o conversiones innecesarias. En lugar de construir tu propio generador de Excel desde cero, tienes una capa de abstracción limpia que se apoya directamente en las colecciones y modelos de Laravel.
Preparar el Proyecto
Para este tutorial puedes usar cualquier instalación de Laravel que ya tengas, por ejemplo la que tratamos anteriormente en la que dimos los primeros pasos con Laravel.
Así que simplemente crea un proyecto nuevo o usa uno en el que estés haciendo pruebas, y empecemos.
Instalar Laravel Excel en un proyecto Laravel
Antes de empezar, asegúrate de tener:
- PHP compatible con tu versión de Laravel
Composerinstalado- Un proyecto Laravel funcionando
Para instalar el paquete simplemente ejecuta el siguiente comando de Composer en la raíz de tu proyecto Laravel:
$ composer require maatwebsite/excelEn versiones modernas de Laravel, el paquete se registra automáticamente gracias al auto-discovery, así que no tienes que tocar nada más para empezar a usarlo.
Publicar la configuración (opcional)
Normalmente no es necesario modificar la configuración por defecto, pero si quieres tener acceso a ella y ajustar parámetros como el driver de escritura o la memoria máxima, puedes publicar el archivo de configuración con:
$ php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=configEsto generará un archivo config/excel.php en tu proyecto. Para este tutorial no necesitamos cambiar nada en él, pero es útil conocer su existencia para proyectos más avanzados.
Exportar datos a Excel en Laravel usando Eloquent
Este es el núcleo del artículo y el caso más frecuente en proyectos reales.
Crear la clase de exportación
Una vez instalado el paquete, lo siguiente es generar una clase de exportación: un archivo especial de la librería en el que indicamos la consulta Eloquent cuyos datos queremos exportar. Para generarla usamos el siguiente comando de artisan:
$ php artisan make:export PostsExport --model=PostAl pasar la opción --model, indicamos qué modelo vamos a exportar. Esto genera una estructura base ya preparada en app/Exports/PostsExport.php.
La opción
--modelpermite especificar el modelo que queremos hacer exportable. A partir de él, el comando autogenera los métodos necesarios para que la clase sepa de dónde obtener los datos y en qué formato devolverlos.
Para que tengas contexto, nuestro modelo Post luce así:
<?php
namespace App;
use App\Category;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = ['title', 'url_clean', 'content', 'category_id', 'posted'];
public function category()
{
return $this->belongsTo(Category::class);
}
}Y el modelo Category:
<?php
namespace App;
use App\Post;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $fillable = ['title', 'url_clean'];
public function post()
{
return $this->hasMany(Post::class);
}
}Usar FromCollection para exportar registros
La clase generada en app/Exports/ implementa la interfaz FromCollection, que nos permite definir la colección de datos a exportar mediante una consulta Eloquent. Por ejemplo, si queremos obtener todos los registros, simplemente usamos el método all():
namespace App\Exports;
use App\Post;
use Maatwebsite\Excel\Concerns\FromCollection;
class PostsExport implements FromCollection
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return Post::all();
}
}Como puedes ver, simplemente usamos el modelo Post y le decimos qué datos queremos exportar. En el método collection() puedes colocar cualquier consulta Eloquent: un all() para todos los registros, o cualquier filtro con where() para limitar el conjunto de datos.
Definir qué datos se exportan (evita exportar todo sin filtrar)
Aunque Post::all() funciona perfectamente, en la práctica casi nunca queremos exportar absolutamente todos los registros. Lo habitual es filtrar por estado, rango de fechas o cualquier otra condición de negocio.
Por ejemplo, para exportar solo los posts publicados:
public function collection()
{
return Post::where('posted', true)->get();
}Esto es muy habitual cuando generas reportes reales y no simples volcados de información. Siempre es mejor exportar solo lo que el usuario necesita ver.
Descargar el archivo Excel desde un controlador en Laravel
Una vez creada la clase de exportación, solo queda invocarla desde un controlador. Para eso importamos el Facade Excel y la clase PostsExport, y creamos un método que devuelva la descarga:
use App\Exports\PostsExport;
use Maatwebsite\Excel\Facades\Excel;
public function export()
{
return Excel::download(new PostsExport, 'posts.xlsx');
}El método Excel::download() recibe dos parámetros: la clase de exportación como fuente de datos, y el nombre del archivo que se descargará. Devuelve directamente la respuesta HTTP con el archivo adjunto, por lo que el navegador lo descargará de forma automática.
Configurar la ruta para la descarga
Como en cualquier flujo de Laravel, necesitamos definir una ruta que apunte a este método:
Route::get('/dashboard/excel/post-export', 'Dashboard\PostController@export')
->name('post.export');Al acceder a esa URL, el archivo Excel se descarga automáticamente. En más de un proyecto, este tipo de ruta termina integrada en botones de "Exportar" dentro del panel de administración, lo que le da un valor real y visible al usuario final.
Exportar solo un subconjunto de datos con where en Eloquent
Uno de los grandes puntos fuertes de Laravel Excel es que puedes aprovechar toda la potencia de Eloquent sin ninguna restricción. Puedes encadenar condiciones de la misma manera que lo harías en cualquier consulta:
return Post::where('category_id', 3)->where('posted', true)->get();Verás que al acceder a la ruta configurada, se descarga de manera automática un archivo Excel como el siguiente:

De esta manera, podemos generar fácilmente un archivo Excel en Laravel. Como puedes ver, puedes aplicar cualquier tipo de condición en la clase FromCollection para no trabajar con todo el pool de datos.
¿Cuándo usar FromCollection vs FromQuery?
Laravel Excel ofrece varias interfaces según el volumen y la naturaleza de los datos:
FromCollection: ideal para volúmenes pequeños o medianos. Carga todos los registros en memoria antes de generar el archivo.FromQuery: mejor opción si la tabla es grande y no quieres cargar todo en memoria. Procesa los datos por chunks, lo que reduce considerablemente el consumo de RAM.
En proyectos con muchos registros, suelo optar por FromQuery para evitar problemas de rendimiento, aunque para listados simples FromCollection sigue siendo más que suficiente.
En cuanto a formatos de archivo, Laravel Excel soporta los más comunes:
XLSX(Excel moderno)CSVTSVODS
Cambiar el formato es tan simple como cambiar la extensión en el nombre del archivo:
return Excel::download(new PostsExport, 'posts.csv');XLSX y CSV cubren el 90% de los casos reales.
Buenas prácticas al exportar archivos Excel con Laravel
Después de usar Laravel Excel en varios proyectos, hay algunas recomendaciones que siempre aplico:
- No exportes columnas innecesarias:
- Cuantos menos datos, mejor rendimiento y mejor experiencia para quien recibe el archivo.
- Filtra siempre que puedas:
- Exportar todo el contenido de una tabla suele ser innecesario y poco útil para el usuario final.
- Piensa en quién va a usar el archivo:
- El Excel no es para la base de datos, es para personas. Usa nombres de columna claros y en el idioma del usuario.
- Cuidado con tablas grandes:
- Si hay muchos registros, usa
FromQueryen lugar deFromCollectionpara evitar picos de consumo de memoria.
- Si hay muchos registros, usa
Estas pequeñas decisiones marcan la diferencia entre un export "que funciona" y uno realmente usable en producción.
Preguntas frecuentes sobre Laravel Excel
- ¿Qué es Laravel Excel?
- Es un paquete open source para Laravel, mantenido por Maatwebsite, que permite importar y exportar archivos
Excel,CSVy otros formatos usando Eloquent como fuente de datos.
- Es un paquete open source para Laravel, mantenido por Maatwebsite, que permite importar y exportar archivos
- ¿Laravel Excel es gratis?
- ¿Puedo exportar datos filtrados?
- Sí, puedes usar cualquier consulta Eloquent dentro del método
collection(): filtros conwhere(), relaciones conwith(), ordenaciones conorderBy(), etc.
- Sí, puedes usar cualquier consulta Eloquent dentro del método
- ¿Funciona con modelos Eloquent?
- Sí, de hecho es una de sus mayores ventajas. La integración con Eloquent es nativa y muy fluida.
- ¿Cómo exportar a CSV en lugar de Excel con Laravel?
- Simplemente cambia la extensión del archivo en
Excel::download():Excel::download(new PostsExport, 'posts.csv'). Laravel Excel detectará el formato automáticamente por la extensión.
- Simplemente cambia la extensión del archivo en
Conclusión: Laravel Excel como solución práctica para reportes y exportaciones
Laravel Excel es una herramienta extremadamente práctica para el día a día. En lugar de reinventar la rueda, te permite exportar datos desde Eloquent a Excel de forma limpia, rápida y mantenible, con muy pocas líneas de código.
En mi caso, se ha convertido en una solución recurrente para reportes, listados y entregables, sobre todo cuando necesitas sacar información fuera de la aplicación sin complicaciones. La combinación de make:export, FromCollection y Excel::download() cubre la gran mayoría de casos reales sin necesidad de configuración extra.
Si trabajas con Laravel y en algún momento necesitas generar o descargar archivos Excel, este paquete es el que deberías estar usando. Sin rodeos.
Aprende ahora a depurar tus aplicaciones en Laravel.