Como generar un archivo Excel en Cakephp 3
|Para generar un archivo Excel desde Cakephp 3 es necesario que primero descarguemos la librería PHPExcel.
El contenido al descomprimir el archivo hay que colocarlo en la carpeta /vendor de nuestro proyecto.
Creamos una función ó acción en nuestro controlador para ejecutar la creación del archivo Excel. El controlador en este ejemplo se llama PrincipalController.php
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace App\Controller; class PrincipalController extends AppController{ ... public function excel(){ $this->layout='ajax'; $this->response->type('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); } } |
Como notarán utilizo el layout de ajax porque no debe haber ningún tipo de impresión en pantalla, con eso me refiero a echo, print_r() o salidas html. Además agregamos un response de tipo spreadsheet que será transformado en un header que le indicará al navegador que lo que estamos generando es un archivo de Excel.
Ahora creamos nuestra vista que se llamará excel.ctp en la ruta /src/Template/Principal con el siguiente contenido.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
<?php //ajuntar la libreria excel require_once ROOT.DS.'vendor'.DS.'phpexcel'.DS.'PHPExcel.php'; $objPHPExcel = new PHPExcel(); //nueva instancia $objPHPExcel->getProperties()->setCreator("Kiuvox"); //autor $objPHPExcel->getProperties()->setTitle("Prueba para generar excel"); //titulo //inicio estilos $titulo = new PHPExcel_Style(); //nuevo estilo $titulo->applyFromArray( array('alignment' => array( //alineacion 'wrap' => false, 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER ), 'font' => array( //fuente 'bold' => true, 'size' => 20 ) )); $subtitulo = new PHPExcel_Style(); //nuevo estilo $subtitulo->applyFromArray( array('fill' => array( //relleno de color 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'color' => array('argb' => 'FFCCFFCC') ), 'borders' => array( //bordes 'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN) ) )); $bordes = new PHPExcel_Style(); //nuevo estilo $bordes->applyFromArray( array('borders' => array( 'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN) ) )); //fin estilos $objPHPExcel->createSheet(0); //crear hoja $objPHPExcel->setActiveSheetIndex(0); //seleccionar hora $objPHPExcel->getActiveSheet()->setTitle("Listado"); //establecer titulo de hoja //orientacion hoja $objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); //tipo papel $objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER); //establecer impresion a pagina completa $objPHPExcel->getActiveSheet()->getPageSetup()->setFitToPage(true); $objPHPExcel->getActiveSheet()->getPageSetup()->setFitToWidth(1); $objPHPExcel->getActiveSheet()->getPageSetup()->setFitToHeight(0); //fin: establecer impresion a pagina completa //establecer margenes $margin = 0.5 / 2.54; // 0.5 centimetros $marginBottom = 1.2 / 2.54; //1.2 centimetros $objPHPExcel->getActiveSheet()->getPageMargins()->setTop($margin); $objPHPExcel->getActiveSheet()->getPageMargins()->setBottom($marginBottom); $objPHPExcel->getActiveSheet()->getPageMargins()->setLeft($margin); $objPHPExcel->getActiveSheet()->getPageMargins()->setRight($margin); //fin: establecer margenes //incluir una imagen $objDrawing = new PHPExcel_Worksheet_Drawing(); $objDrawing->setPath('img/phpexcel_logo.jpg'); //ruta $objDrawing->setHeight(75); //altura $objDrawing->setCoordinates('A1'); $objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); //incluir la imagen //fin: incluir una imagen //establecer titulos de impresion en cada hoja $objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 6); $fila=6; $objPHPExcel->getActiveSheet()->SetCellValue("A$fila", "CELDAS UNIDAS"); $objPHPExcel->getActiveSheet()->mergeCells("A$fila:G$fila"); //unir celdas $objPHPExcel->getActiveSheet()->setSharedStyle($titulo, "A$fila:G$fila"); //establecer estilo //titulos de columnas $fila+=1; $objPHPExcel->getActiveSheet()->SetCellValue("A$fila", 'NOMBRE'); $objPHPExcel->getActiveSheet()->SetCellValue("B$fila", 'APELLIDO'); $objPHPExcel->getActiveSheet()->setSharedStyle($subtitulo, "A$fila:B$fila"); //establecer estilo $objPHPExcel->getActiveSheet()->getStyle("A$fila:B$fila")->getFont()->setBold(true); //negrita //rellenar con contenido for ($i = 0; $i < 10; $i++) { $fila+=1; $objPHPExcel->getActiveSheet()->SetCellValue("A$fila", 'Blog'); $objPHPExcel->getActiveSheet()->SetCellValue("B$fila", 'Kiuvox'); //Establecer estilo $objPHPExcel->getActiveSheet()->setSharedStyle($bordes, "A$fila:B$fila"); } //insertar formula $fila+=2; $objPHPExcel->getActiveSheet()->SetCellValue("A$fila", 'SUMA'); $objPHPExcel->getActiveSheet()->SetCellValue("B$fila", '=1+2'); //recorrer las columnas foreach (range('A', 'B') as $columnID) { //autodimensionar las columnas $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true); } //establecer pie de impresion en cada hoja $objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddFooter('&R&F página &P / &N'); //****************Guardar como excel 2007******************************* $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); //Escribir archivo //// nombre del archivo header('Content-Disposition: attachment; filename="kiuvox.xlsx"'); //********************************************************************** //forzar a descarga por el navegador $objWriter->save('php://output'); |
Al ejecutar la url: http://misitio/principal/excel verémos el cuadro de diálogo del Excel generado.
El resultado del código será así:
Con la librería hay muchos ejemplos en la carpeta Examples que pueden consultar para hacer reportes más elaborados.
Saludos.
Muy bueno, gracias me sirvio mucho
Gracias por compartir tus conocimientos. Te hago una consulta: como se tendria que hacer con una vista en un idex.ctp que ya tiene datos? Soy nuevo en cakephp.
Gracias!
Creo que no podrías, para crear el excel necesitas indicar un header diciendole al navegador que es un archivo excel el que esta generando, esa instrucción se la damos en el controlador utilizando $this->response->type().
Dandole esa instrucción impediría que la vista «dibuje» el contenido de index.ctp.
Yo lo que siempre hago es agregar un boton o enlace que diga «descargar esta info en excel» por ejemplo y mandarlo a la función que genera el excel propiamente y utilizo el mismo query y condiciones que hay en index.ctp