4 sencillos pasos para exportar registros SQL a Excel (CSV) con PHP

Alfredo
Sígueme!
Últimas entradas de Alfredo (ver todo)
Exportar registros SQL a Excel
Exportar registros SQL a Excel

No es raro encontrarnos en páginas web que muestran una serie de datos en tablas y que ofrecen a los usuarios la posibilidad de exportar registros SQL a Excel (CSV) para que los usuarios que están viendo esos registros, puedan visualizarlos o tratar esos datos sin tener que estar conectados a Internet.

Si estáis interesados en saber cómo hacer esto, en este POST te explico en 4 pasos cómo poder exportar registros que se almacenan en una base de datos SQL a Excel (CSV) con PHP.

Existen librerías desarrolladas en PHP que podemos exportar datos a Excel , ya hablaremos de ellas posteriormente en otro POST. Lo que vamos a hacer es generar un fichero Excel, con la estensión .CSV de la forma más limpia y sencillo de entender.

Preparamos la consulta SQL

Lo primero que vamos a hacer es preparar nuestra sentencia SQL para mostrar los registros que queremos exportar. Está consulta la utilizaremos posteriormente para la visualización de datos en nuestra página web y luego en el fichero Excel. Supongamos que tenemos los siguientes datos:

SELECT dni,nombre,apellidos,telefono,email FROM clientes;

registros SQL
Ejemplo de registros SQL

Preparamos nuestro fichero PHP

Paso 1: Nos conectamos a la Base de Datos

El primer paso es tener los datos de nuestro proveedor de Hosting (o de nuestro servidor local) y los rellenamos en el código (dentro de la función conectar()).

<?php
//Función para conectarnos con la BBDD 
function conectar(){
    // Rellenamos todos los datos para conectarnos a la BBDD
    $x=new mysqli(
        "", // URL
        "", // Usuario
        "", // Clave
        "" // Nombre 
    );
    //En caso de haber un error de conexión a la BBDD...
    if ($x->connect_errno){
        //Salimos de la conexión con el error
        die ("Error: ".$x->mysqli_connect_errno().$x->mysqli_connect_error());
        exit(); 
    }
return $x;
}
?>

Paso 2: Añadimos la consulta SQL que hemos preparado

Llamamos a la función para conectarnos a la Base de Datos y añadimos nuestra consulta SQL que hemos preparado antes. Sólo se llama una vez a la Base de Datos y podemos hacer tantas consultas como nosotros queramos.

Además, en el caso de asociar varias tablas, es mejor utilizar alias para todos los campos. Más técnico, cuando nuestra consulta utilizamos varios JOIN para mostrar más datos de nuestra consulta SQL. Así diferenciamos sin problemas qué campo y tabla queremos mostrar.

//Nos conectamos a SQL
$c=conectar();
 
// Creamos la consulta que tenemos arriba para verla en PHP y en CSV
$consulta=$c->query("SELECT dni,nombre,apellidos,telefono,email FROM clientes");
 

Paso 3: Preparamos el formulario de Exportar PHP a Excel (CSV) y la tabla para mostrar los registros SQL.

Vamos a crear un miniformulario en el que vamos a tener sólo un botón que pondrá “Exportar a CSV”. Este botón nos va a servir para enviar el formulario y comprobar que hemos pulsado al botón. Además vamos a crear una tabla para que se vaya rellenando todos los datos de nuestra consulta SQL y que vaya rellenando todos los datos en las columnas y filas de la tabla.

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <form action="<?php echo $_SERVER[“PHP_SELF”]; ?>" method="post">
            <button type="submit" id="export_data" name="exportarCSV" value="Export to excel" class="btn btn-info">Exportar a Excel (CSV)</button>
        </form>
        <table>
            <thead>
                <tr>
                    <th>DNI</th>
                    <th>Nombre</th>
                    <th>Apellidos</th>
                    <th>Teléfono</th>
                    <th>Email</th>
                </tr>
            </thead>
            <tbody>    
                <?php
                while($cliente=$consulta->fetch_array()){
                    echo '<tr>';
                        echo '<td>'.$cliente['idtienda'].'</td>';
                        echo '<td>'.$cliente['nombre'].'</td>';
                        echo '<td>'.$cliente['direccion'].'</td>';
                        echo '<td></td>';
                        echo '<td></td>';
                    echo '</tr>';
                }
                ?>
            </tbody>
        </table>
    </body>
</html>

Paso 4: Llega la magia de convertir los registros a Excel (CSV).

Vamos a crear una condición en el que vamos a comprobar si se ha pulsado el botón de Exportar a Excel (CSV).

Además, haremos otra comprobación si existen registros con la consulta que hemos elaborado previamente. Si no existen datos, nos indicará que no hay datos a mostrar.

Si existen registros en nuestra consulta, vamos a preparar el nombre del documento CSV. Lo vamos a llamar con lo más significativo, usuarios y la fecha con la hora por si vamos a realizar varias extracciones de datos a lo largo del día. Así sería el nombre elegido:

usuarios dia-mes-año hora:minuto:segundos.csv

Indicamos en el fichero PHP que el documento que vamos a tratar va a ser un fichero csv con el nombre del fichero que hemos hablado antes:

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=".$ficheroExcel);

