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.