Pasos para leer un archivo excel/.csv con PHP y almacenarlo en nuestra base de datos

Vamos a ver cómo transformar un archivo Excel en un archivo .csv para poder leerlo desde nuestra aplicación usando PHP y así poderlo almacenar en nuestra base de datos.

La estructura que vamos a usar para nuestra plantilla en Excel es usar la primera línea para poner el título de nuestros campos como por ejemplo Nombre, edad y profesión y el resto de líneas se corresponderá a los datos que deseemos insertar.

La primera línea haremos que no se lea porque contiene los títulos como veremos más adelante.

Creamos el archivo .csv para cargarlo en nuestra aplicación mediante PHP

Comencemos por el principio, abrimos un documento Excel y completamos la primera línea con los títulos de la columna y después rellenamos las siguientes líneas con los datos que deseemos cargar en la base de datos.

Estructura excel datos

A la tabla se le puede añadir efectos visuales como colores, eso no nos condicionará a la hora de trabajar.

Ahora deberemos de guardar nuestra Excel en formato .csv, para ello pulsamos archivo/guardar como/examinar/CSV (Delimitado por comas).

Una vez tengamos nuestro archivo guardado podemos abrirlo con un editor de texto como el bloc de notas y veremos lo siguiente:

Archivo csv datos

Ya tenemos nuestro archivo preparado, como vemos la primera línea no se va a leer, aunque más adelante explicaré también cómo hacer que también lea la primera línea por si no queremos ponerle títulos a las columnas.

Leemos los datos del archivo .csv con el siguiente código en PHP

Ahora pasamos al código de nuestra aplicación, para comenzar explicaré que se va a trabajar sobre dos archivos, el primero será donde se suba nuestro archivo.csv mediante un formulario y el segundo será el que reciba el archivo.csv y se encargue de leerlo y guardarlo en nuestra base de datos, para este ejemplo usaremos MySQL.

Código del formulario:

<form action="importar.php" enctype="multipart/form-data" method="post">
   <input id="archivo" accept=".csv" name="archivo" type="file" /> 
   <input name="MAX_FILE_SIZE" type="hidden" value="20000" /> 
   <input name="enviar" type="submit" value="Importar" />
</form>

Seleccionamos nuestro archivo y le damos a enviar.

Recibimos nuestro archivo en importar.php.

Antes que nada deberemos conectarnos a una base de datos y comprobar que su conexión es correcta.

<?php
//obtenemos el archivo .csv
$tipo = $_FILES['archivo']['type'];
 
$tamanio = $_FILES['archivo']['size'];
 
$archivotmp = $_FILES['archivo']['tmp_name'];
 
//cargamos el archivo
$lineas = file($archivotmp);
 
//inicializamos variable a 0, esto nos ayudará a indicarle que no lea la primera línea
$i=0;
 
//Recorremos el bucle para leer línea por línea
foreach ($lineas as $linea_num => $linea)
{ 
   //abrimos bucle
   /*si es diferente a 0 significa que no se encuentra en la primera línea 
   (con los títulos de las columnas) y por lo tanto puede leerla*/
   if($i != 0) 
   { 
       //abrimos condición, solo entrará en la condición a partir de la segunda pasada del bucle.
       /* La funcion explode nos ayuda a delimitar los campos, por lo tanto irá 
       leyendo hasta que encuentre un ; */
       $datos = explode(";",$linea);
 
       //Almacenamos los datos que vamos leyendo en una variable
       //usamos la función utf8_encode para leer correctamente los caracteres especiales
       $nombre = utf8_encode($datos[0]);
       $edad = $datos[1];
       $profesion = utf8_encode($datos[2]);
 
       //guardamos en base de datos la línea leida
       mysql_query("INSERT INTO datos(nombre,edad,profesion) VALUES('$nombre','$edad','$profesion')");
 
       //cerramos condición
   }
 
   /*Cuando pase la primera pasada se incrementará nuestro valor y a la siguiente pasada ya 
   entraremos en la condición, de esta manera conseguimos que no lea la primera línea.*/
   $i++;
   //cerramos bucle
}
?>

Espero que el artículo os guste, realmente para algunas aplicaciones puede ser muy útil guardar información desde una excel, esto nos puede ahorrar mucho tiempo de trabajo. Hemos explicado el caso con MySQL pero no habría problemas en usar otras base de datos como Oracle o PostgreSQL.

Iván Martínez

Ingeniero Informático apasionado por el mundo del desarrollo WEB. Me gusta caminar por este mundo lleno de tecnologías y día a día aprender cosas nuevas como el doctor Frankenstein ¡dadme cosas para experimentar!

