Como crear un archivo Excel desde php
|La generación de reportes es algo vital en todo sistema, muchas veces los usuarios prefieren recibir sus reportes en formados PDF o Excel por la facilidad de uso y amplia aceptación de esos formatos mencionados.
Esta vez les voy a dar un ejemplo de como crear un reporte en formato Excel (.xlsx) con lo básico de un archivo de estos como lo puede ser establecer tipo de fuentes, incluir imágenes, bordes, unir celdas, etc.
Vamos a utilizar la librería PHPExcel que realmente me ha ayudado mucho en mis aplicaciones. Al descargar la librería veras una carpeta que se llama Classes que es el corazón de lo que necesitamos, lo demás es documentación que podes revisar por tu cuenta y ejemplos que te pueden ayudar a resolver dudas.
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 133 134 135 136 137 138 139 140 141 142 143 144 145 |
<?php //ajuntar la libreria excel include "Classes/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('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 2003********************************* $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); //Escribir archivo // Establecer formado de Excel 2003 header("Content-Type: application/vnd.ms-excel"); // nombre del archivo header('Content-Disposition: attachment; filename="kiuvox.xls"'); //********************************************************************** //****************Guardar como excel 2007******************************* //$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); //Escribir archivo // //// Establecer formado de Excel 2007 //header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // //// nombre del archivo //header('Content-Disposition: attachment; filename="kiuvox.xlsx"'); //********************************************************************** //forzar a descarga por el navegador $objWriter->save('php://output'); |
Resultado:
Relacionado:
Como generar un archivo Excel en Cakephp 3
una pregunta, si yo quisiera implementarlo en cakephp y quiero usarlo en una version de office 2013 como tendria que separarlo?
Por falta de tiempo no he podido probar integrar la librería con cakephp3, aúnque en mi trabajo lo he hecho con cakephp2.
Te dejo una guía para hacerlo para cakephp2 y espero que puedas partir de ahí porque no creo poder lograr escribir una muy pronto.
http://ingenieroweb.com.co/como-integrar-phpexcel-en-cakephp-2x
Saludos.
intente integrarlo con ese codigo pero a la hora que lo quiero poner en marcha en cakephp 2.6 hace el proceso pero a la hora de que abro el excel me marca un error y no abre el archivo como tal, y tengo duda de como integrarlo o mejor dicho en que partes especificamente integrarlo sin que me marque dicho error
saludos
Por experiencia sé que cuando te da error al abrir el excel, es muy probable que exista algún tipo de impresión de datos durante el proceso, el cual no debe existir. Por impresión de datos me refiero a hacer algún tipo de «echo» ó «print_r()» ó html, tene en cuenta también que si en algun lado estas tratando de utilizar una variable que no existe o no tiene el contenido adecuado php lanzará un error en pantalla que también es tomado como impresión en pantalla.
Según el código del enlace que te puse, te recomiendo que comentes desde los header para abajo, ejecutes el script y verifiques que ninguna de las situaciones anteriores te este pasando.
pero este codigo que me adjunto funciona para el office 2013?
Si, el formato del script, que es 2007, es compatible abrirlo con excel 2013
me surgio la duda acerca de lo que me comento en la parte del metodo de impresion de datos, al menos cuando uso la bake para crear mis aplicaciones web la mayor parte de las veces usa el metodo echo, pero entonces mis dudas son
– ¿si no debe usarse el metodo echo para este tipo de impresion entonces que metodo utilizaria para que funcionara el ejemplo?
-¿y en que parte defino los campos de la tabla que voy a exportar,? ¿es en la parte que dice $objPHPExcel->setActiveSheetIndex(0)
->setCellValue(‘A’.$i++, $post[‘Post’][‘title’]);?
saludos
En el ejemplo de ingenieroweb.com la variable $posts que esta en el foreach es asumiendo los datos que enviarías del controlador a la vista. Cuando ya tengas los datos que vienen de tu base de datos sustituirías eso para que se asignen los valores a las celdas en el excel como necesites.
Hablando específicamente de la vista donde estas creando el excel, ahí no debe haber ningún echo.
Para probar deberías sutituir todo el foreach por algo simple como esto:
Eso te debería crear el excel con la primera celda con texto.
tengo una celda con 16 digitos pero al momento de exportarlo los ultipos mos me los redondea a cero hay alguna forma de que la me respete los 16 digitos?
saludos.
Lo primero que se me ocurre preguntar si es si el mismo excel no estará ocultando los digitos solamente, es decir, puede que ahi esten escritos pero el formato de excel los oculte. Podrias buscar las botones de aumentar y disminuuir decimales para verificar primero eso.
Hola, le pido una ayuda. Tengo instalado el Excel del MSO 2003 y cuando voy a abrir el archivo me da que no se puede abrir porque esta dañado.Lo repara y dice que los daños son irrecuperables, pero lo abre igual.
Tengo por ahora un código muy simple
setActiveSheetIndex(0)
->setCellValue(‘A1′,’COMPANIA’)
->setCellValue(‘B1′,’FECHA’)
->setCellValue(‘C1′,’PUNTO_DE_VENTA’)
->setCellValue(‘D1′,’NUMERO_FACTURA’)
->setCellValue(‘E1′,’RAZON_SOCIAL’)
->setCellValue(‘F1′,’CUIT’)
->setCellValue(‘G1′,’TIPO_COMPROBANTE’)
->setCellValue(‘H1′,’LETRA’)
->setCellValue(‘I1′,’ORDEN_PUBLICIDAD’)
->setCellValue(‘J1′,’IMPORTE_NETO_21’)
->setCellValue(‘K1′,’IVA_21’)
->setCellValue(‘L1′,’IMPORTE_NETO_105’)
->setCellValue(‘M1′,’IVA_105’)
->setCellValue(‘N1′,’IMPORTE_NETO_25’)
->setCellValue(‘O1′,’IVA_25’)
->setCellValue(‘P1′,’IMPORTE_EXE’)
->setCellValue(‘Q1′,’IVA_PERCEPCION’)
->setCellValue(‘R1′,’IIBB_CAPITAL’)
->setCellValue(‘S1′,’IIBB_BSAS’)
->setCellValue(‘T1′,’IMPORTE_TOTAL’)
->setCellValue(‘U1′,’CARTEL’)
->setCellValue(‘V1′,’DIF’)
->setCellValue(‘W1′,’OBSERVACIONES’)
->setCellValue(‘X1′,’MAIL’);
// Renombrar Hoja
$objPHPExcel->getActiveSheet()->setTitle(‘Habas’);
$objPHPExcel->setActiveSheetIndex(0);
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
$objWriter->save(‘/var/web/facturaE/facturas_a_pagar.xls’);
exit;
}
?>
<?php
echo ' GENERA‘;
?>
¿ que puede ser ?
No se si ese sea tu código completo, no lo parece porque hace falta $objPHPExcel-> antes de setActiveSheetIndex(0). He probado esto con tu código y me funciona bien para que tu tambien lo pruebes.
estoy usando esta herramienta pero yo en mi php genero un par de filtros
es decir imagina que tu tabla es de empleados y la muestras en php … en la misma filtras por un solo departamento …como exporto solo esa selección