Cómo crear un archivo de Excel con PHP en Symfony 4

Cómo crear un archivo de Excel con PHP en Symfony 4

La creación de archivos excel en el desarrollo de aplicaciones web es hoy en dia un deber como desarrollador y tu como desarrollador, tienes como deber estar pendiente de las nuevas tecnologias y herramientas en tu lenguaje de preferencia que dispones para crearlas. Desde el 2015, la famosa librería de PHPExcel publico su ultima versión 1.8.1, despues de esta todo mundo podía ver un mensaje que decía en el repositorio oficial que el proyecto no sería mantenido por la comunidad y no debería ser usado de ahora en adelante.

Sin embargo, no te preocupes, no es que las antiguas versiones no funcionen mas, incluso una nueva versión fue publicada incluso con un nuevo nombre, esta libería es PHPSpreadsheet, de los creadores del mismo paquete de PHPOffice. Esta librería esta escrita en puro PHP y su meta es el proveerte un set de clases que te permitan fácilmente leer y crear diferentes hojas de cálculo con diferentes formatos como Excel, LibreOffice etc. Esta librería ofrece soporte para:

Formato Lectura Escritura
Open Document Format/OASIS (.ods) ? ?
Office Open XML (.xlsx) Excel 2007 y posteriores ? ?
BIFF 8 (.xls) Excel 97 y posteriores ? ?
BIFF 5 (.xls) Excel 95 ?
SpreadsheetML (.xml) Excel 2003 ?
Gnumeric ?
HTML ? ?
SYLK ?
CSV ? ?
PDF (usando la librería, Dompdf o mPDF, cuya instalación es aparte ?

Como alguien que usa todo siempre en su ultima versión, no te enseñaremos como crear archivos de excel con la vieja librería sino con la librería que mencionamos que es mas reciente. En este articulo, te mostraremos como instalar la librería en tu proyecto basado en Symfony 4.

1. Instalar PHPSpreadsheet

La manera recomendada de instalar la librería sucesora de PHPExcel es con composer. Abre una terminal en el directorio raiz de tu proyecto de Symfony 4 y ejecuta el siguiente comando:

composer require phpoffice/phpspreadsheet

Esto añadirá el paquete de phpoffice/phpspreadsheet package como una dependencia en tu proyecto y a continuación la instalará.

Para más información sobre los métodos, más ejemplos que no tienen que ver en su totalidad con el framework de Symfony sino con la librería misma, por favor visita el repositorio oficial en Github aquí o la documentación oficial aquí.

2. Aprende a crear archivos de excel haciendo

Normalmente como desarrollador, aprenderás más rápido haciendo que leyendo, así que escribe y ejecuta algo de código ! Te mostraremos a continuación un par de ejemplos tradicionales que necesitaras seguido en la creación de estos archivos, estos casos son el de escritura de archivo en el disco (guardando el excel en un directorio local) o una respuesta transmitida (un archivo de disposición en línea):

A. Guardando archivo excel en un directorio local

Si deseas crear el archivo de excel en el disco del servidor, puedes usar el método tradicional de save de la librería que escribe el archivo directamente a un directorio. Simplemente provee el directorio absoluto en el que quieres guardar el archivo y su nombre (debes estar seguro de que tienes permisos para escribir en el directorio que deseas):

<?php

namespace App\Controller;

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

// Incluir namespaces requeridos de PhpSpreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class DefaultController extends Controller
{
    public function index()
    {
        $spreadsheet = new Spreadsheet();
        
        /* @var $sheet \PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet */
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setCellValue('A1', 'Hello World !');
        $sheet->setTitle("My First Worksheet");
        
        // Crear tu archivo de Office 2007 Excel (XLSX Formato)
        $writer = new Xlsx($spreadsheet);
        
        // En este caso deseamos escribir el archivo en el directorio public del proyecto
        $publicDirectory = $this->get('kernel')->getProjectDir() . '/public';
        // p. ej. /var/www/project/public/my_first_excel_symfony4.xlsx
        $excelFilepath =  $publicDirectory . '/my_first_excel_symfony4.xlsx';
        
        // Crear el archivo y guardarlo en el directorio
        $writer->save($excelFilepath);
        
        // Retorna un texto de respuesta diciendo que todo está bien
        return new Response("Archivo de excel generado satisfactoriamente");
    }
}

B. Generar un archivo de excel y transmitir en explorador (descarga)

Por defecto cuando trabajas con PHP, la lógica de respuesta varía segun el framework que usted o lo que escribas por ti mismo, es por eso que la librería para generar archivos de excel solo permite escribir a un directorio en particular. Sin embargo, esto no es util cuando en tu proyecto generas archivos constantemente para descargar porque tendrás que hacerte cargo de los archivos que se generan, eliminarlos luego etc.

Si sigues el proceso descrito para transmitir archivos excel en el explorador, la generación de estos se puede convertir en un verdadero dolor de cabeza, así que la manera más sencilla de hacer esto correctamente es el de escribir el archivo en un directorio temporal (el del sistema) con PHP, escribir el contenido de excel en este y luego generar la descarga de dicho archivo con un nombre personalizado (el archivo temporal será eliminado del sistema luego de un tiempo). Para retornar un archivo adjunto de excel, usaremos el helper de file del controlador base de Symfony. Esta clase incluye varios métodos que te ayudarán a cumplir muchas tareas comunes desde los controladores sin incluir multiples clases innecesariamente pues estas acceden directamente a ellas desde el contenedor de servicios. El método ayudante que necesitamos es el método file, que espera como primer argumento el directorio del archivo que vas a generar como descargar. El explorador forzará inmediatamente la descarga del archivo y mantendrá el nombre del archivo original:

<?php

namespace App\Controller;

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

// Incluir namespaces requeridos de PhpSpreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class DefaultController extends Controller
{
    public function index()
    {
        $spreadsheet = new Spreadsheet();
        
        /* @var $sheet \PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet */
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setCellValue('A1', 'Hello World !');
        $sheet->setTitle("My First Worksheet");
        
        // Crear tu archivo Office 2007 Excel (XLSX Formato)
        $writer = new Xlsx($spreadsheet);
        
        // Crear archivo temporal en el sistema
        $fileName = 'my_first_excel_symfony4.xlsx';
        $temp_file = tempnam(sys_get_temp_dir(), $fileName);
        
        // Guardar el archivo de excel en el directorio temporal del sistema
        $writer->save($temp_file);
        
        // Retornar excel como descarga
        return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
    }
}

Por favor nota que los ejemplos de excel son muy basicos, simplemente escribimos una celda y ya, sin embargo en este articulo solo nos enfocamos a su generación en el framework de Symfony 4 especificamente desde un controlador. Para más documentación sobre la librería PHPSpreadsheet no olvides visitar su sitio web.

Que te diviertas !

Esto podría ser de tu interes

Conviertete en un programador más sociable