Laravel :: Importar y Exportar Excel

This post was published originally on hoclabs.com/2018/02/20/laravel-importar-y-e.. for my old blog.

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.

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:

excel-1.png

Exportar un documento Excel con todos nuestros usuarios registrados

####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 鈥渦sers鈥 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');
    }

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

3. El documento Excel a importar tiene el siguiente modelo

excel-2.png

3.1: 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

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.

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.

No Comments Yet