Importar datos de Excel a base de datos de MySQL usando PHP
Ya vimos cómo exportar datos de MySQL a un libro de Excel. Ahora haremos el proceso inverso: a partir de un archivo de Excel leer algunas hojas y poner sus datos dentro de nuestra base de datos de MySQL.
Digo muy en serio que vamos a hacer el proceso inverso, porque usaré la misma base de datos que en el post anterior así que recomiendo leerlo antes.
Descripción del proyecto
Vamos a leer un archivo de Excel con el lenguaje de programación PHP y una librería llamada PHPSpreadSheet; leeremos las hojas del archivo (que deben seguir un estilo) e insertaremos cada fila.
La estructura de la base de datos es esta:
El documento que vamos a importar es el que se ve en la captura, y que puedes analizar a gusto en mi Google Drive.

Sí sí, ya sé que se parece muchísimo al que hicimos en el de exportar los datos, pero el punto no es ese. Además, aquí está formateado y creado con el software propietario de Microsoft.
Nota: ya sé que la existencia no se debería formatear como dinero, se me pasó esa parte pero igualmente no afecta al post.
Repositorio en GitHub
Puedes explorar el código o hacerle un fork desde el repositorio oficial. Si hay actualizaciones igualmente las pondré ahí.
Posts que recomiendo que leas
Aquí suponemos que el archivo está en la ruta en donde se ejecuta el script, pero si deseas que el usuario proporcione el Excel (yo no lo recomendaría, pero allá tú, sobre todo por eso de la seguridad) mira cómo subir un archivo con PHP.
También dejo la lista de posts que de alguna manera son la base de esto que expongo, o tienen alguna relación:
- Leer archivo de Excel con PHPSpreadSheet y PHP
- Conectar PHP y MySQL
- Parte 2 de PHP con MySQL: cursores y comprobar si valor existe
- Crear archivo de Excel con PHPSpreadSheet y PHP
- Sintaxis corta de Arrays en PHP
Conectar a la base de datos
Usaré el fragmento que se ve en el tutorial de MySQL:
Vamos a hacer múltiples inserts, así que la sentencia de PDO será preparada antes del ciclo. También se hará uso de las transacciones para que el rendimiento se vea mejorado.
Abrir archivo y acceder a las hojas
El archivo de Excel se abre con el siguiente código:
Para obtener determinada hoja se accede a ella a través de $documento->getSheet($numero)
. En este caso la primer hoja guarda los productos y la segunda los clientes.
Leer el contenido de cada hoja
Una vez que tenemos la hoja, podemos leer todo su contenido e ir insertando cada valor en la base de datos.
Ya dentro del ciclo podemos obtener el valor dependiendo de la fila en la que vamos, obteniendo cada columna por separado. Ahí mismo ejecutamos la sentencia y le pasamos los valores; esto es para prevenir inyecciones SQL.
Cuando el ciclo termine (bueno, cuando los ciclos para importar ambas hojas terminen) hacemos el commit de la base de datos. Este paso es muy importante, puesto que si no, todo lo que insertamos no se guardará.
$bd->commit();
Con eso aseguramos que los insert sean rápidos, sin afectar el rendimiento ni la seguridad. Oh, por cierto, comenzamos en la fila 2 porque la 1 tiene el encabezado.
Poniendo todo junto
Una vez que ya explicamos paso por paso el código para copiar datos de Excel a MySQL es hora de ver cómo queda el script de PHP final:
El script de la base de datos lo dejé más arriba. Recuerda que la parte de la instalación de PHPSpreadSheet está en el post que dejé arriba.
Demostración: importar desde Excel a MySQL
Adjunto una imagen GIF para demostrar que el proceso realmente funciona.

¿Por qué no importar cualquier archivo?
Si te das cuenta, estamos dependiendo mucho de la estructura del archivo Excel. Es decir, no leemos todas las hojas ni importamos a ciegas.
Esto es porque no se debería confiar en datos proporcionados por usuario, si dejamos que importe cualquier número de hojas que se convierten a tablas podríamos tener una seria vulnerabilidad.
Conclusiones
Podríamos hacer miles de cosas más con PHPSpreadSheet, espero tener el tiempo para escribir más sobre el tema.
Como referencia dejo esta página que tiene que ver con la documentación oficial del paquete.
Te invito a leer más sobre:
No olvides seguirme para estar al tanto de mis actualizaciones