En este tutorial aprenderemos cómo importar un Excel a MySQL con PHP. Para lograr leer el archivo Excel de manera adecuada utilizaremos una extensión PHP llamada SimpleXLSX y generaremos un código adecuado el cual se encargue de guardar la data en una base de datos MySQL.
Antes de comenzar, debemos saber qué es XLSX. XLSX es un formato de archivo usualmente asociado con hojas Excel. Fue introducido por Microsoft junto con el programa Excel 2007. Está basado en XML lo cual facilita la transferencia de información entre aplicaciones. Un archivo XLSX guarda la información de las hojas en celdas. Las celdas son contenidas en filas y columnas las cuales pueden tener diferentes propiedades como estilo, alineación, etc.
En resumen, XLSX es realmente un archivo comprimido el cual contiene múltiples archivos XML los cuales todos contienen información relevante sobre la hoja Excel.
Existen múltiples formas de leer un archivo XLSX con PHP. Como fue mencionado anteriormente, un arcihov XLSX está basado en archivos XML dentro de un ZIP.
Se necesita extraer los archivos del ZIP y leerlos de manera adecuada con un lector XML. Podríamos crear nuestro propio lector XML. No obstante, resulta más fácil utilizar un lector ya creado especializado en leer este tipo de archivos. En este caso, existen algunas extensiones populares las cuales son las siguientes:
- Spreatsheet Excel Reader
- PHPExcel
- SimpleXLSX
En este caso, nos concentraremos en el uso de SimpleXLSX y cómo utilizarlo para leer archivos XLSX e importar aquella data a una base de datos MySQL. Utilizando esta extensión podremos obtener la data del archivo XLSX en filas.
Para comenzar, empezaremos importando la librería en un nuevo archivo PHP de la siguiente forma:
include 'simplexlsx.class.php';
Una vez importada la librería vamos a crear una nueva instancia SimpleXLSX del archivo que queremos leer. Esto lo almacenaremos en una variable $xlsx.
$xlsx = new SimpleXLSX( 'usuarios.xlsx' );
Antes de empezar la lectura nos conectaremos a la base de datos mediante el uso de PDO. En este caso haremos la conexión de la siguiente manera (dependerá de qué conexión desean utilizar).
$conn = new PDO( "mysql:host=localhost;dbname=mibasededatos", "usuario", "clave"); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Una vez conectados, crearemos la consulta para insertar la información. Para esto, asumiremos que nuestro archivo usuarios.xlsx tiene 4 campos diferentes en el siguiente orden: Nombre, Usuario, Email, Password. Así mismo, nuestra base de datos también contendrá aquellos campos donde insertaremos la información que iremos recolectando.
$stmt = $conn->prepare( "INSERT INTO users (nombre, usuario, email, password) VALUES (?, ?, ?, ?)");
Luego haremos la vinculación de las variables (que por ahora se encuentran vacías) con cada uno de los diferentes campos de nuestra base de datos.
$stmt->bindParam( 1, $nombre); $stmt->bindParam( 2, $usuario); $stmt->bindParam( 3, $email); $stmt->bindParam( 4, $password);
Luego de hacer la vinculación, debemos empezar a leer el archivo línea por línea. Esto lo lograremos mediante un bucle foreach de la siguiente forma. En cada iteración, leeremos cada una de las filas del archivo y ejecutaremos la consulta previamente creada.
foreach ($xlsx->rows() as $fields) { $nombre = $fields[0]; $usuario = $fields[1]; $email = $fields[2]; $password = $fields[3]; $stmt->execute(); }
Con esto, hemos logrado leer cada fila del archivo Excel y luego ejecutado la inserción a la base de datos MySQL mediante $stmt->execute().
Una vez finalizados los pasos, el archivo resultante debe tener la siguiente estructura y código:
<?php include 'simplexlsx.class.php'; $xlsx = new SimpleXLSX( 'usuarios.xlsx' ); $conn = new PDO( "mysql:host=localhost;dbname=mibasededatos", "usuario", "clave"); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare( "INSERT INTO users (nombre, usuario, email, password) VALUES (?, ?, ?, ?)"); $stmt->bindParam( 1, $nombre); $stmt->bindParam( 2, $usuario); $stmt->bindParam( 3, $email); $stmt->bindParam( 4, $password); foreach ($xlsx->rows() as $fields) { $nombre = $fields[0]; $usuario = $fields[1]; $email = $fields[2]; $password = $fields[3]; $stmt->execute(); } ?>
3 Comments
Si no utilizo conexión pdo. Cómo lo hago?
bueno
Funciono correctamente la rutina, muchas gracias