77 comentarios sobre “Pasos para leer un archivo excel/.csv con PHP y almacenarlo en nuestra base de datos

  • el Ene 15, 2016 a las 3:11 pm
    Permalink

    Hola buen día.
    Necesito hacerle una consulta referido al artículo.

    Si leo o recorro un Array(); y dentro del mismo hay elementos vacíos o nulos…
    Y antes de impactar en la table de mi BDs…
    Cómo puedo reemplazar esos valores por algo que sea válido como para que al hacer el INSERT en la BDs no me genere registros vacíos o «basura»… por así decirlo ???
    Muy buen post.
    Un saludo cordial.

    Respuesta
    • el Ene 15, 2016 a las 5:49 pm
      Permalink

      Hola Pablo, si lo que quieres es que al insertar los elementos del array no se inserten vacios tendrás que comprobar cuando leas del archivo .csv y almacenes en una variable si esa variable está vacia, por ejemplo si obtengo $nombre = trim($datos[0]); después compruebo si está vacio de la siguiente forma:
      $nombre = trim($datos[0]);
      if (empty($nombre)) //significa si está vacio
      {
      //aquí dentro le das el valor que desees
      $nombre = «Sin nombre»
      }

      Saludos!

      Respuesta
      • el Ene 19, 2016 a las 1:57 pm
        Permalink

        Buen día Iván.

        Muchas gracias por la ayuda.
        Me sirvió de mucho el ejemplo y funciona perfectamente.

        Muchas gracias

        Respuesta
        • el Abr 12, 2016 a las 3:34 am
          Permalink

          hola pablo a mi no me sirvio podrias explicarme o ´pasarme lo que hiciste

          Respuesta
          • el May 17, 2016 a las 11:25 pm
            Permalink

            Que probaste laura? Asi es mas simple ayudarte. Saludos.

  • el Ene 21, 2016 a las 1:18 am
    Permalink

    Gracias muy buen aporte pero tengo una pregunta
    ¿Como funcionaria para actualizar los datos?

    Respuesta
    • el Ene 22, 2016 a las 10:22 pm
      Permalink

      Hola, para actualizar los datos en vez de insertarlos deberías suprimir la sentencia SQL de insertar (INSERT) por una sentencia SQL para actualizar (UPDATE).

      La sentencia UPDATE deberá tener una o más condiciones, osea incluir un WHERE para obtener la fila (tupla) de datos que queramos actualizar.

      En la condición tendrás que tener en cuenta si cada fila tiene un identificador único (clave primaria), por ejemplo lo ideal sería en el caso prático del artículo añadir un nuevo campo que fuera DNI, este DNI sería único por usuario, entonces más o menos la sentencia quedaría de la siguiente forma:

      UPDATE nombre_tabla
      SET nombre=$nombre, edad=$edad, profesion = $profesion
      WHERE DNI=$DNI;

      Saludos!

      Respuesta
  • el Ene 22, 2016 a las 6:16 am
    Permalink

    hola inge disculpe a la hora de cargar el archivo se queda en blanco todo y verifico en mi base de datos y no inserto nada que se debe ya le intente y todo pero no se que pueda pasar espero me pueda ayudar

    Respuesta
    • el Ene 23, 2016 a las 2:38 pm
      Permalink

      Hola Jose, no puedo decirte exactamente porque no te funciona ya que no tengo tu código delante pero mi consejo es que vayas poco a poco para detectar donde se produce el fallo.

      El código del artículo se puede dividir en dos partes, la primera es la recogida de datos y la segunda el INSERT, como no sabes que parte es la que falla primero haría las siguientes comprobaciones.

      Primero comprobamos que se este leyendo correctamente del archivo .csv que intentamos subir, para ello después de recoger la variable, por ejemplo $nombre = trim($datos[0]); incluimos un echo $nombre; o print_r($nombre); para comprobar si realmente contiene algun valor o esta vacia.

      En el caso que esté vacia deberás comprobar la parte de lectura y almacenamiento en variables a partir de tu documento .csv, por el contrario si todas las variables que recoges están llenas tendrás que fijarte si tu sentencia INSERT está bien planteada y la base de datos además esté bien conectada.

      De todas maneras aunque funcione correctamente por pantalla no se visualiza nada, para evitar esto siempre puedes incluir mensajes informativos para evitar la pantalla en blanco, realizar un echo de las filas que se lean o volver a otra página de tu Web una vez finalice el INSERT con la función header como : header(‘Location: paginaRegreso.php’);

      Saludos!

      Respuesta
    • el Abr 14, 2016 a las 11:57 pm
      Permalink

      Jose luis el error esta aqui.. ‘$nombre,’$edad ‘,’$profesion ‘ la variable $nombre le falta una comilla simple por eso se te queda en blanco y no hace la inserción

      Respuesta
      • el Abr 15, 2016 a las 12:05 am
        Permalink

        Gracias por avisar del error, ya está corregido, un saludo!

        Respuesta
  • el Feb 16, 2016 a las 4:21 pm
    Permalink

    Gracias Ingeniero Iván Martínez, eres muy gentíl por compartir el contenido, realmente me ha servido mucho.
    De lo que pude encontrar en el código te comento que es:
    1. De fácil lectura.
    2. De fácil implementación.
    3. Se acondiciona fácil sin importar el número de filas que tenga el archivo de excel.
    4. El query de inserción se puede ejecutar muy rápido.
    5. Las condiciones expuestas permiten implementar opciones de validación muy rápidamente.

    Agradezco el aporte.

    Un saludo desde Bogotá – Colombia.

    Respuesta
    • el Feb 16, 2016 a las 10:20 pm
      Permalink

      Hola, gracias a ti por el comentario, un saludo!

      Respuesta
  • el Abr 12, 2016 a las 3:38 am
    Permalink

    Hola alguien me puede hacer el favor de mandarme los form, pues lo intente pero me sale este error
    Parse error: syntax error, unexpected ‘<' in C:\xampp\htdocs\prueba\importar.php on line 50

    Respuesta
    • el Abr 13, 2016 a las 11:14 pm
      Permalink

      Hola, sin ver el código es difícil ver exactamente el error pero te está dando un error de PHP, exactamente te da en el símbolo ‘<' , por lo tanto tienes que saber que en el documento importar.php únicamente se usa ese símbolo ( ‘<' ) para abrir el PHP y cerrarlo. Deduzco que has metido el código del formulario (HTML) también en el archivo PHP y eso causa el error, quizás tengo que explicarlo mejor en el artículo pero el código del formulario está en HTML y tiene que ir fuera del PHP y conforme está el ejemplo del artículo en otro archivo diferente. -Archivo 1 ( HTML ) -Archivo 2 ( PHP ) Saludos!

      Respuesta
    • el Ago 19, 2016 a las 8:32 pm
      Permalink

      es porque esta finalizado el php asi así 🙂

      Respuesta
  • el Abr 20, 2016 a las 4:54 am
    Permalink

    Hola,

    Estoy haciendo una prueba de carga con un archivo que tiene dos líneas, las cabeceras y los datos a incertar… Mi problema es que cuando hago el if($i != 0) me manda al else y el contador no aumenta a la segunda pasada, por lo tanto siempre entro al else.

    Me podrías ayudar por favor?

    Respuesta
  • el Abr 20, 2016 a las 10:05 pm
    Permalink

    Hola Luis, en el código del artículo no hay ningún else, sencillamente se inicializa al principio un contador a 0 (iniciarlo es importante que no se te olvide), después se lanza el bucle, como es la primera pasada no entrará al if($i != 0) ya que el contador es igual a 0, después del if siempre va a pasar por el incrementro del contador, por lo tanto siempre entrará en la segunda pasada ya que en la segunda pasada valdrá 2.
    Con la información que me has dado no puedo profundizar más en tu problema.

    Si necesitas ayuda consulta lo que quieras, saludos!

    Respuesta
  • el Abr 21, 2016 a las 6:51 pm
    Permalink

    pg_query(): Query failed: ERROR: invalid input syntax for type timestamp: "fechacrea" LINE 1: …’,’modifica el contenido ya creado’,’usuariocrea’,’fechacrea… ^

    Ingenierio mire el error que me sale me podria ayudar

    Respuesta
    • el Abr 22, 2016 a las 5:07 pm
      Permalink

      Hola, parece ser un error al insertar un campo fecha, cuando se trabaja con fechas hay que tener en cuenta varias cosas, primero como has declarado el tipo en el campo de tu tabla, puede ser tipo texto, tipo fecha…. partiendo de aquí si es tipo texto le puedes pasar cualquier cadena, fecha incluida, ahora bien si lo tienes definido como fecha tendrás que pasarle el formato correcto de fecha para que se almacena correctamente en tu base de datos, para ello utiliza la función date() de PHP. http://php.net/manual/es/function.date.php

      Saludos!

      Respuesta
  • el Jun 16, 2016 a las 1:58 am
    Permalink

    Ing. MUY EXCELENTE APORTE. Unas preguntas: 1). Qué nombre le doy al archivo csv para que me funcione exactamente con su código? 2). Ese nombre dado, en que parte del código va, o no se debe colocar? 3). Debo incluir en el código el script de conexión a la base de datos? 3). Imite al 100% todo su ejemplo para desde allí hacer lo mio. A la tabla en sql le llame «DATOS», como usted lo dice. Al archivo php le llamé «importar.php», como usted lo dice. 4). Al csv, usted no lo dice pero le he llamado «ejemplo.csv», con sus campos como usted menciona. Hago todo exactamente igual como su tutorial pero me da estos errores:
    Notice: Undefined index: archivo in C:\wamp\www\gestion6\pruebasinsertar\importar.php on line 8

    Notice: Undefined index: archivo in C:\wamp\www\gestion6\pruebasinsertar\importar.php on line 10

    Notice: Undefined index: archivo in C:\wamp\www\gestion6\pruebasinsertar\importar.php on line 12

    Warning: file(): Filename cannot be empty in C:\wamp\www\gestion6\pruebasinsertar\importar.php on line 15

    Warning: Invalid argument supplied for foreach() in C:\wamp\www\gestion6\pruebasinsertar\importar.php on line 21
    Por favor una ayuda.. millón de gracias… Juan C.

    Respuesta
  • el Jun 21, 2016 a las 5:38 pm
    Permalink

    Hola, te intento responder a algunas cosas:
    1 y 2- El nombre del archivo .php da igual como se llame pero se tiene que corresponder con el que declaras en el formulario HTML action=»importar.php» para saber a que archivo tiene que redirigirse.

    No te olvides de poner en el formulario lo siguiente:
    enctype=»multipart/form-data»
    Si no, no se podrá tratar el archivo .csv en importar.php.

    3-Al principio del archivo importar.php tienes que realizar la conexión a tu base de datos, si no fallará a la hora de insertar.

    Ves paso a paso para ver el error, primero comprueba que el archivo .csv lo recibe bien importar.php realizando print_r o echo sobre $archivotmp = $_FILES[‘archivo’][‘tmp_name’];

    Saludos.

    Respuesta
  • el Jul 21, 2016 a las 5:19 am
    Permalink

    Indiscutiblemente es muy bueno tu aporte, le estuve dando muchas vueltas para importar registros csv a mysql a través de php, y este codigo es fantastico….. Saludos y muchas gracias por compartir.

    Respuesta
    • el Jul 22, 2016 a las 10:09 pm
      Permalink

      De nada, me alegra que te sirva un saludo.

      Respuesta
    • el Ago 13, 2016 a las 9:54 pm
      Permalink

      Gracias por tu comentario Cristina, saludos!

      Respuesta
  • el Ago 17, 2016 a las 3:46 am
    Permalink

    muchas gracias es un buen aporte, todos los que había encontrado necesitaban de una librería externa
    realmente este tutorial me parece el mejor ya que realmente sabes como funciona.
    bueno muchas gracias (°-°)/

    Respuesta
  • el Ago 19, 2016 a las 8:38 pm
    Permalink

    Muuuuuuchas gracias Ivan, hace tiempo que estaba buscando esto y no lo podía implementar ya me estaba dando un gran dolor de cabeza, eres genial, el único error que me arrojo al principio fue el cierre del PHP que esta al revés, yo le agrege un mensaje de insertados correctamente jauajua es de mucha ayuda,

    Respuesta
  • el Sep 15, 2016 a las 8:19 pm
    Permalink

    Gracias Iván por este buen aporte que a mi me ha servido muchisimo.
    Pero tengo un pequeño problema, porque tengo que leer todos los archivos .csv de un directorio.¿Como lo puedo hacer?. Se agradecen sugerencias.

    Saludos

    Jose

    Respuesta
  • el Sep 17, 2016 a las 5:34 am
    Permalink

    Problema con las Ñ
    Estimado, al momento de cargar el archivo no muestra las Ñ, por ejemplo JORGE MUÑOZ, mi base de datos esta en UTF 8, ayudame por favor.

    Respuesta
    • el Sep 18, 2016 a las 1:43 pm
      Permalink

      Hola, prueba a usar esto con aquellos campos que tengan caracteres especiales: utf8_encode(string)

      Saludos.

      Respuesta
      • el Sep 19, 2016 a las 7:28 pm
        Permalink

        Muchas gracias, para todos los que no les muestre las Ñ tienen que agregar el siguiente código.

        //Almacenamos los datos que vamos leyendo en una variable
        $DNI_PERSONAL = trim($datos[0]);
        $NOMBRE_PERSONAL= trim($datos[1]);
        $AREA_PERSONAL = trim($datos[2]);
        $CARGO_PERSONAL = trim($datos[3]);

        $NOMBRE_PERSONAL = utf8_encode(«$NOMBRE_PERSONAL»);

        Respuesta
  • el Sep 26, 2016 a las 9:37 pm
    Permalink

    Hola ivan hasta ahora va todo bien tengo una duda, llego a la carga del .csv, pero cuando voy al segundo paso «importar.php» no puedo actualizar la tabla, como seria la conexion a la base de datos?, como se si estoy conectado y el problema esta en la query? soy super nuevo en esto y me darias una mano gigante.

    Muchas Gracias

    Respuesta
  • el Oct 10, 2016 a las 8:35 pm
    Permalink

    buenas ing gracias por ese ejemplazo quisiera agregar algo pero no logro como colocarlo. la idea va de la siguiente manera.

    1-Cuando un registro este mal que de error y no inserte nada en la BD.
    2-Que indique en que lugar da el error en este caso seria imprimiendo la variable del dato[0] como referencia y las otras variables que yo usare.

    alguna función que me ayude hacer esto?

    Respuesta
  • el Dic 5, 2016 a las 2:39 am
    Permalink

    Cargando archivo: prueba.csv Column count doesn’t match value count at row 1
    me sale un error como este

    Respuesta
  • el Ene 16, 2017 a las 8:07 pm
    Permalink

    Hola, tengo un problema luego de seleccionar el archivo en formato .csv, me sigue diciendo «no se eligió archivo», y nunca llego a importar.php, agradecería su ayuda

    Respuesta
  • el Ene 18, 2017 a las 6:11 pm
    Permalink

    Excelente aporte, muchas gracias me fue muy util.

    Respuesta
  • el Feb 1, 2017 a las 3:35 am
    Permalink

    ¿Algún consejo para cargar los datos desde un .csv sin conocer previamente el nombre y número de columnas?

    Saludos

    Respuesta
    • el Feb 7, 2017 a las 5:10 pm
      Permalink

      La cuestión es que tienes que relacionar de alguna manera los campos de tu archivo .csv y los campos de tu tabla de base de datos, si no tienes esa relación no se me ocurre nada, lo siento.

      Respuesta
  • el Feb 17, 2017 a las 9:18 pm
    Permalink

    tengo un error dice que supera los argumentos en el foreach, que puedo hacer?

    Respuesta
  • el Feb 27, 2017 a las 3:52 am
    Permalink

    Hola, tengo el siguiente problema: he seguido este tutorial y al momento de hacer click en el boton importar aparece la ventana importar.php en blanco, no registra en la base de datos.
    De antemano gracias!!

    Respuesta
    • el Mar 11, 2017 a las 11:04 am
      Permalink

      Tendrás algun error de PHP en el archivo importar.php.

      Respuesta
      • el May 11, 2017 a las 6:06 pm
        Permalink

        Buen dia, yo tengo el mimo inconveniente, segui todo al pie de la letra, cambie el nombre del archivo a archivo.csv, probé distintas formas de conexion a la base de datos, cambie de posición el «include («conexion.php»); » , -revise el codigo por todas partes, pero en definitiva me sale la pagina en blanco y no carga, revise bien la tabla desde phpmyadmin y cambie los valores de los campos, depronto podia ser eso, pero nada, le digo seleccionar archivo, luego importar y despues de eso todo queda en blanco, espero pueda ayudarme por favor, soy relativamente nuevo en esto, gracias

        Respuesta
        • el May 21, 2017 a las 1:45 pm
          Permalink

          1- Pon mensajes de aviso: print_r(«llego aquí»); y un die;
          2- Si no visualizas nunca tus mensajes se trata de un error de PHP
          3- Si visualizas tus mensajes ves siguiendo la traza de la ejecución viendo paso a paso si todo se realiza correctamente, usando también los: print_r(«llego aquí»); y un die;
          4- Quizás el archivo siempre se vea blanco por que al acabar al ejecución no existe retorno a ninguna parte y no hay ningún elemento que se muestre sobre la pantalla.

          Saludos.

          Respuesta
    • el Mar 11, 2017 a las 11:03 am
      Permalink

      Debes cambiar las correspondientes funciones de mysql (mysql_query…) por las quivalentes de postgresql.

      Respuesta
  • el Mar 14, 2017 a las 8:42 pm
    Permalink

    Ingeniero buen día, si me carga el archivo, pero el insert no lo realiza, no se si tendre algun error:
    $datos = explode(«,»,$linea);

    $id = trim($datos[0]);
    $boletaNo = trim($datos[1]);
    $contenedor = trim($datos[2]);
    $prefijo = trim($datos[3]);
    $noprefijo = trim($datos[4]);
    $no = trim($datos[5]);
    $nobarco = trim($datos[6]);

    //Ejecutu el insert
    $dd = «INSERT INTO custodios_cobro_import (
    id,
    boletaNo,
    contenedor,
    prefijo,
    noprefijo,
    no,
    nobarco
    ) VALUES (
    ‘».utf8_decode($id).»‘,
    ‘».utf8_decode($boletaNo).»‘,
    ‘».utf8_decode($contenedor).»‘,
    ‘».utf8_decode($prefijo).»‘,
    ‘».utf8_decode($noprefijo).»‘,
    ‘».utf8_decode($no).»‘,
    ‘».utf8_decode($nobarco).»‘
    )»;
    $resp = mysql_query($dd);

    }

    Respuesta
  • el Mar 17, 2017 a las 10:38 am
    Permalink

    Hola, si piensas que el error está en el insert haz primero un print_r(); + die; de la variable $dd, después coges la consulta que has construido y la ejecutas en tu base de datos, y ves si te da algún tipo de error SQL, y a partir de aquí ya tomas las medidas oportunas ya sea en SQL o en la parte de PHP. Saludos.

    Respuesta
  • el Mar 25, 2017 a las 6:23 am
    Permalink

    Hola muy buen aporte, mi duda es, si es el mismo codigo para grandes cantidades de columnas en excel? gracias por su comentario, soy nuevo en esto. saludos.

    Respuesta
    • el Abr 27, 2017 a las 2:00 pm
      Permalink

      Si, el código es el mismo.
      Saludos.

      Respuesta
  • el Abr 26, 2017 a las 5:59 pm
    Permalink

    Hola!
    Primero que todo, gracias por el aporte.

    Acabo de probar su código y tengo un inconveniente, no me inserta toda la información, solo lo hace con 1 registro.

    Esto es lo que tengo:

    $idprograma = trim($datos[0]);
    $nombreprograma = trim($datos[1]);

    $insertar = «INSERT INTO programa(idprograma,nombreprograma) VALUES (‘».$idprograma.»‘,'».$nombreprograma.»‘)»;
    mysql_query($insertar,$link)or die(mysql_error());

    Agradezco su ayuda!

    Respuesta
    • el Abr 27, 2017 a las 2:26 pm
      Permalink

      Hola Ronny, tienes que tener un bucle y por cada pasada del bucle realizar un insert con la tupla correspondiente. En el caso que no tengas implementado el bucle debes hacerlo, y en el caso que lo tengas implementado comprueba si recorre todas las tuplas.

      Saludos.

      Respuesta
  • el May 11, 2017 a las 6:07 pm
    Permalink

    Buen dia, yo tengo el mimo inconveniente, segui todo al pie de la letra, cambie el nombre del archivo a archivo.csv, probé distintas formas de conexion a la base de datos, cambie de posición el «include («conexion.php»); » , -revise el codigo por todas partes, pero en definitiva me sale la pagina en blanco y no carga, revise bien la tabla desde phpmyadmin y cambie los valores de los campos, depronto podia ser eso, pero nada, le digo seleccionar archivo, luego importar y despues de eso todo queda en blanco, espero pueda ayudarme por favor, soy relativamente nuevo en esto, gracias

    Respuesta
  • el May 12, 2017 a las 7:07 am
    Permalink

    Si gracias, ya lo solucioné.
    Ahora tengo otro inconveniente.
    Si la tabla está llena, como hago para actualizar todos los datos?
    Cada registro tiene un identificador único.

    Gracias

    Respuesta
    • el May 21, 2017 a las 1:38 pm
      Permalink

      Si el id también lo cargas desde la excel lo unico que tienes que hacer es obtener del explode el campo id, después comprobar con una SELECT si el campo id de esa tupla existe en la tabla, si es así realiza un UPDATE, si no existe el identificador un INSERT. Eso si este proceso con muchos registros pueden llegar a ser un poco lento, siempre puedes ver mediante sentencias SQL realizar INSERTS Y UPDATES de forma masiva al mismo tiempo y no un insert o update por cada tupla. Saludos.

      Respuesta
  • el May 16, 2017 a las 8:00 pm
    Permalink

    me muestra Notice: Undefined offset: 1 in C:\xampp\htdocs\excel\importar.php on line 27 asi sucesivamente hasta el offset:7
    //Almacenamos los datos que vamos leyendo en una variable
    $numero = trim($datos[0]);
    $solicitud = trim($datos[1]);
    $fecha_reg = trim($datos[2]);
    $descripcion = trim($datos[3]);
    $fecha_fin = trim($datos[4]);
    $sigla = trim($datos[5]);
    $division = trim($datos[6]);
    $estatus = trim($datos[7]);

    //guardamos en base de datos la línea leida
    mysql_query(«INSERT INTO extraccion_contares(numero,solicitud,fecha_reg,descripcion,fecha_fin,sigla,division,estatus) VALUES(‘$numero,solicitud’,’$fecha_reg’,’$descripcion’,’$fecha_fin’,’$sigla’,’$division’,’$estatus’)»);

    no se que es lo que pueda pasar espero me puedas ayudar

    Respuesta
    • el May 21, 2017 a las 1:31 pm
      Permalink

      Comprueba que las variables que usas en la inserción no esten vacias y que la funcione explode se realize correctamente y devuelva un array de datos.

      Saludos.

      Respuesta
  • el May 25, 2017 a las 5:04 pm
    Permalink

    buen dia inge. disculpe probe su codigo pero me salieron varios errores los cuales son los siguientes 1.-Undefined index: archivo (me sale tres veces) 2.-file(): Filename cannot be empty y por ultimo 3.- Invalid argument supplied for foreach().. espero y me pueda ayudar, que tenga un buen dia .

    Saludos.

    Respuesta
  • el May 31, 2017 a las 6:22 pm
    Permalink

    Hola! Excelente aporte… en mi caso me ha funcionado de maravilla con un archivo .csv sencillo como el que muestras en tu ejemplo…

    ahora bien, necesito importar un csv de productos con unas descripciones largas cual con tu ejemplo me esta trayendo problemas… Al empezar a leer el csv con foreach todo va bien hasta que llega a la primera descripción, que te detallo a continuación:

    ;”Bandolera del anime y manga Dragon Ball Z con las letras de Dragon Ball Z, Vegeta y fondo con la lucha entre Vegeta y Goku. Asa ajustable, cierre de cremallera, y solapa con bolsillo delantero.
    Color: Negro grisáceo.
    Dimensiones: 23x27x8 cm.
    Material: Algodón 100%.”;

    En el campo “descripción” de la base de datos no llega a guardar toda la frase, solo me guarda esto: (“Bandolera del anime y manga Dragon Ball Z con las letras de Dragon Ball Z, Vegeta y fondo con la lucha entre Vegeta y Goku. Asa ajustable, cierre de cremallera, y solapa con bolsillo delantero.)

    A partir de ahí se descontrola y empieza a guardar todo desordenadamente…

    este es el contenido de mi csv: https://justpaste.it/17d7f

    Respuesta
    • el Jun 2, 2017 a las 10:34 pm
      Permalink

      Hola, por lo que dices la parte de $datos = explode(«;», $linea); no está devolviendo los valores correctamente, a partir de aquí haz dos comprobaciones, primero haz un print_r($linea); para ver si los datos llegan bien y que esten separadas las columnas con sus correspondientes punto y coma.

      Si hasta aquí está todo bien haz un print_r($datos); para comprobar que la función explode este dividiendo correctamente todas las columnas en sus correspondiente posiciones del array.

      Te dejo el manual de la función explode: http://php.net/manual/es/function.explode.php

      Deduzco también que tus datos provienen de un documento csv donde cada registro únicamente está en una tupla.
      No puedo profundizar más ya que no tengo el código ni los datos delante.

      Saludos.

      Respuesta
    • el Sep 12, 2017 a las 9:37 am
      Permalink

      Te faltaba poner la función utf8_encode() al recoger los datos después del explode. Saludos.

      Respuesta
  • el Jun 29, 2017 a las 8:18 pm
    Permalink

    Hola, me da el error «Parse error: syntax error, unexpected ‘$tamanio’ (T_VARIABLE) in C:\xampp\htdocs\asistencia\admin\importar.php on line 6»
    No modifique nada y el tamaño no es grande, solo estaba probando con 5 datos.

    Respuesta
    • el Jun 30, 2017 a las 2:06 pm
      Permalink

      El error es del servidor (te falta algún carácter en PHP) no por un mal funcionamiento del código.
      Comprueba que no te falte ningún punto y coma, ninguna llave… Saludos.

      Respuesta
  • el Jul 25, 2017 a las 3:44 am
    Permalink

    hola como puedo comparar los datos para q no se repitan en la base de datos, por ejemplo si tengo un campo identificacion,y en la base de datos ya existe un identificacion = 123456 y en el archivo csv exista otro con el mismo 123456, primero me compare estos datos para que no inserte duplicados…. Gracias

    Respuesta
    • el Jul 27, 2017 a las 8:45 am
      Permalink

      Hola Cesar, antes de insertar haz una consulta para comprobar si ya existe en la base de datos, si existe no insertes (o puede que te convenga realizar un update).

      Eso sí, al aplicarle una nueva consulta el proceso se hará algo más lento.

      Saludos.

      Respuesta
  • el Oct 5, 2017 a las 4:14 pm
    Permalink

    Probando el código solo me hace insert de la primera línea (después de pasar los encabezados), el resto de filas no hace insert, alguna solución?

    Respuesta
    • el Oct 5, 2017 a las 5:10 pm
      Permalink

      Ya solucioné, no tenía la llave primaría en autoincrement en mi base de datos, gracias por el aporte, muy bueno.

      Respuesta
  • el Nov 22, 2017 a las 6:15 pm
    Permalink

    Estimados estuve validando y hay este codigo: $datos = explode(«;»,$linea); en donde en mi caso me daba error. por lo que cambien al siguiente : $datos = explode(«,»,$linea); y me funciono sin problema. por si hay alguien que tiene el mismo problema lo resuelva.
    saludos y bendiciones

    Respuesta
  • el Nov 24, 2017 a las 4:22 pm
    Permalink

    Hola buenos dias
    Segui todo al pie y me sale este error al momento de importar mi archivo
    Ayuda

    Warning: mysql_query(): Access denied for user »@’localhost’ (using password: NO) in C:\AppServ\www\excelprueba\importar.php on line 37

    Warning: mysql_query(): A link to the server could not be established in C:\AppServ\www\excelprueba\importar.php on line 37
    ese mensaje me muestra

    Respuesta
  • el Dic 20, 2017 a las 5:02 pm
    Permalink

    Hola, el archivo carga perfecto, pero cuando voy a la tabla los datos me aparecen vacios en los registros que son TEXT o en 0 en los INT

    Respuesta
  • el Mar 2, 2018 a las 7:48 pm
    Permalink

    Hola, consulta es posible comparar los encabezados de un archivo csv contra una lista de variables?
    por ejemplo comparar que se encuentren organizados..
    Nombre Apellido Monto ; en caso que en el csv muestre Monto Apellido Nombre, que se organice en la base de datos.

    Respuesta
  • el Abr 7, 2018 a las 4:47 pm
    Permalink

    Hola como esta? Muy buen aporte esta información.
    Tengo una pregunta: Y si quiero que tambien lea la primera fila (los titulos o cabeceras de los campos) y luego convierta todo eso en un array asociativo? Cómo haria?

    Respuesta
    • el Abr 10, 2018 a las 5:20 pm
      Permalink

      Hola, si quieres leer la primera fila debes de quitar la siguiente condición:
      if($i != 0) {}

      o crear una nueva condición para especificar que deseas hacer cuando leas la primera fila:
      if($i == 0) { //primera fila }
      else { //resto de filas }

      Si luego quieres almacenar los resultados de la fila en un array es tan sencillo como leer la linea y después de realizar:
      $datos = explode(«;»,$linea);

      Crearte tu propio array y almacenarlo los datos que quieras.

      Saludos.

      Respuesta
  • el Sep 26, 2018 a las 8:58 pm
    Permalink

    Excelente script amigo, solo que tengo problemas al almacenar registros masivos, con el script que valiosamete nos proporcionas solo puedo importar a mi BD 11,800 registros y tengo una BD con mas de 100,000 registros , alguna idea de como poder solucionar mi problema?

    Respuesta
  • el May 29, 2019 a las 8:14 pm
    Permalink

    Ivan muy buena tarde, antes que nada muchas gracias por compartir tu conocimiento y quisiera ver si me puedes orientar con algo que requiero hacer:

    Como puedo consultar si un datos de mi CSV es igual a un dato ingresado en un texbox y si lo encuentra que me devuelva la información de la fila donde este coincide, de antemano gracias, no requiero hacer la consulta en la BD Mysql si no mas bien directo al CSV.

    Respuesta
  • el Jun 4, 2019 a las 4:53 pm
    Permalink

    Como hago para que me devuelva, las personas que tengan mas de 18 años por ejemplo?

    Respuesta

Deja un comentario

Tu dirección de correo electrónico no será publicada.