Ver Mensaje Individual
  #5 (permalink)  
Antiguo 09/08/2012, 04:07
alyciashape
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 14 años, 5 meses
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($handle, utf8_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!