En la actualidad existen muchas posibilidades de poder realizar un reporte en distintos formatos(Excel, PDF, Word). Hoy tocaremos los reportes en Excel.
Asimismo, se han presentado en el mundo de desarrollo distintas maneras de crear los reportes. Una de esas es la siguiente:
<?php
define(db_host, "xxxxx");
define(db_user, "xxxxxx");
define(db_pass, "xxxxxx");
define(db_link, mysql_connect(db_host,db_user,db_pass));
define(db_name, "registro");
mysql_select_db(db_name);
$qry =mysql_query("SELECT * from descargas");
$campos = mysql_num_fields($qry);
$i=0;
ob_start();
echo "<center><table border="1" align="center">";
echo "<tr bgcolor="#336666">
<td><font color="#ffffff"><strong>ID</strong></font></td>
<td><font color="#ffffff"><strong>NOMBRE</strong></font></td>
<TD><font color="#ffffff"><strong>DESCRIPCION</strong></font></TD>
<td><font color="#ffffff"><strong>RUTA</strong></font></td>
<td><font color="#ffffff"><strong>TIPO</strong></font></td>
<td><font color="#ffffff"><strong>TAMAÑO</strong></font></td>
<td><font color="#ffffff"><strong>CATEGORIA</strong></font></td>
</tr>";
while($row=mysql_fetch_array($qry))
{
echo "<tr>";
for($j=0; $j<$campos; $j++) {
echo "<td>".$row[$j]."</td>";
}
echo "</tr>";
}
echo "</table>";
$qry2 =mysql_query("SELECT * from noticias");
$campos2 = mysql_num_fields($qry2);
$i2=0;
//ob_start();
echo "< center > < table border='1' align='center' >";
echo "< tr bgcolor='#33666' >
< td > < font color='#ffffff' > < strong > ID < /strong > < /font > < /td >
< td > < font color='#ffffff' > < strong > TITULAR </strong > < /font > </td >
< td > < font color='#ffffff' > < strong > RESUMEN </strong > < /font > </td >
< td > < font color='#ffffff' > < strong > NOTICIA </strong > < /font > < /td >
< td > < font color='#ffffff' > < strong > IMAGEN </strong > < /font > </td >
< td > < font color='#ffffff' > < strong > FECHA </strong > < /font > < /td >
< /tr >";
while($row2=mysql_fetch_array($qry2))
{
echo "<tr>";
for($j2=0; $j2<$campos; $j2++) {
echo "<td>".$row2[$j2]."</td>";
}
echo "</tr>";
}
echo "</table>";
$reporte = ob_get_clean();
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=consulta.xls");
header("Pragma: no-cache");
header("Expires: 0");
echo $reporte;
?>
En efecto, esto se puede usar pero en mi caso prefiero usar la libreria PHPExcel(la cual se descarga free desde su
pagina oficial).
Esta libreria nos facilita el manejo de los archivos Excel:
- ◘ Setear meta data (autor, título, descripción, ...).
- ◘ Crear una hoja de cálculo de la representación en memoria.
- ◘ Añadir pestañas a la hoja de calculo.
- ◘ Agregar valores y formulas a las celdas (individual o grupal).
- ◘ Combinar celdas, protegerlas.
- ◘ Darle diseño, tamaño y tipo de letra,
- ◘ Validación, seguridad de las hojas de calculo, libros.
- ◘ Entre otras más(disponibles en la pagina oficial.
DESCARGA DIRECTA
Ahora utilizaremos la libreria:
Crearemos una Base de datos para las pruebas:
CREATE DATABASE prueba;
Ahora implementaremos una tabla:
CREATE TABLE IF NOT EXISTS Cliente (
idCliente INT NOT NULL AUTO_INCREMENT,
Nom_Cliente VARCHAR(25) NOT NULL,
Dni_Cliente VARCHAR(45) NOT NULL,
Apellido_Paterno VARCHAR(45) NOT NULL,
Apellido_materno VARCHAR(45) NOT NULL,
Fecha_Nacimiento DATE NOT NULL,
Sexo CHAR(1) NOT NULL,
Direccion VARCHAR(90) NOT NULL,
Telf VARCHAR(10) NOT NULL,
email VARCHAR(45) NOT NULL,
PRIMARY KEY (idCliente))
A continuación el archivo html(index.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Reporte con PHPExcel</title>
</head>
<body>
<div>
<header>
<h1>REPORTE con PHPexcel</h1>
</header>
<div>
<a href="reporte.php">Descargar el reporte</a>
</div>
</div>
</body>
</html>
Lo emocionante comienza ahora ...
Implementaremos un archivo reporte.php
Primero al comenzar el código. Verificamos si la conexión existe en caso contrario el proceso terminaría.
<?php
$conexion = new mysqli('localhost','usuario','contraseña','prueba',3306);
if (mysqli_connect_errno()) {
printf("La conexión falló: %s\n", mysqli_connect_error());
exit();
}
Si todo va bien. El siguiente paso es realizar la consulta necesaria para poder obtener los datos:
$sql = "SELECT * FROM cliente";
//enviamos la consulta a la db
$resultado = mysql_query ($sql, $conexion) or die (mysql_error ());
//resivimos la respuesta de la db
$registros = mysql_num_rows ($resultado);
Una vez obtenido los datos llamaremos a la librería PHPExcel y crearemos un objeto de la misma.
//importamos
require_once 'PHPExcel/PHPExcel.php';
//crearemos un objeto de la libreria
$objPHPExcel = new PHPExcel();
Ahora colocaremos algunas propiedades del archivo Excel y nombraremos a cada columna y el título
- ◘ Primero seleccionamos la hoja con "setActiveSheetIndex(Indice de la hoja)".
- ◘ Luego el contenido de la celda "setCellValue(coordenada_celda, value)".
// Colocaremos propiedades del archivo
$objPHPExcel->getProperties()
->setCreator("Dexter")
->setLastModifiedBy("Dexter")
->setTitle("Reporte de Clientes")
->setSubject("Reporte de Clientes")
->setDescription("Reporte de Clientes")
->setKeywords("Excel Office 2007 openxml php")
->setCategory("Reporte de Clientes");
//Señalaremos que nombre llevara cada columna
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'REPORTE DE CLIENTES') //Titulo del reporte
->setCellValue('A3', 'ID')
->setCellValue('B3', 'NOMBRE')
->setCellValue('C3', 'APELLIDO PATERNO')
->setCellValue('D3', 'APELLIDO MATERNO')
->setCellValue('E3', 'FECHA NACIMIENTO')
->setCellValue('F3', 'SEXO')
->setCellValue('G3', 'DIRECCION')
->setCellValue('H3', 'EMAIL')
->setCellValue('I3', 'TELEFONO')
->setCellValue('J3', 'DNI');
Ahora con un While obtendremos los datos almacenados anteriormente en la variable $registros
$i = 4; // inicializamos el contador para empezar en la fila 4
while ($registro = mysql_fetch_object ($resultado)) {
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A'.$i, $registro->idCliente)
->setCellValue('B'.$i, $registro->Nom_Cliente)
->setCellValue('C'.$i, $registro->Apellido_Paterno)
->setCellValue('D'.$i, $registro->Apellido_Materno)
->setCellValue('E'.$i, $registro->Fecha_Nacimiento)
->setCellValue('F'.$i, $registro->Sexo)
->setCellValue('G'.$i, $registro->Direccion)
->setCellValue('H'.$i, $registro->Email)
->setCellValue('I'.$i, $registro->Telefono)
->setCellValue('J'.$i, $registro->Dni_Cliente);
$i++;
}
Hay dos maneras de poder dar el tamaño a las columnas.
- Automatica:
for($i = 'A'; $i <= 'J'; $i++){
$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension($i)->setAutoSize(TRUE);
}
- Manual:
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(26);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(29);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(30);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(26);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(26);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(15);
Por ultimo daremos unas configuraciones para culminar y colocaremos el código para que se descargue.
//Nombre a la hoja
$objPHPExcel->getActiveSheet()->setTitle('Alumnos');
//Se selecciona la hoja de indice 0 para mostrar
$objPHPExcel->setActiveSheetIndex(0);
// Inmovilizar paneles
$objPHPExcel->getActiveSheet(0)->freezePaneByColumnAndRow(0,4);
// Se manda el archivo al navegador web
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="ejemplo1.xlsx"');
header('Cache-Control: max-age=0');
$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');
$objWriter->save('php://output');
exit;
mysql_close ();
?>