Cómo construir un archivo de MS-EXCEL con PHP

Comparto un código desarrollado en PHP que es muy útil en aquellos escenarios donde los programadores deben construir reportes en archivos de EXCEL, la librería utilizada es PHPExcel que deben descargar y subir la librería como parte de su proyecto.

Este código suele ser muy provechoso cuando la cantidad de información que debes sacar de la base de datos es mucha, de manera que dejas la escritura del lado del servidor y luego por una petición o link realizas la descarga del archivo construido.

<?php
# Le decimos a nuestro script que no tenga límite de memoria.
ini_set("memory_limit",-1); 

// Habilitamos la directiva de errores, recordar que cuando esta nuestro código listo como buena
// práctica es comentar la siguiente instrucción.
error_reporting(E_ALL & ~E_WARNING);
# -------------------------------

/** PHPExcel */
// Incluimos la librería de PHPExcel
include 'PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
// Le decimos que vamos a trabajar con la versión 2007 o mayor.
// También reconoce archivos .xlsx
include 'PHPExcel/Writer/Excel2007.php';


// Creamos la instancia de la clase de PHPExcel
$objPHPExcel = new PHPExcel();

// Configuramos los valores de las propiedades del archivos
// Esta información se visualiza cuando le das clic derecho a su archivo en el tab de properties/propiedades de
// la venta de Windows.
$objPHPExcel->getProperties()->setCreator("NOMBRE DEL CREADOR O PROPIEDARIO");
$objPHPExcel->getProperties()->setLastModifiedBy("Sistema Web");
$objPHPExcel->getProperties()->setTitle("Reporte de Mensajes");
$objPHPExcel->getProperties()->setSubject("TITULO DEL ARRCHIVO de EXCEL");
$objPHPExcel->getProperties()->setDescription("Puedes colocar aqui una breve descripcion del contenido del documento");
 

$rsql= mysql_query("Escribe aqui la sentencia SQL") or die(mysql_error());	
$nrs = mysql_num_rows($rsql);

// Verificamos que nuestro SQL obtenga resultados
if  ($nrs > 0 ){				

	// Indicamos un nombre para nuestro archivo 
	$filename = "Mi_Reporte.xlsx";
	
	
	// Escribimos en la primera linea de nuestro archivo EXCEL lo titulos.
	$objPHPExcel->setActiveSheetIndex(0);
	$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'NOMBRE_CLIENTE');
	$objPHPExcel->getActiveSheet()->SetCellValue('B1', 'TELEFONO');
	$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'EMAIL');
	$objPHPExcel->getActiveSheet()->SetCellValue('D1', 'EDAD');	
	$objPHPExcel->getActiveSheet()->SetCellValue('E1', 'SALARIO');

	// Le decimos a nuestra primera fila que va a tener color desde la columna A1 hasta la E1.
	$objPHPExcel->getActiveSheet()->getStyle('A1:E1')->
														getFill()->
														setFillType(PHPExcel_Style_Fill::FILL_SOLID)->
														getStartColor()->
														setARGB('FFE8E5E5'); // Color de nuestra fila encabezado/titulos
		
	// Inicializamos la variable $i que es la segunda linea del Excel con el valor de 2, porque es 
	// a partir de esa linea de nuestro archivo de EXCEL que contiene el contenido de nuestra base de datos.
	$i = 2; 
	
	// empezamos a recorrer nuestro recordset.
	while ($rs = mysql_fetch_array($rsql)){	

		// Le decimos al Excel que inicie el llenado de cada fila por medio de la variable {$i}
		// que es nuestro contador del ciclo.
		$objPHPExcel->getActiveSheet()->SetCellValue("A{$i}", $rs['noombre_cliente']);
		$objPHPExcel->getActiveSheet()->SetCellValue("B{$i}", $rs['telefono']);
		$objPHPExcel->getActiveSheet()->SetCellValue("C{$i}", $rs['email']);
		$objPHPExcel->getActiveSheet()->SetCellValue("D{$i}", $rs['edad']);	
		$objPHPExcel->getActiveSheet()->SetCellValue("E{$i}", $rs['salario']);	
		$i++;		
		
    }// fin de while
		
	// Le colocamos el título a nuestra hoja electrónica.
	$objPHPExcel->getActiveSheet()->setTitle('Reporte Mensajes');		



	// Le decimos a nuestro objeto de $objWriter que escriba el contenido generado.
	$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
	
	// Le decimos que guarde el archivo en la ruta llamada "cache" en nuestro servidor.
	// Recuerde que el directorio/carpeta debe tener permisos de escritura por el usuario apache.
	$objWriter->save('cache/'.$filename);	
					
}// if  ($nrs > 0 ){
		
?>

Por lo general yo ejecuto el código anterior por medio de un llamado asincrónica con jquery, y cuando el resultado es satisfactorio devuelvo la respuesta en una estructura JSON, donde cierro mi ventana de «esperando», previa ventana que habilite cuando solicité el reporte, y luego habilito la descarga por medio de un link.

Ya esto último queda a creatividad del programador como lo desee implementar.

Buena Suerte!