¿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.

Importar .xls a Mysql con PHP

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

 

por Alejus

Un comentario en «Importar archivo xls a Mysql usando PHP»
  1. 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?

Deja una respuesta

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