Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/08/2012, 04:03
alyciashape
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Generar reportes en excel

¿No te serviría en .csv? Excel los abre por defecto y se muestran en formato de tabla.

Yo lo exporto con este código que cogí de algún sitio y modifiqué un poco.
Código PHP:
 //Fichero exportar csv
//Generamos el fichero CSV
//requiere que le pasen el nombre del fichero
//ej. $csv_file="reporte.csv"
//Y opcional el directorio
//$directorio ="/csv/";
//El fichero se genera tanto para subir por FTP como para exportar a fichero CSV
$nombreBD "nombre de tu bd";
$consulta sprintf"SELECT * FROM tabla" );
if (!isset(
$directorio)) {$directorio="";}
$ruta $directorio.$csv_file;
include(
"conexion.php"); //AQUÍ yo incluí mi conexion a la base de datos
$csv_end "
    "
;  
$csv_sep ";";  //separador entre datos    
$csv=""
//Si es un archivo hay que hacer un echo para que lo guarde sino lo metemos en la variable
if (isset($enArchivo)) {echo 'codigo'.$csv_sep.'nombre'.$csv_sep.'refprov'.$csv_sep.'pvp6'.$csv_sep.'exisTotal'.$csv_sep.'codigo2'.$csv_end;}
else { 
$csv 'codigo'.$csv_sep.'nombre'.$csv_sep.'refprov'.$csv_sep.'pvp6'.$csv_sep.'exisTotal'.$csv_sep.'codigo2'.$csv_end; }
while(
$row=mysql_fetch_array($resultado))  
{  
    if (isset(
$enArchivo)) {echo $row['codigo'].$csv_sep.$row['nombre'].$csv_sep.$row['refprov'].$csv_sep.$row['pvp6'].$csv_sep.$row['exisTotal'].$csv_sep.$row['codigo2'].$csv_end; } 
    else {
        
$csv.=$row['codigo'].$csv_sep.$row['nombre'].$csv_sep.$row['refprov'].$csv_sep.$row['pvp6'].$csv_sep.$row['exisTotal'].$csv_sep.$row['codigo2'].$csv_end;  
    }        
}  
if (!isset(
$enArchivo)) //Si es en fichero no guardamos copia
{        
    
//Generamos el csv de todos los datos  
    
if (!$handle fopen($ruta"w")) {  
        echo 
"No se tiene permiso para abrir el fichero"
        
$log = new entrada_log("ERROR. No se tiene permiso para abrir el fichero $ruta.");
        exit;  
    }  
    if (
fwrite($handleutf8_decode($csv)) === FALSE) {  
        
$log = new entrada_log("Error, no se tiene permiso para escribir en el fichero $ruta.");
        echo 
"No se tiene permiso para escribir en el fichero";  
        exit;  
    }  
    
$log = new entrada_log("El fichero CSV se ha generado correctamente.");
    
fclose($handle);  

Tendrás que modificar muchas cosas para que te funcione. Ojo a los campos que quieres exportar también que los tienes que poner a mano.

Ahora el fichero que llama al include anterior para generar el fichero:
Código PHP:
 //fichero include_generaCSV
include ("./includes/clases.php");
$csv_file date('Y-m-d__H.i')."__nombreFichero.csv";
$enArchivo TRUE//para diferenciar que el que lo tiene que subir en FTP del que genera el fichero
 // Añadimos las cabeceras para decirle que tiene que devolver un fichero con nombre.csv
 
header"Content-Type: text/csv" );
 
header"Content-Disposition: attachment;filename=$csv_file" );
 include 
"include_generaCSV.php"
Cuando lo llamo desde subir.ftp pues en lugar de devolverme el archivo se sube directamente al ftp.

Luego el formulario que lleva a generaCSV:
Código PHP:
 //fichero con el boton para generar el .csv
<strong>Exportar en CSV</strong>
<
form method="post" action="exportarCSV.php" name="exportar">                       
<
input type="submit" name="subir" value="Exportar"/>
</
form
Aquí te dejo también la clase que incluí para generar el log. Lo hice para probar de crear clases que no tenía ni idea. No se si está bien o mal pero funciona :
Código PHP:
 //clases.php (va con un include en todos)
class entrada_log {
    var 
$fichero;
    var 
$fecha;
    function 
__construct($texto) { //Constructor de la clase
        
$this->fichero  fopen("log.log","a"); //a es modo lectura y coloca el puntero al final
        
$this->fecha date("d-m-Y H:i:s \t");
        
fwrite($this->fichero$this->fecha $texto PHP_EOL);   
        
fclose($this->fichero);
    }
}
// Para escribir un registro simplemente ponemos
// $log = new entrada_log("Mensaje a añadir al log"); 
Creo que no se me olvida nada, espero que te sirva.