sábado, 24 de marzo de 2012

Generar un Excel en PHP con PHPExcel

Hace poco necesité crear un archivo Excel a partir de los datos de una tabla en MySQL, busqué algunas opciones como modificar la cabecera directamente y hacerle "creer" al navegador que el archivo php es un .xlsx con:
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=reporte.xls");
Pero este método no es el adecuado por que por más que cumple la función el navegador, al abrir el archivo en excel, este me genéra un warning debido a que de igual forma excel lo reconoce como un archivo .html y es poco profesional presentar así un trabajo a algún cliente.

Dado el problema anterior, me decidí a buscar una libreria PHP para esta tarea y es así como encontré PHPExcel. Una potente librería escrita en PHP que no solo permite generar archivo .xlsx sino también .xls, .ods, .xml, CSV y PDF.

Dejemonos de charla y veamos como utilizar PHPExcel.

1.- DESCARGAR PHPExcel

Lo primero que debemos hacer es descargarnos la última versión de esta librería en la página de descargas de PHPExcel y descomprimir el contenido en alguna carpeta de nuestro proyecto PHP.

2.- MODO DE USO

Todas las librerías necesarias se encuentran en la carpeta Classes y debemos llamarlas con require_once(). Y podemos crear un archivo .php, por ejemplo un archivo excel.php:
require_once("Classes/PHPExcel.php");
require_once("Classes/PHPExcel/Writer/Excel2007.php");
Luego creamos un OBJETO de la clase PHPExcel():
$objPHPExcel = new PHPExcel();
Por último trabajamos con varios metodos de PHPExcel para generar un Excel:
//algunos datos sobre autoría
$objPHPExcel->getProperties()->setCreator("autor");
$objPHPExcel->getProperties()->setLastModifiedBy("autor");
$objPHPExcel->getProperties()->setTitle("titulo del Excel");
$objPHPExcel->getProperties()->setSubject("Asunto");
$objPHPExcel->getProperties()->setDescription("Descripcion");

//Trabajamos con la hoja activa principal
$objPHPExcel->setActiveSheetIndex(0);

//iteramos para los resultados
foreach($filas as $row){
    $objPHPExcel->getActiveSheet()->SetCellValue("B".$row["id_cli"], $row["rut_cli"]);
    $objPHPExcel->getActiveSheet()->SetCellValue("C".$row["id_cli"], $row["nombre_cli"]);
    $objPHPExcel->getActiveSheet()->setCellValue("D".$row["id_cli"], $row["correo_cli"]);
    $objPHPExcel->getActiveSheet()->setCellValue("E".$row["id_cli"], $row["telefono_cli"]);
    $objPHPExcel->getActiveSheet()->setCellValue("F".$row["id_cli"], $row["pais_cli"]);
}

//Titulo del libro y seguridad 
$objPHPExcel->getActiveSheet()->setTitle('Reporte');
$objPHPExcel->getSecurity()->setLockWindows(true);
$objPHPExcel->getSecurity()->setLockStructure(true);


// Se modifican los encabezados del HTTP para indicar que se envia un archivo de Excel.
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="reporteClientes.xlsx"');
header('Cache-Control: max-age=0');

//Creamos el Archivo .xlsx
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
Con esto podemos crear un enlace al archivo excel.php para generar un reporte en excel:
<a href="excel.php">Exportar a Excel</a>
Como ves, no es muy complicado crear archivos .xlsx. La documentación de esta gran librería es muy amplia y se puede jugar con el diseño del archivo, las formulas, etc..

También puedes obtener el código fuente: AQUÍ

0 comentarios:

Publicar un comentario

¿ Tú opinión es importante, expresala aquí ?