Foros del Web » Programando para Internet » PHP »

Exportar datos de PHP a EXCEL

Estas en el tema de Exportar datos de PHP a EXCEL en el foro de PHP en Foros del Web. Hola! He diseñado una aplicación en php la cual exporta una serie de datos de mysql a EXCEL. Todo correcto pero el problema es que ...
  #1 (permalink)  
Antiguo 27/10/2010, 03:20
 
Fecha de Ingreso: octubre-2003
Ubicación: España
Mensajes: 1.067
Antigüedad: 20 años, 6 meses
Puntos: 18
Exportar datos de PHP a EXCEL

Hola!

He diseñado una aplicación en php la cual exporta una serie de datos de mysql a EXCEL. Todo correcto pero el problema es que cuando abro con excel dicha exportación me tarda mucho (son unos 3000 registros exportados). He leído que puede ser por que a la hora de exportar, se exporta como "página web" y si el excel generado es muy grande tarda bastante. Mi codigo es este:

header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"exportar.xls\"");
header("Content-Transfer-Encoding: binary");

..... Aquí la tabla con los datos ......


¿ Como puedo realizar un excel que se abra de manera rápida ?

Gracias !!
  #2 (permalink)  
Antiguo 27/10/2010, 08:22
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 9 meses
Puntos: 88
Respuesta: Exportar datos de PHP a EXCEL

intenta con estas cabeceras
Código PHP:
Ver original
  1. header('Content-type: application/vnd.ms-excel');//esta es la principal
  2. header("Content-Disposition: attachment; filename=archivo.xls");
  3. header("Pragma: no-cache");
  4. header("Expires: 0");
saludos
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #3 (permalink)  
Antiguo 27/10/2010, 09:15
 
Fecha de Ingreso: octubre-2003
Ubicación: España
Mensajes: 1.067
Antigüedad: 20 años, 6 meses
Puntos: 18
Respuesta: Exportar datos de PHP a EXCEL

Gracias por el aporte pero me funciona igual.
Si te fijas, cuando abrimos el excel exportado, si seleccionamos "guardar como", en el tipo de archivo sale "página web", debería salir Libro de Excel..., eso indica que lo interpreta como página web...
  #4 (permalink)  
Antiguo 28/10/2010, 06:22
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: Exportar datos de PHP a EXCEL

prueba exportarlo como csv o archivo plano

y compara tiempos

salu2
  #5 (permalink)  
Antiguo 28/10/2010, 06:31
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Exportar datos de PHP a EXCEL

para ello tienes la opción de utilizar Spreadsheet_Excel_Writer que forma parte de PEAR
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #6 (permalink)  
Antiguo 28/10/2010, 07:03
 
Fecha de Ingreso: octubre-2003
Ubicación: España
Mensajes: 1.067
Antigüedad: 20 años, 6 meses
Puntos: 18
Respuesta: Exportar datos de PHP a EXCEL

Gracias!!

probaré las diversas soluciones a ver k tal..

Saludos!
  #7 (permalink)  
Antiguo 28/10/2010, 09:06
Avatar de historiasdemaria  
Fecha de Ingreso: septiembre-2010
Ubicación: www
Mensajes: 433
Antigüedad: 13 años, 6 meses
Puntos: 54
Respuesta: Exportar datos de PHP a EXCEL

La libreria [URL="http://pear.php.net/manual/en/package.fileformats.spreadsheet-excel-writer.intro.php"]Spreadsheet_Excel_Writer[/URL] que te han recomendado es la mejor solucion si tiene que ser Excel, porque asi no tendras problemas de versiones Excel (97,2003,2007) al mostrar tus datos.
  #8 (permalink)  
Antiguo 02/11/2010, 15:18
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Exportar datos de PHP a EXCEL

No se si ya has podido bajar los tiempos. Si los que necesitas es generar un verdadero excel puedes usar la biblioteca de CodePlex, en la cual se encuentra PHPExcel...

Es muy buena y puedes hacer casi que cualquier cosa con el excel...

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #9 (permalink)  
Antiguo 07/11/2010, 14:04
Avatar de Doble_a71  
Fecha de Ingreso: noviembre-2010
Ubicación: Venezuela
Mensajes: 6
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Exportar datos de PHP a EXCEL

Estimados Amigos.!
Antes de comenzar con mi primer aporte (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".
Use 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 cree 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;

Etiquetas: excel
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:29.