Vamos a mostrar las primeras filas que nos servirá de cabecera del documento, vamos a indicar qué campos vamos a tratar (el nombre se puede poner el que quiera, pero yo voy a poner el nombre de la columna de la tabla de SQL) separado por puinto y coma y para que no nos inserte los datos en la misma fila, vamos a utilizar el retorno de carro con \n :

echo "idtienda;nombre;direccion\n";

Recorremos de nuevo la consulta SQL con PHP y vamos añadiendo las filas del fichero CSV. Para finalizar y cerrar el documento CSV, debemos indicar que el fichero está cerrado con la instrucción exit;

//Si hemos pulsado al botón de Exportar a Excel (CSV)...
if(isset($_POST["exportarCSV"])) {
    if(!empty($consulta)) {
        //El nombre del fichero tendrá el nombre de "usuarios_dia-mes-anio hora_minutos_segundos.csv"
        $ficheroExcel="usuarios ".date("d-m-Y H_i_s").".csv";
        
        //Indicamos que vamos a tratar con un fichero CSV
        header("Content-type: text/csv");
        header("Content-Disposition: attachment; filename=".$ficheroExcel);
        
        // Vamos a mostrar en las celdas las columnas que queremos que aparezcan en la primera fila, separadas por ; 
        echo "idtienda;nombre;direccion\n";    
            
        // Recorremos la consulta SQL y lo mostramos
        while($cliente=$consulta->fetch_array()){
                echo $cliente['idtienda'].";";
                echo $cliente['nombre'].";";
                echo $cliente['direccion']."\n";
        }                
    }else{
        echo "No hay datos a exportar";
    }
    //Para que se cree el Excel correctamente, hay que añadir la sentencia exit;
    exit;
}

Y así quedaría nuestro fichero CSV y PHP

Este sería nuestro código PHP al completo listo para generar ficheros CSV.

<?php
//Función para conectarnos con la BBDD 
function conectar(){
    // Rellenamos todos los datos para conectarnos a la BBDD
    $x=new mysqli(
        "", // URL
        "", // Usuario
        "", // Clave
        "" // Nombre 
    );
    //En caso de haber un error de conexión a la BBDD...
    if ($x->connect_errno){
        //Salimos de la conexión con el error
        die ("Error: ".$x->mysqli_connect_errno().$x->mysqli_connect_error());
        exit(); 
    }
return $x;
}
//Nos conectamos a SQL
$c=conectar();

// Creamos la consulta que va a compartir la visualización en PHP y en CSV
$consulta=$c->query("SELECT idtienda,nombre,direccion FROM tiendas order by idtienda desc limit 3 ");

//Si hemos pulsado al botón de Exportar a Excel (CSV)...
if(isset($_POST["exportarCSV"])) {
    if(!empty($consulta)) {
        //El nombre del fichero tendrá el nombre de "usuarios_dia-mes-anio hora_minutos_segundos.csv"
        $ficheroExcel="usuarios ".date("d-m-Y H_i_s").".csv";
        
        //Indicamos que vamos a tratar con un fichero CSV
        header("Content-type: text/csv");
        header("Content-Disposition: attachment; filename=".$ficheroExcel);
        
        // Vamos a mostrar en las celdas las columnas que queremos que aparezcan en la primera fila, separadas por ; 
        echo "idtienda;nombre;direccion\n";    
            
        // Recorremos la consulta SQL y lo mostramos
        while($cliente=$consulta->fetch_array()){
                echo $cliente['idtienda'].";";
                echo $cliente['nombre'].";";
                echo $cliente['direccion']."\n";
        }                
    }else{
        echo "No hay datos a exportar";
    }
    //Para que se cree el Excel correctamente, hay que añadir la sentencia exit;
    exit;
}
?>
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <form action="<?php echo $_SERVER[“PHP_SELF”]; ?>" method="post">
            <button type="submit" id="export_data" name="exportarCSV" value="Export to excel" class="btn btn-info">Exportar a Excel (CSV)</button>
        </form>
        <table>
            <thead>
                <tr>
                    <th>DNI</th>
                    <th>Nombre</th>
                    <th>Apellidos</th>
                    <th>Teléfono</th>
                    <th>Email</th>
                </tr>
            </thead>
            <tbody>    
                <?php
                while($cliente=$consulta->fetch_array()){
                    echo '<tr>';
                        echo '<td>'.$cliente['idtienda'].'</td>';
                        echo '<td>'.$cliente['nombre'].'</td>';
                        echo '<td>'.$cliente['direccion'].'</td>';
                        echo '<td></td>';
                        echo '<td></td>';
                    echo '</tr>';
                }
                ?>
            </tbody>
        </table>
    </body>
</html>

Y el aspecto visual de nuestro código PHP al pulsar el botón de “Exportar a Excel (CSV)

Exportar registros SQL a Excel (CSV) con PHP

Alfredo

Desarrollador web de profesión (.NET, jQuery, JavaScript y SQL Server). Amante del fútbol y los videojuegos. Escribo en este blog sobre temas de programación que me parecen interesantes y que quiero compartir con todo el mundo.

También te podría gustar...

2 Respuestas

  1. Natacha dice:

    Por qué puede ser que no funcione? esta todo perfecto, pero al momento de exportar me lleva a una pagina que dice que la pagina no existe, no se por qué puede ser. tampoco me descarga el archivo excel. Todo raro. que problema puedo tener? la pagina tiene que estar necesariamente subida para que se descargue el archivo? gracias!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies
A %d blogueros les gusta esto: