Exportar SQL a CSV (Excel) en PHP

Facebook
Twitter
LinkedIn
WhatsApp

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 SQL a CSV (lo podemos abrir con Excel) 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 SQL a CSV con PHP.

Existen librerías desarrolladas en PHP que podemos exportar SQL a CSV o a Excel , ya hablaremos de ellas posteriormente en otro POST. Lo que vamos a hacer es generar un fichero Excel, con la extensió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;

exportar sql a csv
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 SQL a CSV (Excel) y la tabla para mostrar los registros.

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 exportar SQL a 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

Este sería nuestro código PHP para poder exportar SQL a 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)

SQL a Excel con PHP
Exportar registros SQL a CSV con PHP

¿Te ha gustado el artículo?

Te recomendamos que eches un vistazo a los siguientes artículos relacionados con PHP , te podrán servir de gran ayuda 😉

Facebook
Twitter
LinkedIn

4 comentarios en “Exportar SQL a CSV (Excel) en PHP”

  1. 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!

  2. Hola, gracias por tu aporte, me funcionó, sólo hay un detalle que no entiendo, revisé el FTP y se generó un error_log que dice lo siguiente:

    PHP Warning: Use of undefined constant “PHP_SELF” – assumed ‘“PHP_SELF”’ (this will throw an Error in a future version of PHP) in line 58

    Y la línea 58 es donde está el form action:
    <form action="» method=»post»>

    Espero que puedas aclarar mi duda, gracias!!

    1. Buenos días Isabel,

      Tienes un error en las dobles comillas del action y del method, hay que poner las dobles comillas sin la cursiva.

      Espero haberte resuelto el error.

      Un saludo.

Deja un comentario

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

Scroll al inicio