Foros del Web » Programando para Internet » PHP »

Problemas generando archivo Excel con PHPExcel y Mysql

Estas en el tema de Problemas generando archivo Excel con PHPExcel y Mysql en el foro de PHP en Foros del Web. Estimados Amigos.! Antes de comenzar con este "seudoaporte" (casi completo) quiero agradecer EXTREMADAMENTE a todos los foristas y Administradores del foro (a esos extraterrestres que ...
  #1 (permalink)  
Antiguo 15/11/2010, 19:36
Avatar de Doble_a71  
Fecha de Ingreso: noviembre-2010
Ubicación: Venezuela
Mensajes: 6
Antigüedad: 13 años, 5 meses
Puntos: 1
Problemas generando archivo Excel con PHPExcel y Mysql

Estimados Amigos.!
Antes de comenzar con este "seudoaporte" (casi completo) quiero agradecer EXTREMADAMENTE a todos los foristas y Administradores del foro (a esos extraterrestres que nos aclaran con dedicación nuestras dudas) porque con su ayuda he logrado hacer un sistema robusto y estable usando php, apache, mysql y ubuntu. Sin estos seres de otra galaxia no hubiese podido ni hacer el "hola mundo" que todos hacemos al principio.
Siguiendo, quiero explicarles también que he rebuscado mucho esta solución y aunque le falta lo que a mi parecer es lo mas importante: meter todos los datos que necesito registrar en un archivo de excel, he logrado generar de forma rápida y con un aceptable aspecto, una hoja de calculo de excel extraída de la base de datos de Mysql.
Pero como todo no puede ser color de rosa, el detalle que me falta es que se incluyan todos los datos extraídos de la base de datos. Ya logre (luego de 2 días y un problema con mi mujer por no prestarle atención) que me mostrara la información pero solo me pasa a excel el ultimo registro que cumple la condición solicitada. Creo que la solución está en un ciclo "For" pero lo he puesto en distintas partes del script y solo me funciona en el lugar donde esta actualmente. Ésta, en todo caso, será la piedra de tranca que espero que nuestros amigos extraterrestres puedan dilapidar para que todos los que aquí buscamos solución colguemos otra banderita de "éxito" en nuestros scripts.
Para los que copian y pegan sin leer antes: Para este script he utilizado la librería de script de PHPExcel versión 1.7.2. Aunque hay otras por la web, esta es la que genera de forma mas completa una hoja de excel. Me tocó leer muchísimo e incluso hacer uso de los traductores de la web para entender bien lo que ellos quieren explicar con su gramática hueca, así que si solo quieres copiar y pegar debes tener en cuenta que aquí si hay que "leer el manual".
Usé esta versión de PHPExcel en su distribución en ".zip" porque la ".tar" de la 1.7.4 no venia con los ejemplos. Según ellos, la 1.7.4 es la ultima y es estable pero aunque la descargue un par de veces, esta al parecer viene incompleta.
Se fijaran que al final no hay un cierre de php (?>) y es a propósito pues, PHPExcel lo recomienda para que no tengas problemas del tipo "Excel Corrupt".
El script recibe de otro php dos fechas para generar un reporte que contenga los datos que cumplan con esas condiciones.
Otra cosa mas... el archivo se genera en excel 2003 para que sea compatible con office 2007 también.!
Por otra parte, el script solo me funciono cuando lo guarde en el directorio que creé dentro de mi proyecto donde guarde todos los php de PHPExcel, me explico, descomprimí los PHPExcel en una carpeta llamada "excel" y luego copie este script en la carpeta "excel" y desde allí lo mando a ejecutar en mi proyecto.
Aquí les va el Código (Trato que con los comentarios se vea lo mas explicito posible):

Código:
<?php
include ("../miacceso.php");
include ("../miconex.php");     
// estos es una funcion para cambiar el formato de la fecha que entra y poder mostrarla y/o guardarla en la base de datos
function FechaDerecha($fecha){
    list($dia,$mes,$anio)=explode("-",$fecha);
    return $anio."-".$mes."-".$dia;
}
// establesco las variables q voy a utilizar de las fechas
$fdes = $_GET["entrada"];
$fhas = $_GET["salida"];
$fdes1 = FechaDerecha($_GET["entrada"]);
$fhas1 = FechaDerecha($_GET["salida"]);

// En esta parte hago lo correspondiente para crear la variable de conexion y conectarme a la bd
$plink=mysql_connect($host,$user,$passw)or die ('Ha fallado una conexion: '.mysql_error()); 
//selecciono mi base de datos
mysql_select_db($dbname,$plink) or die(mysql_error());

//Sentencia sql (sin limit) para sacar los datos que voy a grabar en el archivo
$_pagi_sql = "SELECT * FROM $dbtabler WHERE rmbfrecibido BETWEEN '$fdes1' AND '$fhas1'";
$result = mysql_query($_pagi_sql,$plink) or die ('Ha fallado la conexion a la tabla: '.mysql_error());

// verifico que hayan datos para grabar y si no hay mando al usuario a la pagina donde inicia la solicitud de grabar archivo
$numeroRegistros = mysql_num_rows($result);
//echo "cant reg:".$numeroRegistros;
if($numeroRegistros==0)
{
  $mensaje = '<SCRIPT name="accion"> alert("No se encontraron resultados");document.location=("./pidefech.php")</SCRIPT>';
    echo $mensaje;
}
/**PHPExcel
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
 * @version    1.7.2, 2010-01-11*/
/** Error reporting */
error_reporting(E_ALL);

/** PHPExcel */
require_once '../excel/Classes/PHPExcel.php';
/** PHPExcel_IOFactory */
require_once '../excel/Classes/PHPExcel/IOFactory.php';

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// aqui van los datos en concreto, hay q incluirlos en un ciclo para que se muestren todos los datos

for ( $i = 5 ; $i <= $numeroRegistros ; $i++)
	{
// hago el ciclo para que salgan los datos de la bd
	while($row = mysql_fetch_array($result))
		{
// convierto en variables los datos que vienen de la base de datos
	$id = $row['idnroremb'];
	$frec = FechaInversa($row['frecibido']);
	$nom = $row['tit'];
	$ced = $row['cedulatit'];
	$ben = $row['benef'];
	$cbe = $row['cedbenef'];
	$tfa = $row['totfact'];
	$pat = $row['patolog'];
	$can = $row['totcanc'];
	$ban = $row['banco'];
	$tcta= $row['tipcta'];
	$cta = $row['nrocta'];
	$sta = $row['status'];
	$tpe = $row['tipopers'];
	$obv = $row['observ'];
	$cel = $row['tlfnocel'];
	$cas = $row['tlfnocas'];
	$tip = $row['tipreemb'];
// este es el encabezado del archivo
$objPHPExcel->setActiveSheetIndex(0)// comenzar en la primera fila y primera columna
		->SetCellValue('G2', 'fecha Desde:')
		->SetCellValue('H2', $fdes)
		->SetCellValue('J2', 'fecha Hasta:')
		->SetCellValue('K2', $fhas)
		->setCellValue('A4', 'Nro')
		->setCellValue('B4', 'F.Recibido')
		->setCellValue('C4', 'Titular')
		->setCellValue('D4', 'C.I.Tit.')
		->setCellValue('E4', 'Beneficiario')
		->setCellValue('F4', 'C.I.Benef')
		->setCellValue('G4', 'Monto Total Facturado')
		->setCellValue('H4', 'Patologia')
		->setCellValue('I4', 'Monto Total a Cancelar')
		->setCellValue('J4', 'Banco')
		->setCellValue('K4', 'Tipo de Cta.')
		->setCellValue('L4', 'Nro de Cuenta')
		->setCellValue('M4', 'Estatus')
		->setCellValue('N4', 'Tipo de Personal')
		->setCellValue('O4', 'Tipo Reembolso')
		->setCellValue('P4', 'Observacion')
// aqui muestro los datos segun la variable declarada anteriormente
		->setCellValue('A'.$i, $id)
		->setCellValue('B'.$i, $frec)
		->setCellValue('C'.$i, $nom)
		->setCellValue('D'.$i, $ced)
		->setCellValue('E'.$i, $ben)
		->setCellValue('F'.$i, $cbe)
		->setCellValue('G'.$i, $tfa)
		->setCellValue('H'.$i, $pat)
		->setCellValue('I'.$i, $can)
		->setCellValue('J'.$i, $ban)
		->setCellValue('K'.$i, $tcta)
		->setCellValue('L'.$i, $cta)
		->setCellValue('M'.$i, $sta)
		->setCellValue('N'.$i, $tpe)
		->setCellValue('O'.$i, $tip)
		->setCellValue('P'.$i, $obv);
		}// fin del while
	}// fin del for interno
// setear que las celdas autoajusten el ancho
$objPHPExcel->getActiveSheet()->getColumnDimension('A:P')->setAutoSize(true);

// Renombrando la hoja
$objPHPExcel->getActiveSheet()->setTitle('reembolsos por fecha');

// Seteo del Encabezado y pie de pagina
$objDrawing = new PHPExcel_Worksheet_HeaderFooterDrawing();
$objDrawing->setName('logo');
$objDrawing->setPath('../imagenes/logo.jpg');
$objDrawing->setWidth(400);
$objDrawing->setHeight(95);
$objPHPExcel->getActiveSheet()->getHeaderFooter()->addImage($objDrawing, PHPExcel_Worksheet_HeaderFooter::IMAGE_HEADER_LEFT);
$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddHeader('&C&H AQUI COLOCA LO QUE QUIERAS Q SE VEA EN EL ENCAENCABEZADO' . '&RDia &D Hora &T');
$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddFooter('&L&B' . $objPHPExcel->getProperties()->getTitle() . '&C&H AQUI COLOCAS LO Q QUIERAS Q SE VEA EN EL PIE DE PAGINA'  . '&RPag &P de &N');

//seteo del encabezado de la tabla
$styleArray = array(
	'font' => array(
		'bold' => true,
	),
	'alignment' => array(
		'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT,
	),
	'borders' => array(
		'allborders' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
		),
	),
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR,
		'rotation' => 90,
		'startcolor' => array(
			'argb' => 'BDC61C',
		),
		'endcolor' => array(
			'argb' => 'ACFFA9',
		),
	),
);

$objPHPExcel->getActiveSheet()->getStyle('A4:p4')->applyFromArray($styleArray);

// Seteo del tamanio de la pagina
$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);
$objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEGAL);
// tambien reducirla para que se vea completa en la hoja tipo LEGAL
$objPHPExcel->getActiveSheet()->getPageSetup()->setScale(68);

// Decirle a excel que centre la pagina en la vista preliminar
$objPHPExcel->getActiveSheet()->getPageSetup()->setHorizontalCentered(true);
$objPHPExcel->getActiveSheet()->getPageSetup()->setVerticalCentered(false);

// Repetir los encabezados de tabla en cada pagina
$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 4);

// Seteo como activa la primera hoja por si acaso tienen mas de una a guardar
//$objPHPExcel->setActiveSheetIndex(0);

// Redirigir la salida hacia el navegador del cliente (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="miarchivo.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); 
exit;
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 14:42.