¿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]
<?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>
[/php]
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?