Php – Exportar datos a Excel

Como sabemos, Excel puede abrir documentos HTML e interpretar su contenido como si fuera una hoja de cálculo, esta característica la aprovecharemos para exportar tablas, Recordsets o arreglos a Excel.

Tomemos por ejemplo el siguiente arreglo que contiene una lista de países:

$paises = array(0=>’México’,’Venezuela’,’Colombia’,’Belice’,’Guatemala’,
                 ‘Perú’,’Brasil’,’Panamá’);
 

Si deseamos exportar el arreglo a Excel deberemos primero generar su representación en una tabla Html de la siguiente manera:

//Declaremos el encabezado de la tabla
$tbHtml = "<html>
             <header>
               <tr>
                  <th>Id</th>
                  <th>Nombre</th>
               </tr>
             </header>";

// generamos el contenido de la tabla

foreach($paises as $indice => $valor)
  $tbHtml .= "<tr><td>$indice</td><td>$valor</td></tr>";

// finalizamos la declaración de la tabla
  $tbHtml .= "</table>";

Una vez que hemos generado la tabla vamos a devolverla al navegador como si se tratara de un archivo de Excel. Eso lo haremos aprovechando la función header, cuya documentación puedes consultar aquí

// esto le indica al navegador que muestre el diálogo de descarga aún sin haber descargado todo el contenido

header("Content-type: application/octet-stream");
//indicamos al navegador que se está devolviendo un archivo
header("Content-Disposition: attachment; filename=paises.xls");
//con esto evitamos que el navegador lo grabe en su caché
header("Pragma: no-cache");
header("Expires: 0");
//damos salida a la tabla
echo $tbHtml;

Al ejecutar el script en el navegador nos aparecerá el siguiente cuadro de diálogo:

descarga

y presionando el botón abrir se mostrará lo siguiente:

excel

Esto puede facilitar en gran medida exportar datos a Excel, ya sea a partir de un Recordset o arreglos.

Y este sería el script completo:

<?php

$paises = array(0=>'México','Venezuela','Colombia','Belice','Guatemala',
                 'Perú','Brasil','Panamá');
$tbHtml = "<table>
             <header>
                <tr>
                  <th>ID</th>
                  <th>País</th>
                </tr>
            </header>";

foreach($paises as $indice=>$valor)
  $tbHtml .= "<tr><td>$indice</td><td>$valor</td></tr>";
$tbHtml .= "</html>";

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=paises.xls");
header("Pragma: no-cache");
header("Expires: 0");
echo $tbHtml;

?>

 

 

 

6 Comments

  1. hola tu formula me funciona localmente pero al subir mi aplicacion ya nop
    este es mi codigo
    error;
    }

    //Escribimos la primera fila con las cabeceras
    $myArr=array(“Clave”,”Nombre”,”Guia”,”Fecha envio”,”Paqueteria”,”Forma envio”,”Tipo envio”,”Facturas”,”Fecha Rrecepcion”,”Recibe”,”Rastreo”,”Comentarios”,”Fecha alta”,”Registro”,”Estado”,”Validado”,”Origen”,”Destino”);
    $excel->writeLine($myArr);

    //REALIZAMOS LA CONSULTA
    $dbhost = “localhost”;
    $dbuser = “root”;
    $dbpassword = “”;
    $dbname = “simexsa”;

    $db2 = mysql_connect($dbhost, $dbuser, $dbpassword) or die(“Connection Error: ” . mysql_error());
    mysql_select_db($dbname) or die(“Error al conectar a la base de datos.”);
    $sql2 = “SELECT * FROM guias WHERE f_alta BETWEEN ‘”.$ii.”‘ AND ‘”.$ff.”‘”;
    $sql2 .= “ORDER BY f_alta DESC”;
    $result2 = mysql_query( $sql2) or die(“No se puede ejecutar la consulta: “.mysql_error());

    //Escribimos todos los registros de la base de datos
    //en el fichero EXCEL
    while($Rs2 = mysql_fetch_array($result2)) {
    $myArr=array(
    $Rs2[‘clave’],
    $Rs2[‘nombre’],
    $Rs2[‘guia’],
    date(“d-m-Y”,strtotime($Rs2[‘f_envio’])),
    $Rs2[‘paqueteria’],
    $Rs2[‘formaenvio’],
    $Rs2[‘t_envio’],
    $Rs2[‘n_facturas’],
    date(“d-m-Y”,strtotime($Rs2[‘f_recepcion’])),
    $Rs2[‘q_recibe’],
    $Rs2[‘rastreo’],
    $Rs2[‘comentarios’],
    date(“d-m-Y”,strtotime($Rs2[‘f_alta’])),
    $Rs2[‘q_alta’],
    $Rs2[‘estado’],
    $Rs2[‘active’],
    $Rs2[‘origen’],
    $Rs2[‘destino’],
    );
    $excel->writeLine($myArr);
    //Otra forma es
    //$excel->writeLine($Rs2);
    //De este modo volcariamos todos los registros seleccionados
    //Sin necesidad de colocarlos/filtrar previamente en $myArr
    }
    $excel->close();

    //Abrimos el fichero excel que acabamos de crear
    header(‘location:’.$archivo);
    ?>

Deja un comentario