

Que tal seguidores del blog, ahora toca el turno de mostrar otra librería muy popular y muy utilizada junto con Laravel, Laravel Excel. De acuerdo a la doc oficial: Laravel excel es una librería para importación y exportación elocuente de documentos Excel y CSV para Laravel 4.* y 5.* con el poder de la librería PHPExcel de PHPOffice.
¿Que tareas puedo lograr con esta librería?
Por supuesto que las 2 funciones básicas que nos ofrece esta librería son la Importación y Exportación de datos en Excel y/o CSV. Puedes subir registros a tu base de datos desde un documento de Excel, por ejemplo agregar/actualizar productos o cualquier otro tipo de recursos que tu sistema este utilizado. Así mismo puedes exportar un reporte de ventas del mes o los movimientos realizados, entre otros.
Los ejemplos que abarcaremos en esta publicación son los siguientes:
-
Importar un documento Excel de productos a nuestra BD
-
Exportar un documento Excel con todos nuestros usuarios registrados
-
Exportar una vista Blade a un documento Excel
-
Importar/Exportar documentos CSV
Habiendo dado una pequeña introducción y suponiendo que ya has creado un nuevo proyecto Laravel empecemos con la instalación de la librería a utilizar, esta se llama: maatwebsite/excel, en la documentación oficial puedes encontrar estos ejercicios y aún más información sobre como utilizar esta librería, he resumido en este post las acciones más comunes y de forma sencilla para que puedas empezar cuánto antes a utilizarla.
Paso #1: Instalación de la librería mediante composer con el siguiente comando
composer require "maatwebsite/excel:~2.1.0"
1.1: Si estas utilizando una versión de Laravel igual o superior a la 5.5 automáticamente se reconoce el proveedor. En caso contrario debes agregar las siguientes lineas:
Agregar las siguientes líneas al archivo config/app.php:
Maatwebsite\Excel\ExcelServiceProvider::class,
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
1.2: Una vez realizado esto también podemos publicar el archivo de configuración de la librería ejecutando el siguiente comando (Este paso es opcional):
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
dentro de este archivo de configuración recién creado en config/excel.php procederemos a cambiar los metadatos o propiedades de los documentos que generemos al exportar. Yo he definido los siguientes atributos:
'properties' => [ 'creator' => 'Hiram Guerrero', 'lastModifiedBy' => 'Hiram Guerrero', 'title' => 'Pruebas', 'description' => 'Exportacion/Importacion de Excel y CSV', 'subject' => 'Exportacion/Importacion de Excel y CSV', 'keywords' => 'maatwebsite, excel, export', 'category' => 'Excel', 'manager' => 'Eichgi', 'company' => 'Eichgi', ],
Al realizar esta acción revisamos los detalles de nuestros archivos deberían verse de la siguiente forma:
#Exportar un documento Excel con todos nuestros usuarios registrados
Paso #2: Una vez que hemos importado la librería y definidos los metadatos (opcional) podemos empezar a realizar lo importante -> Importación y Exportación. Para ello comenzaremos con lo más simple de realizar; exportaremos nuestra tabla de “users” proveída por Laravel a un documento excel, y lo llamaremos users.xlsx:
2.1: Ejecutar el siguiente comando:
php artisan tinker
2.2 Una vez dentro de la terminal tinker debemos ejecutar el siguiente comando factory para poblar nuestra tabla users con 100 registro y tener información que exportar:
factory('App\User', 100)->create();
2.3 Una vez que nuestra tabla users tenga los registros ejecutaremos el siguiente código para realizar la exportación a Excel y descargar el archivo generado:
public function exportExcel() { /** Fuente de Datos Eloquent */ $data = User::all(); /** Creamos nuestro archivo Excel */ Excel::create('usuarios', function ($excel) use ($data) { /** Creamos una hoja */ $excel->sheet('Hoja Uno', function ($sheet) use ($data) { /** * Insertamos los datos en la hoja con el método with/fromArray * Parametros: ( * Datos, * Valores del encabezado de la columna, * Celda de Inicio, * Comparación estricta de los valores del encabezado * Impresión de los encabezados * )*/ $sheet->with($data, null, 'A1', false, false); }); /** Descargamos nuestro archivo pasandole la extensión deseada (xls, xlsx) */ })->download('xlsx'); }
2.4 Así de fácil y sencillo es realizar una exportación de una tabla en MySQL a un documento Excel.
#Importar un documento Excel de productos a nuestra BD
Paso #3: Importar un documento Excel a una tabla en MySQL
3.1: El documento Excel a importar tiene el siguiente modelo
3.2: Código para importar datos y almacenarlos en la tabla productos en MySQL
public function importExcel() { /** El método load permite cargar el archivo definido como primer parámetro */ Excel::load('productos.xlsx', function ($reader) { /** * $reader->get() nos permite obtener todas las filas de nuestro archivo */ foreach ($reader->get() as $key => $row) { $producto = [ 'articulo' => $row['articulo'], 'cantidad' => $row['cantidad'], 'precio_unitario' => $row['precio_unitario'], 'fecha_registro' => $row['fecha_registro'], 'status' => $row['status'], ]; /** Una vez obtenido los datos de la fila procedemos a registrarlos */ if (!empty($producto)) { DB::table('productos')->insert($producto); } } echo 'Los productos han sido importados exitosamente'; }); }
Cabe mencionar que el archivo de donde importaré los datos se encuentra localizado en la raíz del proyecto y este se llama productos.xlsx.
#Exportar una vista Blade a un documento Excel
Paso #4: Supongamos que ahora nuestros datos a exportar son un archivo blade con un titulo y una tabla de datos. A continuación muestro el código de nuestras 2 vistas:
productos.blade.php
<h1>Lista de productos</h1> <table> <thead> <tr> <th>Artículo</th> <th>Cantidad</th> <th>Precio Unitario</th> <th>Fecha Registro</th> <th>Status</th> </tr> </thead> <tbody> <tr> <td>Laptop Dell 15"</td> <td>10</td> <td>$9999.99 MXN</td> <td>01/01/2018</td> <td>Activo</td> </tr> <tr> <td>Monitor HP</td> <td>0</td> <td>$1599.99 MXN</td> <td>31/12/2018</td> <td>Inactivo</td> </tr> <tr> <td>Silla Oficina Ejecutiva</td> <td>3</td> <td>$1999.99 MXN</td> <td>01/08/2017</td> <td>Activo</td> </tr> <tr> <td>Laptop Dell 12"</td> <td>10</td> <td>$8999.99 MXN</td> <td>01/01/2018</td> <td>Activo</td> </tr> <tr> <td>Torre DVD Sony</td> <td>25</td> <td>$125.00 MXN</td> <td>31/12/2017</td> <td>Activo</td> </tr> <tr> <td>Laptop Dell 15"</td> <td>10</td> <td>$9999.99 MXN</td> <td>01/01/2018</td> <td>Activo</td> </tr> <tr> <td>Monitor HP</td> <td>0</td> <td>$1599.99 MXN</td> <td>31/12/2018</td> <td>Inactivo</td> </tr> <tr> <td>Silla Oficina Ejecutiva</td> <td>3</td> <td>$1999.99 MXN</td> <td>01/08/2017</td> <td>Activo</td> </tr> <tr> <td>Laptop Dell 12"</td> <td>10</td> <td>$8999.99 MXN</td> <td>01/01/2018</td> <td>Activo</td> </tr> <tr> <td>Torre DVD Sony</td> <td>25</td> <td>$125.00 MXN</td> <td>31/12/2017</td> <td>Activo</td> </tr> </tbody> </table>
usuarios.blade.php
<h1>Lista de Usuarios</h1> <table> <thead> <tr> <th>Nombre</th> <th>Edad</th> <th>Correo</th> <th>Fecha Registro</th> <th>Status</th> </tr> </thead> <tbody> <tr> <td>John Doe</td> <td>30</td> <td>john@example.com</td> <td>01-01-2018</td> <td>Activo</td> </tr> <tr> <td>Jane Doe</td> <td>33</td> <td>jane@example.com</td> <td>31-12-2017</td> <td>Activo</td> </tr> <tr> <td>John Doe</td> <td>30</td> <td>john@example.com</td> <td>01-01-2018</td> <td>Activo</td> </tr> <tr> <td>Jane Doe</td> <td>33</td> <td>jane@example.com</td> <td>31-12-2017</td> <td>Activo</td> </tr> <tr> <td>John Doe</td> <td>30</td> <td>john@example.com</td> <td>01-01-2018</td> <td>Activo</td> </tr> <tr> <td>Jane Doe</td> <td>33</td> <td>jane@example.com</td> <td>31-12-2017</td> <td>Activo</td> </tr> <tr> <td>John Doe</td> <td>30</td> <td>john@example.com</td> <td>01-01-2018</td> <td>Activo</td> </tr> <tr> <td>Jane Doe</td> <td>33</td> <td>jane@example.com</td> <td>31-12-2017</td> <td>Activo</td> </tr> <tr> <td>John Doe</td> <td>30</td> <td>john@example.com</td> <td>01-01-2018</td> <td>Activo</td> </tr> <tr> <td>Jane Doe</td> <td>33</td> <td>jane@example.com</td> <td>31-12-2017</td> <td>Activo</td> </tr> </tbody> </table>
4.1: Para poder exportar nuestras 2 vistas en blade a un archivo excel que contenga una hoja por vista utilizamos el siguiente código:
public function bladeToExcel() { /** Creamos un archivo llamado fromBlade.xlsx */ Excel::create('fromBlade', function ($excel) { /** La hoja se llamará Usuarios */ $excel->sheet('Usuarios', function ($sheet) { /** El método loadView nos carga la vista blade a utilizar */ $sheet->loadView('usuarios'); }); /** Agregará una segunda hoja y se llamará Productos */ $excel->sheet('Productos', function ($sheet) { $sheet->loadView('productos'); }); })->download('xlsx'); }
Así de sencillo podemos exportar vistas blade a documento Excel
#Importar/Exportar documentos CSV
Para poder trabajar documentos CSV es exactamente el mismo procedimiento como si fueran documentos .XLSX o .XLS Lo único que debemos hacer es especificar en el método load() y donwnload() que tipo de documento es, por ejemplo:
/** Carga del documento*/ Excel::load('productos.csv', function ($reader) { /** Descarga del documento */ ->download('csv');
Asegúrate de que tu documento CSV no contenga acentos o caracteres especiales porque estos no podrán ser importados o exportados de forma correcta, a diferencia de los documentos Excel donde este error no se presenta.
Paso #5: Los 3 endpoints que he utilizado en mi archivo /routes/web.php
Route::get('/exportExcel', 'ExcelController@exportExcel'); Route::get('/importExcel', 'ExcelController@importExcel'); Route::get('/bladeToExcel', 'ExcelController@bladeToExcel');
Con estos 3 sencillos ejercicios hemos visto como importar desde un documento csv/excel y exportar hacia un documento csv/excel. Si quieres importar un archivo Excel enviado desde un formulario vía POST he agregado el ejemplo al repositorio donde he subido el proyecto, incluyendo los ejercicios vistos anteriormente, repositorio: laravel-excel-demo.
1 comment. Leave new
Gracias por la explicacion, tengo un problema con mis exportaciones, verifico y no se exportan con los detalles de propiedad que mencionas, en algun momento lo hizo pero ahora no lo hace, y por ello excel me dice que el formato del archivo es incorrecto