Aprende a crear un archivo excel en Symfony 3.

Cómo crear un archivo de excel con PHP en Symfony 3

Si eres nuevo en el desarrollo de PHP, la librería de PHPExcel puede sonar totalmente desconocida para ti. Este proyecto provee un set de clases de PHP que te permiten leer y escribir en diferentes formatos de archivo de hoja de cálculo como Excel (BIFF) .xls, Excel 2007 (OfficeOpenXML) .xlsx, CSV, Libre/OpenOffice Calc .ods, Gnumeric, PDF y HTML. Este proyecto ha sido trabajando siguiente los estándares de Microsoft's OpenXML y PHP.

Hay actualmente 2 maneras de generar un archivo excel en Symfony 3, puedes usar el ExcelBundle para usar directamente la librería de PHPOffice de la misma manera en la que trabajarías con cualquier proyecto en PHP (recomendado para archivos excel complejos pues es fácil de entender y manipular con el código original) ó puedes generar los archivos excel usando una sintáxis de Twig usando el TwigExcelBundle (recomendado solo para archivos sencillos CSV,XLS, y XLSX que no requieren una estructura complicada).

A. Desde un controlador

En Symfony, es una buena práctica usar Bundles en vez de usar require_once para incluir librerías. El creador de este bundle (no de la librería PHPExcel) es liuggio y el código fuente puede ser adquirido en el repositorio oficial en Github.

Nota

Es importante leer la documentación oficial de la librería PHPExcel primero, luego el proceso será realmente intuitivo con Symfony 3.

Para instalar el bundle agrega en tu composer.json la dependencia manualmente y luego ejecuta composer install:

"liuggio/excelbundle": "dev-master",

Si usas composer directamente desde la consola ejecuta en su lugar:

composer require liuggio/excelbundle

Cuando todas las dependencias hayan sido descargadas, simplemente agrega el bundle al kernel (AppKernel.php) así:

$bundles = array(
     // agrega excel bundle
     new Liuggio\ExcelBundle\LiuggioExcelBundle(),
);

Creación de archivo de excel en streaming creado con php

En este ejemplo usaremos el write de Excel 2007, recuerda que en la librería original se usa new PHPExcel_Writer_Excel2007($objPHPExcel); , pero con este bundle, usaremos la función createWriter provista por el bundle:

// Importane incluir las siguientes clases
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

class DefaultController extends Controller
{

    public function indexAction($name)
    {
       // Solicita el servicio de excel
       $phpExcelObject = $this->get('phpexcel')->createPHPExcelObject();

       $phpExcelObject->getProperties()->setCreator("liuggio")
           ->setLastModifiedBy("Giulio De Donato")
           ->setTitle("Office 2005 XLSX Test Document")
           ->setSubject("Office 2005 XLSX Test Document")
           ->setDescription("Test document for Office 2005 XLSX, generado usando clases de PHP")
           ->setKeywords("office 2005 openxml php")
           ->setCategory("Archivo de ejemplo");
       $phpExcelObject->setActiveSheetIndex(0)
           ->setCellValue('A1', 'Hola')
           ->setCellValue('B2', 'Mundo!');
       $phpExcelObject->getActiveSheet()->setTitle('Simple');
       // Define el indice de página al número 1, para abrir esa página al abrir el archivo
       $phpExcelObject->setActiveSheetIndex(0);

        // Crea el writer
        $writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel2007');
        // Envia la respuesta del controlador
        $response = $this->get('phpexcel')->createStreamedResponse($writer);
        // Agrega los headers requeridos
        $dispositionHeader = $response->headers->makeDisposition(
            ResponseHeaderBag::DISPOSITION_ATTACHMENT,
            'PhpExcelFileSample.xlsx'
        );

        $response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8');
        $response->headers->set('Pragma', 'public');
        $response->headers->set('Cache-Control', 'maxage=1');
        $response->headers->set('Content-Disposition', $dispositionHeader);

        return $response;        
    }
}

Guardando un archivo excel generado en el servidor

// Important to include 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

class DefaultController extends Controller
{

