16/11/2016, 13:23
|
| | Fecha de Ingreso: junio-2013
Mensajes: 94
Antigüedad: 10 años, 10 meses Puntos: 0 | |
Respuesta: mostrar datos de forma horizontal en excel con php Cita:
Iniciado por VanFoster El problema que planteas lo puedes solucionar con más fácilmente con php y deberás realizar un pre proceso de tu set de datos para dejarlo como lo requieres en el reporte; este detalle es más común de lo que pensamos y no precisamente se debe a que tu diseño de base de datos sea incorrecto, al contrario en tu caso por lo que veo es totalmente correcto y no requieres realizar modificaciones a tu DB; simple y sencillamente los reportes cuanto mas complejos son o cambias la perspectiva desde la que se desea analizar los datos te alejas fácilmente de tu modelo de BD planteado. Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>LISTA DE USUARIOS</title> </head> <body> <table width="100%" border="1" cellspacing="0" cellpadding="0"> <?PHP include('conex.php'); $consul = "select nombre, cedula, conceptos, monto from autos"; $resulE = pg_query($consul); $columnas=array('nombre','cedula');//Columnas del reporte, agregaremos posteriormente una posición por cada concepto distinto $reporte=array();//Array Asociativo(Realmente Matriz), cada index es la cedula, estoy suponiendo que no hay mas de una persona con la misma cedula while($res=pg_fetch_array($resulE)){//Recorremos todo el set de resultados para vaciar los datos en $reporte ya con la estructura que queremos if(!in_array($columnas))$columnas[]=$res["conceptos"];//Si no existe el concepto en el array de columnas lo agregamos if(!isset($reporte[$res["cedula"]]))$report[$res["cedula"]]=array(//Inicializamos una posicion del array $report por cada persona 'nombre'=>$res["nombre"], 'cedula'=>$res["cedula"] ); $persona=&$reporte[$res["cedula"]];//Guardamos referencia, solo para no arrastrar teclas //Parte central de la solucion del problema, aqui agregamos un indice al array $persona por cada concepto distinto, // estamos trabajando sobre segundo nivel de array $reporte y $persona tomalo como un alias de $reporte[$res["cedula"]]. // El indice Será la descripcion del concepto. if(!isset($persona[$res["conceptos"]]))$persona[$res["conceptos"]]=0; //Sumamos el monto en el indice del concepto. $persona[$res["conceptos"]]+=$res["monto"]; } //--------------->Ahora Imprimimos el reporte //Encabezado de reporte, el colspan depende de las columnas que se hayan detectado echo '<tr><td colspan="'.($lencol=count($columnas)).'" bgcolor="skyblue"><CENTER><strong>REPORTE </strong></CENTER></td></tr>'; //--------------->Imprimir Titulos de columnas echo '<tr bgcolor="red">'; for($i=0;$i<$lencol;$i++)echo "<td>{$columnas[$i]}</td>"; echo '</tr>'; //--------------->Imprimir Datos foreach($reporte as $cedula=>$persona){ echo '<tr>'; for($i=0;$i<$lencol;$i++){ $valor=isset($persona[$columnas[$i]])?$persona[$columnas[$i]]:'';//SI no existe la columna en la persona no se imprime nada echo "<td>{$valor}</td>"; } echo '</tr>'; } /* Intentaré graficar la estructura que quiero que tenga la variable $reporte por si me equivoque arriba: $reporte{ '0001'=>{ 'nombre'=>'Yo', 'cedula'=>'0001', 'compensaciones '=>100, 'vacaciones'=>500 }, '0002'=>{ 'nombre'=>'Tu', 'cedula'=>'0002', 'sueldos y salarios'=>1000, 'vales'=>'300' } } $columnas{ 0=>'nombre', 1=>'cedula', 2=>'compensaciones', 3=>'vacaciones', 4=>'sueldos y salarios', 5=>'vales' } */ ?> </table> </body> </html> disculpa que tarde tanto en responder es que estaba en otras cosa, pero muchas gracias probare este codigo a ver que tal y despues doy respuesta de como me fue con el |