Exportador e Importador CSV

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (8 votos, promedio: 4,50 de 5)
Loading ... Loading ...

En muchas ocasiones cuando trabajamos con aplicaciones Web programadas a medida que se alimentan de bases de datos no es fácil para los usuarios o clientes actualizar su contenido si no se dispone de una administración exclusiva para ello.

En este artículo vamos a ver o aprender como programar un importador/exportador de la base de datos a un archivo .csv y viceversa con PHP.

Lo vamos a ver mediante un ejemplo en el cual vamos a querer importar o exportar los siguientes campos: id, nombre, apellidos, email y puntos.

Necesitaremos crear una base de datos y dentro una tabla con el nombre de “usuarios” por ejemplo añadiéndole estos campos. Podemos ver una visualización de la tabla en PHPMyAdmin que necesitaremos en este ejemplo:

Una vez tengamos ubicada nuestra tabla en una base de datos podemos empezar a programar la aplicación. En la siguiente imagen vamos a ver como quedará la aplicación visualmente.

Tal y como vemos en la imagen, la aplicación o módulo contiene 3 partes bien diferenciadas. Por un lado, tenemos el importador del archivo .csv el cual espera que se selecciona del PC y tras pulsar en el botón “upload” proceder a realizar la importación a la base de datos.

En segundo lugar mostramos un botón para obtener una exportación de la base de datos al archivo .csv. En este caso, generamos el archivo .csv con los datos deseados.

Y por último, mostramos una tabla con la información de los usuarios que hay actualmente en la base de datos.

Para disponer de este importador/exportador PHP necesitaremos crear un archivo .php donde en el <body> vamos a implantar toda esta estructura HTML. Tendremos un contenedor centro con 3 fieldsets.

En el primer fieldset tendremos el importador:

<fieldset>
    <legend>Importador de usuarios</legend>
    <?php if (!empty($message_import)) echo $message_import; ?>
    <form enctype="multipart/form-data" method="POST" action="index.php">
        <label>Selecciona un archivo .csv </label>
        <input type="file" name="file">
        <input type="submit" value="Upload" name="submitFileUpload">
    </form>
</fieldset>

En el segundo fieldset el exportador:

<fieldset>
    <legend>Exportar de Usuarios</legend>
    <form method="post" action="index.php">
        <input type="submit" value="Export .CSV file" name="submitExport">
        <?php if (!empty($message_export)) echo $message_export; ?>
    </form>
</fieldset>

Y en el tercer fieldset la tabla que muestra la información disponible o almacenda actualmente:

<fieldset>
    <legend>Usuarios registrados</legend>
    <table width="490px" cellpadding="0" cellspacing="5">
        <tr>
            <td>ID</td>
            <td>Nombre</td>
            <td>Apellido</td>
            <td>Email</td>
            <td align="right">Puntos</td>
        </tr>
           <?php
        $result = $conexion->query("SELECT `id_user`, `name`, `lastname`, `email`, `points` FROM `TU_TABLA` ORDER BY points DESC");
        if ($result->num_rows > 0) {
            while ($row_users = $result->fetch_assoc()) {  
                echo '<tr>';
                echo '<td>'.$row_users['id_user'].'</td>';
                echo '<td>'.$row_users['name'].'</td>';
                echo '<td>'.$row_users['lastname'].'</td>';
                echo '<td>'.$row_users['email'].'</td>';
                echo '<td align="right">'.$row_users['points'].'</td>';
                echo '</tr>';
            }
        }       
        ?>        
    </table>
</fieldset>

Ahora, por encima de cualquier etiqueta HTML añadiremos las tags de código PHP “<?php … ?>” y desarrollaremos allí mismo el código que controlará la importación y la exportación.

Lo primero que haremos será conectar con la base de datos utilizando para ello una clase que nos facilita PHP (msqli) que nos servirá también para generar query’s.

$conexion = new mysqli(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);

El código que controlará la exportación será el siguiente:

if(isset($_POST['submitExport'])) {

    $fp = fopen("import/users.csv","w");
    $separador = ";";

    $linea = 'id_user'.$separador.'name'.$separador.'lastname'.$separador.'email'.$separador.'points'."\n"; 
    fwrite($fp, $linea);

    $result = $conexion->query("SELECT `id_user`, `name`, `lastname`, `email`, `points` FROM `TU_TABLA` ORDER BY points DESC");
    if ($result->num_rows > 0) {
        while ($row_users = $result->fetch_assoc()) {                
            $linea = $row_users['id_user'].$separador.$row_users['name'].$separador.$row_users['lastname'].$separador.$row_users['email'].$separador.$row_users['points']."\n"; 
            fwrite($fp, $linea);
        }
    }

    $message_export = '<p><a href="import/users.csv"><b>Ver usuarios .csv</b></a></p>';

    fclose($fp);    
}

En este caso, si pulsamos en el botón de exportación procedemos a abrir un archivo en modo escritura el cual vamos escribiendo linea a linea el contenido que tenemos en la tabla de la base de datos y al finalizar mostramos un link para acceder al archivo generado.

Y el código que controla la importación es el siguiente:

if (isset($_POST['submitFileUpload'])) {

    $file_import = 'import/'.$_FILES['file']['name'];

    if ($_FILES["file"]["type"] == "text/comma-separated-values") {
        if (@move_uploaded_file($_FILES['file']['tmp_name'], $file_import)) {
            $fp = fopen($file_import, 'r');
            $contador = 0;
            $users_edited = 0;
            $users_added = 0;
            while (($data = fgetcsv($fp, 9999, ";")) !== FALSE) {
                if ($contador > 0) {
                    if (empty($data[0])) {
                        $insert = "INSERT INTO `users` (`name`, `lastname`, `email`, `points`) 
                        VALUES ('".$data[1]."', '".$data[2]."', '".$data[3]."', ".$data[4].")";
                        $conexion->query($insert);
                        $users_added++;
                    }
                    else {
                        $update = "UPDATE `users` SET `name`='".$data[1]."', `lastname`='".$data[2]."', `email`='".$data[3]."', `points`=".$data[4]." WHERE id_user=".$data[0];
                        $conexion->query($update);
                        $users_edited++;
                    }
                }
                $contador++;
            }
        }
        $message_import = '<p>La importacion se ha realizado con exito!<br/>Se han actualizado '.$users_edited.' registros.<br/>Se han insertar '.$users_added.' usuarios nuevos.</p>';
    }

    else {
        $message_import = '<p>El archivo subido no es correcto!</p>';
    }
}

La importación es algo más compleja pero si se mira con detalle verás que no es nada del otro mundo. En este caso, si se quiere realizar una importación del archivo .csv a la base de datos, obtenemos el archivo que se quiere subir y comprobamos que sea tipo .csv. De este modo, cualquier otro archivo que se intente subir será denegado.

Si se trata de un archivo .csv se procede a subir el archivo al servidor con la función PHP “move_uploaded_file()”, lo abrimos y lo recorremos leyendo su contenido con la función especial solo para archivos .csv “fgetcsv()”.

Fíjate que dentro del bucle estamos realizando una comprobación importante que representa las 2 formas de importar. Podremos importar para machacar o modificar y para añadir nuevos. Entonces, si queremos añadir nuevos usuarios conviene dejar vacío el primer campo del .csv, la id para que el script lo interprete con nuevo usuario. Los que tengan id y exista en la tabla “TU_TABLA” serán actualizados en la base de datos.

13 comentarios para “Exportador e Importador CSV

Deja un comentario

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

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>