¿Cómo importar un archivo de Excel a una base MySQLi?
Muchas veces necesitamos de manera simple, volcar el contenido de un archivo Excel (.xls, xlsx) a una tabla Mysql.
Podemos hacerlo directamente con un formulario HTML con un poco de código PHP y la inclusión de una útil libreria, en realidad la que hace todo el trabajo es la librería, tampoco le vamos a sacar el mérito.

Les comparto lo que utilicé para rápidamente volcar miles de registros a una tabla en MySQLi.
<?php //Formulario de importacion de archivo .xls a base de datos Mysql o Mysqli //Conexion con la base de datos //mysqli_connect("localhost",$usuario,$clave,$nombreBase); $conn = mysqli_connect("localhost","root","","pintureria"); //incluir las librerias //Bajalas desde : //https://github.com/nuovo/spreadsheet-reader require_once('vendor/php-excel-reader/excel_reader2.php'); require_once('vendor/SpreadsheetReader.php'); if (isset($_POST["import"])) { //filtrar solo los archivos que quiero importar, .xls, xlsx en este caso // de la familia de Excel $allowedFileType = ['application/vnd.ms-excel','text/xls','text/xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']; if(in_array($_FILES["file"]["type"],$allowedFileType)){ //carpeta temporal donde copio los archivos a importar $targetPath = 'uploads/'.$_FILES['file']['name']; move_uploaded_file($_FILES['file']['tmp_name'], $targetPath); $Reader = new SpreadsheetReader($targetPath); $sheetCount = count($Reader->sheets()); for($i=0;$i<$sheetCount;$i++) { $Reader->ChangeSheet($i); //aqui viene la magia de hacer el volcado para cada registo foreach ($Reader as $Row) { // obtengo el campo correspondiente $clasificacion_id = ""; if(isset($Row[0])) { $clasificacion_id = mysqli_real_escape_string($conn,$Row[0]); } $denominacion = ""; if(isset($Row[1])) { $denominacion = mysqli_real_escape_string($conn,$Row[1]); } $domicilio = ""; if(isset($Row[2])) { $domicilio = mysqli_real_escape_string($conn,$Row[2]); } $ciudad = ""; if(isset($Row[3])) { $ciudad = mysqli_real_escape_string($conn,$Row[3]); } $provincia = ""; if(isset($Row[4])) { $provincia = mysqli_real_escape_string($conn,$Row[4]); } $telefono = ""; if(isset($Row[5])) { $telefono = mysqli_real_escape_string($conn,$Row[5]); } //si tengo datos en el registo, procedo a la inserción de la tabla // aqui solo verifico los 2 primeros campos, puedo obviar o verificar mas condiciones if (!empty($clasificacion_id) || !empty($denominacion)) { $query = "INSERT INTO distribuidores (clasificacion_id, denominacion, domicilio, ciudad, provincia, telefono) values('".$clasificacion_id."', '".$denominacion."','".$domicilio."','".$ciudad."','".$provincia."','".$telefono."')"; $result = mysqli_query($conn, $query); if (! empty($result)) { $type = "success"; $message = "El archivo con formato Excel ha sido importado correctamente a la base de datos."; } else { $type = "error"; $message = "Ups! Hubo un problema immportando el archivo con formato Excel."; } } } } } else { $type = "error"; $message = "Intentó subir un Tipo de archivo no valido."; } } ?> <!DOCTYPE html> <html> <head><title>Importar archivo Excel a una base de datos Mysql usando PHP</title> <link rel='stylesheet' href='estilo.css' type='text/css' media='all' /> </head> <body> <h2>Importar archivo Excel a una base de datos Mysql usando PHP</h2> <div class="outer-container"> <form action="" method="post" name="frmExcelImport" id="frmExcelImport" enctype="multipart/form-data"> <div> <label>Seleccionar archivo a importar</label> <input type="file" name="file" id="file" accept=".xls,.xlsx"> <button type="submit" id="submit" name="import" class="btn-submit">Importar</button> </div> </form> </div> <div id="response" class="<?php if(!empty($type)) { echo $type . " display-block"; } ?>"><?php if(!empty($message)) { echo $message; } ?></div> <?php //hago un listado para mostrar datos de la tabla //ademas me sirve para verificar que la conexión con la base haya sido exitosa //en caso que tenga datos la tabla los mostrara aqui. $sqlSelect = "SELECT * FROM distribuidores"; $result = mysqli_query($conn, $sqlSelect); if (mysqli_num_rows($result) > 0) { ?> <table class='tutorial-table'> <thead> <tr> <th>Clasificacion</th> <th>Denominacion</th> <th>Domicilio</th> <th>Ciudad</th> <th>Provincia</th> <th>Telefono</th> </tr> </thead> <?php // puedo agregar todos las columnas que necesite while ($row = mysqli_fetch_array($result)) { ?> <tbody> <tr> <td><?php echo $row['clasificacion_id']; ?></td> <td><?php echo $row['denominacion']; ?></td> <td><?php echo $row['domicilio']; ?></td> <td><?php echo $row['ciudad']; ?></td> <td><?php echo $row['provincia']; ?></td> <td><?php echo $row['telefono']; ?></td> </tr> <?php } ?> </tbody> </table> <?php } ?> </body> </html>
Descargar el código completo desde aquí, (incluida la librería): importar_excel_a_mysql_usando_php
Ahora si solo querés la libreria Spreed Sheet Reader la podés descargar desde Github
Cualquier duda que tengas, escribime, contactame y trataremos de hacerlo funcionar.
Saludos.
@alejus
Hola alejus,
El ejemplo funciona perfecto, pero si el excel a importar tiene 50 colunas y 7000 filas, tarda muchísimo y cuando lleva 2000 filas da error del nginx. ¿Alguna idea?