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.

 

Si tienes alguna duda o aclaración por favor escribela en los comentarios.
Tags: , ,

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

Leave a Reply