Ver Mensaje Individual
  #5 (permalink)  
Antiguo 09/08/2012, 04:07
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"); 
Aquí te dejo también mi conexion.php que va también en include CADA vez que quiero hacer algo de la BD:
Código PHP:
$servidor 'localhost';
$usuario 'usuario';
$clave 'pass';
$conn mysql_connect($servidor$usuario$clave) or die( mysql_error("No se pudo conectar"));
    
mysql_select_db$nombreBD$conn ) or die( mysql_error$conn ) );
    
$resultado mysql_query$consulta$conn ) or die( mysql_error$conn ));
    if (isset(
$cerrarConexion))
    {
        
mysql_close();
        
$unset ($cerrarConexion); 
    } 
Para usarlo:
Código PHP:
$nombreBD "nombre de tu bd";
$consulta "SELECT * FROM tabla";
//Y te queda el resultado de la consulta en la variable $resultado para hacer lo que quieras con ella 

Creo que no se me olvida nada, espero que te sirva.


NOTA: Parece que le di a quotear en lugar de editar. Borrad el anterior post si puede ser!