Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/01/2011, 10:50
Avatar de daniloquispe
daniloquispe
 
Fecha de Ingreso: mayo-2007
Mensajes: 38
Antigüedad: 17 años, 6 meses
Puntos: 0
Exclamación Librería exporta mal archivos Excel

Hola a todos:

Tengo un problema reparando un sistema en PHP: Resulta que encontré una librería que exporta contenido de base de datos a un archivo Excel (lo hace de forma binaria, no usa cabeceras MIME ni nada por el estilo).

He probado la aplicación y exportando el Excel (baja un archivo .xls) y abriéndolo en Office 2007 y Office 2010 y abre bien, pero en Office 2003 ni siquiera abre (sale solamente un mensaje "no se puede leer el archivo"), y eso que el archivo se exporta en formato de Excel 2003.

Este es el código de la librería:

Código PHP:
<?php

/**
 * Clase para exportar listados a MS Excel.
 */
class Excel
{
    private 
$file;
    private 
$row;
    
/*
     * Constructor
     */
    
function __construct()
    {
        
$this->file $this->__BOF();
        
$row 0;
    }

    
/*
     * Inicio del fichero
     */
    
private function __BOF() {
        return 
pack("ssssss"0x8090x80x00x100x00x0);
    }

    
/*
     * Final del fichero
     */
    
private function __EOF() {
        return 
pack("ss"0x0A0x00);
    }

    
/*
     * Escribe un número en una fila y columna
     */
    
private function __writeNum($row$col$value) {
        
$this->file .= pack("sssss"0x20314$row$col0x0);
        
$this->file .= pack("d"$value);
    }

    
/*
     * Escribe un string en una fila y columna
     */
    
private function __writeString($row$col$value ) {
        
$L strlen($value);
        
$this->file .= pack("ssssss"0x204$L$row$col0x0$L);
        
$this->file .= $value;
    }

    
/*
     * Escribe un valor en una fila y columna, este método decide si será un número o un string.
     */
    
private function writeCell($value,$row,$col) {
        if(
is_numeric($value)) {
            
$this->__writeNum($row,$col,$value);
        }elseif(
is_string($value)) {
            
$this->__writeString($row,$col,$value);
        }
    }

    
/*
     * Añadir datos de una fila
     */
    
public function addRow($data,$row=null) {
        
$columns count($data);

        if(!isset(
$row)) {
            
$row $this->row;
            
$this->row++;
        }
        for(
$i=0$i<$columns$i++) {
            
$cell $data[$i];
            
$this->writeCell($cell,$row,$i);
        }
    }

    
/*
     * Añadir datos de una tabla
     */
    
public function addTable($data) {
        
$rows count($data);

        for(
$j=0;$j<$rows;$j++){

            
$row $this->row;
            
$this->row++;

            
$columns count($data[$j]);

            for(
$i=0$i<$columns$i++) {

                
$cell $data[$j][$i];
                
$this->writeCell($cell,$row,$i);

            }
        }
    }

    
/*
     * Genera un fichero para descargar en memoria
     */
    
public function download($filename) {
        
header("Pragma: public");
        
header("Expires: 0");
        
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        
header("Content-Type: application/force-download");
        
header("Content-Type: application/octet-stream");
        
header("Content-Type: application/download");;
        
header("Content-Disposition: attachment;filename=$filename ");
        
header("Content-Transfer-Encoding: binary ");
        
$this->write();
    }

    
/*
     * Escribe el contenido del fichero
     */
    
private function write() {
        echo 
$file $this->file.$this->__EOF();
    }

}

?>
Y el código para generar el archivo para dscargar es:

Código PHP:
$xls = new Excel();
$xls->addRow($cols);  // $cols contiene las cabeceras de columna
$xls->addTable($data);  // $data contiene los datos, proviene de una consulta SQL
$xls->download("archivo.xls"); 
¿Alguien puede darme una mano con esto? Lo necesito con urgencia.

Gracias