    public function indexAction($name)
    {
        // ask the service for a excel object
       $phpExcelObject = $this->get('phpexcel')->createPHPExcelObject();

       $phpExcelObject->getProperties()->setCreator("liuggio")
           ->setLastModifiedBy("Giulio De Donato")
           ->setTitle("Office 2005 XLSX Test Document")
           ->setSubject("Office 2005 XLSX Test Document")
           ->setDescription("Test document for Office 2005 XLSX, generated using PHP classes.")
           ->setKeywords("office 2005 openxml php")
           ->setCategory("Test result file");
       $phpExcelObject->setActiveSheetIndex(0)
           ->setCellValue('A1', 'Hello')
           ->setCellValue('B2', 'world!');
       $phpExcelObject->getActiveSheet()->setTitle('Simple');
       // Set active sheet index to the first sheet, so Excel opens this as the first sheet
       $phpExcelObject->setActiveSheetIndex(0);

        // create the writer
        $writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel2007');
        // The save method is documented in the official PHPExcel library
        $writer->save('/path/to/save/filename.xlsx');


        // Return a Symfony response (a view or something or this will thrown error !!!)
        return "A symfony response";        
    }
}

B. Usando Twig

TwigExcelBundle es un bundle para Symfony que provee una integración de PHPExcel en Twig sumamente sencilla. Para instalar este bundle, ejecuta el siguiente comando en composer:

composer require mewesk/twig-excel-bundle

Ó en caso de que quieras hacerlo manualmente modifica el archivo composer.json y ejecuta finalmente composer install:

{
    "require": {
        "mewesk/twig-excel-bundle": "^2.1"
    },
}

Nota 

Si quieres probar el bundle de Twig, no necesitas tener instalado el bundle de LuggioExcel pues el bundle instalará automaticamente la librería de PHPOffice como dependencia.

Luego de la instalación del Bundle con composer, registra el bundle en el kernel /app/AppKernel.php:

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            // .... //  
            new MewesK\TwigExcelBundle\MewesKTwigExcelBundle(),
            // .... //
        ];
 
        // .... //
    }

    // .... //
}

Luego de la instalación limpia la caché de tu proyecto usando el comando de symfony php bin/console cache:clear y comienza a usar el bundle.

Retornar archivo excel en controlador

De acuerdo a la manera en la que configures las rutas de Symfony, tendrás que seguir los siguientes pasos:

  1. Crea la siguiente vista de twig con un nombre, el tipo de extensión especifico de excel que necesites y el sufijo de .twig (e.g excel.xlsx.twig).
  2. Retorna la vista como respuesta de controlador.

YAML

Si usas YAML para configurar las rutas, comienza agregando la ruta que apunta al controlador especifico:

# routing.yml

mybundle_route:
    path:     /{_filename}.{_format}
    defaults: { _controller: mainBundle:Default:index, _format: xlsx }

## Para acceder a esta ruta:
## www.mydomain.com/example-filename.xlsx

Luego crea el controlador que retorna la vista TwigExcel:

<?php

namespace mainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function indexAction(Request $request)
    {
        return $this->render('mainBundle:Default:excel.xlsx.twig', [
            'data' => ['La', 'Le', 'Lu']
        ]);
    }
}

La vista de Twig excel.xlsx.twig va contener la siguiente estructura (localizado en /src/mainBundle/default/excel.xlsx.twig):

{% xlsdocument %}
    {% xlssheet 'Worksheet' %}
        {% xlsrow %}
            {% xlscell { style: { font: { size: '18' } } } %}Values{% endxlscell %}
        {% endxlsrow %}
        {% for value in data %}
            {% xlsrow %}
                {% xlscell %}{{ value }}{% endxlscell %}
            {% endxlsrow %}
        {% endfor %}
    {% endxlssheet %}
{% endxlsdocument %}

En el controlador, envias un array con algo de información y este será renderizado en filas en el archivo twig. Nota que el formato puede ser cambiado en la manera que necesites. Ahora si accedes la ruta declarada (e.g www.domain.com/custom-filename.xlsx) obtendrás la descarga de un archivo.

Anotación

Si usas un formato de anotación, crea una ruta en el controlador que retorna una vista de Twig excel:

<?php

namespace mainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller
{
    /**
     * @Route("/{_filename}.{_format}", defaults={"_format"="xls","_filename"="example"}, requirements={"_format"="csv|xls|xlsx"})
     * @Template("mainBundle:Default:excel.xlsx.twig")
     */
    public function indexAction($_filename)
    {
        return ['data' => ['La', 'Le', 'Lu']];
    }
}

Esta vista será la misma que la dada en la configuración de YAML. Ahora si quieres acceder a la ruta, de la misma manera obtendrás una descarga de archivo excel.

Nota

El nombre de la ruta será el nombre del archvio de excel generado, por lo tanto verifica que proves como nombre de ruta un nombre válido para un archivo de excel para prevenir la generación de archivos corruptos.

El bundle TwigExcel provee una documentación detallada de todos los tags disponibles y funciones aquí.

Notas


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores