Blog


Exportar a Excel con Symfony2

EXPORTAR A EXCEL CON SYMFONY2

29 / 10 / 2015 Symfony

Hace ya algún tiempo publicábamos un artículo en el que veíamos una forma de generar documentos PDF con Symfony2. En éste vamos a ver cómo exportar a Excel en nuestros proyectos Symfony.

Para realizar la exportación de datos en formato Excel usaremos el bundle liuggio/ExcelBundle que integra la librería PHPExcel en Symfony2. Para instalarlo en nuestro proyecto Symfony, lo añadimos a composer.json:


$composer require liuggio/excelbundle

y registramos el bundle en AppKernel.php:


$bundles = array(
    // ...
    new Liuggio\ExcelBundle\LiuggioExcelBundle(),
);

Con esto, ya podemos empezar a generar documentos Excel en nuestro proyecto Symfony. Vamos a verlo con un ejemplo, crearemos una acción exportarExcelAction que podremos enlazar desde cualquier punto de nuestra aplicación Symfony para exportar el listado de elementos:


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

class EjemploController extends Controller
{
    // ...

    /**
     * @Route("/exportar/excel", name="ejemplo_exportar_excel")
     */
    public function exportarExcelAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        // recuperamos los elementos de base de datos que queremos exportar
        $query = $em->getRepository('AppBundle:Ejemplo')
            ->createQueryBuilder('e')
            ->getQuery();

        $result = $filterQuery->getResult();

        // solicitamos el servicio 'phpexcel' y creamos el objeto vacío...
        $phpExcelObject = $this->get('phpexcel')->createPHPExcelObject();

        // ...y le asignamos una serie de propiedades
        $phpExcelObject->getProperties()
            ->setCreator("Vabadus")
            ->setLastModifiedBy("Vabadus")
            ->setTitle("Ejemplo de exportación")
            ->setSubject("Ejemplo")
            ->setDescription("Listado de ejemplo.")
            ->setKeywords("vabadus exportar excel ejemplo");

        // establecemos como hoja activa la primera, y le asignamos un título
        $phpExcelObject->setActiveSheetIndex(0);
        $phpExcelObject->getActiveSheet()->setTitle('Ejemplo de exportación');
        
        // escribimos en distintas celdas del documento el título de los campos que vamos a exportar
        $phpExcelObject->setActiveSheetIndex(0)
            ->setCellValue('B2', 'Campo 1')
            ->setCellValue('C2', 'Campo 2')
            ->setCellValue('D2', 'Campo 3')
            ->setCellValue('E2', 'Campo 4');

        // fijamos un ancho a las distintas columnas
        $phpExcelObject->setActiveSheetIndex(0)
            ->getColumnDimension('B')
            ->setWidth(30);
        $phpExcelObject->setActiveSheetIndex(0)
            ->getColumnDimension('C')
            ->setWidth(25);
        $phpExcelObject->setActiveSheetIndex(0)
            ->getColumnDimension('D')
            ->setWidth(15);
        $phpExcelObject->setActiveSheetIndex(0)
            ->getColumnDimension('E')
            ->setWidth(20);

        // recorremos los registros obtenidos de la consulta a base de datos escribiéndolos en las celdas correspondientes
        $row = 3;
        foreach ($result as $item) {
            $phpExcelObject->setActiveSheetIndex(0)
                ->setCellValue('B'.$row, $item->getCampo1())
                ->setCellValue('C'.$row, $item->getCampo2())
                ->setCellValue('D'.$row, $item->getCampo3())
                ->setCellValue('E'.$row, $item->getCampo4());

            $row++;
        }

        // se crea el writer
        $writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel5');
        // se crea el response
        $response = $this->get('phpexcel')->createStreamedResponse($writer);
        // y por último se añaden las cabeceras
        $dispositionHeader = $response->headers->makeDisposition(
            ResponseHeaderBag::DISPOSITION_ATTACHMENT,
            'ejemplo.xls'
        );
        $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;
    }
}

Hemos comentado el código para entender mejor cada acción que se lleva a cabo. En el ejemplo, hay una pequeña muestra de opciones que tenemos disponibles gracias a la librería PHPExcel, pero lógicamente hay muchas más. Recomendamos echar un vistazo el repositorio oficial de PHPExcel donde pueden encontrarse muchos más ejemplos de uso.



ARTÍCULOS RELACIONADOS