Foros del Web » Programando para Internet » PHP »

Importar desde Excel a Mysql.

Estas en el tema de Importar desde Excel a Mysql. en el foro de PHP en Foros del Web. Hola. No estoy seguro de si esto va en PHP o MySQL pero igual lo pondré aquí, mis conocimientos de MySQL son practicamente nulos, sino ...
  #1 (permalink)  
Antiguo 22/06/2009, 18:30
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Importar desde Excel a Mysql.

Hola.

No estoy seguro de si esto va en PHP o MySQL pero igual lo pondré aquí, mis conocimientos de MySQL son practicamente nulos, sino fuera por phpMyAdmin no podría hacer nada.

Tengo una página desde la cual subo archivos de excel al servidor, lo que yo quiero hacer es que al momento de cargar un archivo, me guarde los valores de las celdas de excel, en diferentes tablas y campos en la Base de Datos.

¿Cómo podría hacer esto?

Gracias de antemano, saludos.
  #2 (permalink)  
Antiguo 22/06/2009, 23:26
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Que tal Gaug,
lo que quieres es bastante comun al inicio de las cargas de bases de datos.
En el caso que te toca, trata de estandarizar las plantillas, y hacerlas lo mas parecidas a tu tablas, en orden de campos, y exportalas a csv.
Con esto ya tienes muchas posibilidades de tratarlas desde PHP, ya que incluye funciones para la lectura de este tipo de archivos.

Saludos y suerte!
  #3 (permalink)  
Antiguo 23/06/2009, 07:26
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Muchas gracias por tu respuesta Tx, sí he leído que es mejor exportarlo con formato csv pero lo que no encuentro es el código, para que al momento de cargar el archivo inmediatamente, ya sea en la misma página o me mande a otra para insertar los valores en las tablas.

Espero puedan ayudarme, saludos.
  #4 (permalink)  
Antiguo 23/06/2009, 08:02
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Importar desde Excel a Mysql.

Lee sobre filesystem
  #5 (permalink)  
Antiguo 23/06/2009, 08:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Importar desde Excel a Mysql.

En particular la función que buscas es: fgetcsv
  #6 (permalink)  
Antiguo 23/06/2009, 08:12
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Busqueda Respuesta: Importar desde Excel a Mysql.

Hola nuevamente,
te paso un ejemplo como guia solamente, ya que no conosco tu caso particular.
Supongamos que tenes una tabla de personas te quedaria algo asi:

Código:
+++++++++++++++++++
ID + NOMBRE + DNI +
+++++++++++++++++++
1  + MARCOS + 123 +
2  + MARIA  + 234 +
3  + JOSE   + 345 +
Tu archivo CSV seria igual, a excepcion del ID que supongamos es autonumerico.

Código:
++++++++++++++
NOMBRE + DNI +
++++++++++++++
MARCOS + 123 +
MARIA  + 234 +
JOSE   + 345 +
Yo haria algo asi:
1 - Upload simple a un directorio llamado "temp" con permiso de lectura y escritura
2 - Apertura del archivo subido
3 - Cadena SQL para la insercion en la DB
4 - Confirmacion exitosa o no de la operacion

Archivo "carga_csv.php"
Código PHP:
<?php
if(isset($_POST['up'])){
    
$result 'mal';
    if(
$_FILE['csv']['name']!=''){ // VERIFICAMOS SI TRAE ALGO
        
if(is_uploaded_file($_FILE['csv']['tmp_name'])){ // SE REALIZO EL UPLOAD?
            
$nombre_temporal 'CSV_'.time().'.csv'// CREAMOS UN NOMBRE CON LA MARCA DE TIEMPO
            
if(copy($_FILE['csv']['tmp_name'],'temp/'.$nombre_temporal)){ // LO COPIAMOS AL DIRECTORIO TEMP
                
$tmpSQL = array(); // DECLARAMOS UN ARRAY EN DONDE ESTARAN LOS DATOS PARA DESPUES COMPLETAR EL SQL
                
$fp fopen('temp/'.$nombre_temporal,'r'); // ABRIMOS EL ARCHIVO
                
while(($linea fgetcsv($fp,1000,';','"'))!==FALSE){ // RECORREMOS EL ARCHIVO HASTA EL FIN DE LINEA, SE ESPECIFICA SEPARADOR DE CAMPOS
                    
if($linea[0]!='' && $linea[1]!=''){ // QUE NO SEA UNA LINEA EN BLANCO
                        
$tmpSQL[] = "('".$linea[0]."','".$linea[1]."')";
                    }
                }
                
fclose($fp); // CERRAMOS EL ARCHIVO, NO SE NECESITA MAS
                
if(count($tmpSQL)>0){ // SI TIENE AL MENOS UN ELEMENTO HAREMOS EL INSERT
                    
$SQL "INSERT INTO personas(NOMBRE,DNI) VALUES".implode(',',$tmpSQL); // ACOMODO EL ARRAY CREADO ANTERIORMENTE EN LA CADENA SQL FINAL
                    
$r mysql_query($SQL);
                    if(
$r$result 'ok';
                }
            }
        }
    }
    
// REDIRECCIONAMOS HACIA ESTA MISMA PAGINA CON LA VARIABLE DE RESULTADO
    
header('Location: '.$_SERVER['PHP_SELF'].'?result='.$result);exit();
}
?>
Código HTML:
<form name="frm" action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
<label><input name="csv" type="file" /> Archivo CSV</label>
<input type="hidden" name="up" />
<input type="submit" value="Cargar..." />
</form> 
Tanto el codigo PHP como el HTML estarian en la misma pagina, como es corto....

Es solo un ejemplo, tal cual puede no funcionar, pero mas o menos es la logica de como lo haria, antes del insert habria que tener una conexion abierta al servidor MySQL, verificar que realmente es un CSV, que la cantidad de campos es la correcta, etc, pero creo que como referencia te podria servir.

Saludos!
  #7 (permalink)  
Antiguo 23/06/2009, 08:40
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
EDIT: Justo voy leyendo tu post Tx, déjame revisarlo bien y les aviso cómo me fue, gracias.

Saludos.

Tengo varias dudas:

1.- ¿Cómo convertir .XLSX a .CSV? (En 'Guardar como...' me voy a 'Otros formatos' pero no me aparece ése formato)

2.- Tengo varias hojas dentro del archivo Excel, ¿cómo hacer para que seleccione la hoja que yo quiero? (Esto no es tan necesario, pero si alguien tiene una solución lo agradecería)

3.- En ésta línea

Código PHP:
Ver original
  1. $SQL = "INSERT INTO personas(NOMBRE,DNI) VALUES".implode(',',$tmpSQL); // ACOMODO EL ARRAY CREADO ANTERIORMENTE EN LA CADENA SQL FINAL

Personas es la tabla, pero como pongo por ejemplo, que 'NOMBRE' se inserte en el campo 'nom' y 'DNI' en 'dni' dentro de la tabla.

De antemano les agradezco su ayuda, Saludos.

Última edición por GatorV; 23/06/2009 a las 14:34
  #8 (permalink)  
Antiguo 23/06/2009, 09:41
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Importar desde Excel a Mysql.

Busca bien en excel en otro formatos si sale el CSV (Comma delimited) (*.csv)
  #9 (permalink)  
Antiguo 23/06/2009, 09:52
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

EDIT: Ya resolví lo del formato .csv, y lo de la hoja, aún tengo duda con ésta línea:

Código PHP:
Ver original
  1. 1.
  2.       $SQL = "INSERT INTO personas(NOMBRE,DNI) VALUES".implode(',',$tmpSQL); // ACOMODO EL ARRAY CREADO ANTERIORMENTE EN LA CADENA SQL FINAL

Última edición por Gaug; 23/06/2009 a las 10:00
  #10 (permalink)  
Antiguo 23/06/2009, 10:20
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Hola Gaug, ya casi esta!, por lo menos la parte mas dificil.

Con respecto a las hojas, eso depende del programa que uses, por lo general, se exporta por hoja, un archivo CSV contendria una sola hoja de la plantilla, puede que la version que uses te exporte varias hojas en una sola, pero tendrian que tener exactamente los mismos datos y en el mismo orden.

Lo del Insert es asi:
Código:
INSERT INTO {NOMBRE_TABLA}({CAMPO_1},{CAMPO_2}) 
VALUES
({VALOR_CAMPO_1},{VALOR_CAMPO_2}),
({VALOR_CAMPO_1},{VALOR_CAMPO_2});
Este tipo de insert, es comprimido, funciona exactamente que:
Código:
INSERT INTO {NOMBRE_TABLA}({CAMPO_1},{CAMPO_2}) VALUES({VALOR_CAMPO_1},{VALOR_CAMPO_2})
INSERT INTO {NOMBRE_TABLA}({CAMPO_1},{CAMPO_2}) VALUES({VALOR_CAMPO_1},{VALOR_CAMPO_2})
Nada mas que muchisimo mas rapido.
En el ejemplo que te pase, creo una matriz con el listado de valores a insertar, luego con la funcion "implode", reconvierto la matriz en una cadena para unirla a la sentencia SQL, quedando exactamente igual a:

Código:
INSERT INTO {NOMBRE_TABLA}({CAMPO_1},{CAMPO_2}) 
VALUES
({VALOR_CAMPO_1},{VALOR_CAMPO_2}),
({VALOR_CAMPO_1},{VALOR_CAMPO_2});
Espero me pueda explicar correctamente, sino me dices.

Saludos!
  #11 (permalink)  
Antiguo 23/06/2009, 10:26
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Pues más o menos, entonces ¿cómo editaría esa parte para seleccionar los campos y los valores?

Me conseguí éste código:

Código PHP:
Ver original
  1. <?php
  2. function Conectarse()
  3. {
  4.        if (!($link=mysql_connect("localhost","miusuario","mipassword")))  {
  5.            echo "Error conectando a la base de datos.";
  6.            exit();
  7.        }
  8.         if (!mysql_select_db("mibd",$link)) {
  9.             echo "Error seleccionando la base de datos.";
  10.            exit();
  11.        }
  12.        return $link;
  13. }
  14.  
  15. $row = 1;
  16. $handle = fopen("datos.csv", "r");
  17. while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  18.     $num = count($data);
  19.     $row++;
  20.     $cadena = "insert into miTabla(Campo1,Campo2,Campo3,Campo4) values(";
  21.     for ($c=0; $c < $num; $c++) {
  22.         if ($c==($num-1))
  23.               $cadena = $cadena."'".$data[$c] . "'";
  24.         else
  25.               $cadena = $cadena."'".$data[$c] . "',";
  26.     }
  27.  
  28.     $cadena = $cadena.");";
  29.     echo $cadena."<br>";
  30.  
  31.      $enlace=Conectarse();
  32.      $result=mysql_query($cadena, $enlace);
  33.      mysql_close($enlace);
  34. }
  35.  
  36. fclose($handle);
  37.  
  38. ?>
  39. <h2>Se insertaron <?php echo $row ?> Registros en la tabla miTabla</h2>

Pero al poner los datos correspondientes me marca estos errores:

Código PHP:
Ver original
  1. insert into personas(NOMBRE,DNI) values(NOMBRE,DNI'NOMBRE','DNI');
  2. Error seleccionando la base de datos.

Última edición por GatorV; 23/06/2009 a las 14:37
  #12 (permalink)  
Antiguo 23/06/2009, 12:21
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Lo que dices ya es sobre SQL.
Para el insert, tu tabla personas tiene 3 campos, id (int autonumerico), nom (varchar(255)) y dni varchar(255)

Código:
++++++++++++++++++
+ id + nom + dni +
++++++++++++++++++
si quieres hacer un insert seria:

Código:
INSERT INTO personas(nom,dni) VALUES('marcos','123');
ó
Código:
INSERT INTO personal(dni,nom) VALUES('123','marcos');
es lo mismo, tiene que corresponder el orden de los valores con el de los campos.

El ID no lo incluimos, ya que se genera automaticamente con cada insert.
Bien, si en vez de 1 registros quiero agregar 3 ó x, seria algo asi:

Código:
INSERT INTO personas(nom,dni) VALUES('Marcos','123'),('Maria','345'),('Marcelo','456');
ó
Código:
INSERT INTO personas(nom,dni) VALUES('Marcos','123');
INSERT INTO personas(nom,dni) VALUES('Maria','345');
INSERT INTO personas(nom,dni) VALUES('Marcelo','456');
la primera es muchos mas rapida asi que te recomiendo usar esta.

Bueno, seguimos con el armado del SQL.
La funcion fgetcsv, lee una linea del archivo CSV, y devuelve los campos que contenga como una matriz.
Para la tabla de ejemplo, el archivo CSV tendria que tener el siguiente formato de columnas y filas:

Código:
"Marcos";"123"
"Maria";"345"
"Marcelo";"456"
PHP al leer la primera linea con la funcion fgetcsv:
Código PHP:
$linea fgetcsv($fp,1000,'"'); 
devolvera:
Código PHP:
$linea = array(0=>Marcos1=>123); 
Osea, para hacer este insert seria asi:
Código PHP:
$SQL "INSERT INTO personas(nom,dni) VALUES('".$linea[0]."','".$linea[1]."')"
pero como tengo un bucle que me lee todas las lineas del archivo CSV hasta el final, pongo lo que corresponde a los valores en otra matriz para despues unirla, ya que no se cuantas lineas tendria que leer.

Código PHP:
$tmpSQL = array();
while((
$linea=fgetcsv($fp,1000,'"'))!==FALSE){
    
$tmpSQL[] = "('".$linea[0]."','".$linea[1]."')";

al final de la lectura del archivo, $tmpSQL tendra los siguiente valores:

Código PHP:
$tmpSQL = array(
        
=> ('Marcos','123'),
        
=> ('Maria','345'),
        
=> ('Marcelo','456')
        ); 
Para el armado final, necesito que esos valores agregarlos a mi sentencia SQL.
Código PHP:
$SQL "INSERT INTO personas(nom,dni) VALUES".implode(',',$tmpSQL); 
lo que da como resultado:

Código PHP:
$SQL "INSERT INTO personas(nom,dni) VALUES('Marcos','123'),('Maria','345'),('Marcelo','456'); 
que luego pasare a mi funcion mysql_query() para que haga el insert en la base.

Espero que quede mas claro ahora, suerte!
  #13 (permalink)  
Antiguo 23/06/2009, 12:44
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Creo que me estoy confundiendo, yo pensaba que teniendo algo así en excel:

Código:
+++++++++++++++++++
ID + NOMBRE + DNI +
+++++++++++++++++++
1  + MARCOS + 123 +
2  + MARIA  + 234 +
3  + JOSE   + 345 +
Tomaba los valores de las columnas 'NOMBRE' y 'DNI', ¿o me equivoco?

Hice exactamente eso y lo guarde como .cvs, después lo cargué con el código que me diste algunos post arriba y no se me insertaron los valores en las tablas.

Me aparece ésto en la barra de direcciones del navegador:
Código:
/pruebacsv.php?result=mal
Te pido un poco de paciencia, ya que no estoy muy familiarizado con algunos de éstos procesos.

Saludos.
  #14 (permalink)  
Antiguo 23/06/2009, 18:03
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Que tal Gaug, no hay problema.

El tema es saber como esta el formato del CSV, abrelo con el block de notas y no con el Excel, por lo que decis puede estar asi:

Código:
ID;NOMBRE;DNI
1;Marcos;132
2;Maria;234
3;Jose;456
Excel no da muchas opciones de como guardar un CSV, asi que tene cuidado con esto. Yo recomiendo usar el OpenOffice, pero teniendo algunas cosas presentes no vas a tener problemas.

La funcion fgetcsv($fp,1000,';','"'), lee una linea por vez hasta 1000 caracteres (en este caso, podes modificar este valor) desde el principio, y considera en este caso, los ";" como separadores de campos, y las " " " como identificadores de cadenas (strings). Si en tu caso los campos esta separados por ",", cambia en la funcion por el caracter correspondiente.

En el caso que tu CSV sea como el ejemplo, debes tener cuidado, ya que la primera linea corresponde a los nombres de los campos, deberias empezar tu procedimiento a partir de la seguiente linea:

Código PHP:
// LEO LA PRIMERA LINEA, PERO NO HAGO NADA CON ESTOS DATOS
fgetcsv($fp,1000,';','"');
$tmpSQL = array();
// A PARTIR DE ACA SI
while(($linea=fgetcsv($fp,1000,';','"'))!==FALSE){
        
$tmpSQL[] = "('".$linea[0]."','".$linea[1]."')";

Tambien capaz estas confundido con como recuperar los datos leidos, el nombre de la columna no se tienen en cuenta, no es una tabla realmente, como sucede con las bases de datos.

Sino, que pasan a ser una matriz, arreglo o vector, despues de la lectura de la primera linea quedaria un array asi:

Código PHP:
array(
      
=> 1,
      
=> Marcos,
      
=> 123
); 
Para descubrir por donde esta mas o menos el error, podes usar la funcion "die" e ir viendo por donde entra o no tu rutina, ej:

Código PHP:
<?php
if($_REQUEST['algo']){
       if(
$_REQUEST['otro']){
              die(
'llego hasta aqui.');
       }
}
?>
Saludos!

PD: renegando un poco se graban a fuego algunos conceptos, je, que no decaiga!
  #15 (permalink)  
Antiguo 23/06/2009, 18:19
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Lo abrí con bloc de notas y me aparece así:

Código PHP:
Ver original
  1. NOMBRE,DNI
  2. MARIA,123
  3. JOSE,456
  4. PEDRO,789

Puedo corregir eso con un 'Reemplazar todos' pero me gustaría solucionarlo, ¿cómo podría hacerlo? De nuevo gracias por tu ayuda.

Saludos.
  #16 (permalink)  
Antiguo 23/06/2009, 18:34
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Bueno, no hace falta reemplazar, tu funcion de lectura seria desde la segunda linea, no se necesitan los nombres de las columnas, y como separador de campo la ",", algo asi quedaria:

Código PHP:
$fp fopen('temp/'.$nombre_temporal);
// LEER LA PRIMERA LINEA
$linea fgetcsv($fp,1000,',');
$tmpSQL = array();
// COMENZAMOS DESDE LA SEGUNDA EN ADELANTE
while(($linea fgetcsv($fp,1000,','))!==FALSE){
      if(
$linea[0]!='' && $linea[1]!=''){
            
$tmpSQL[] = "('".$linea[0]."','".$linea[1]."')";
      }
}
fclose($fp);
if(
count($tmpSQL)>0){
      
$SQL "INSERT INTO personas(nom,dni) VALUES".implode(',',$tmpSQL);
      die(
$SQL); // PUSE ESTE DIE, PARA VERIFICAR SI ESTA BIEN LA CONSULTA SQL

asi te imprimiria en pantalla la sentencia SQL resultante, si algo esta mal formado o concatenado, la consulta fallará.

Ten en cuenta, quien usara esto, ya que como viste, el Excel guarda de una forma el formato CSV, otros programas lo hacen de forma diferente y ahi te vas a encontrar con problemas.

Saludos.

Última edición por Tx; 23/06/2009 a las 18:38 Razón: me falto algo...
  #17 (permalink)  
Antiguo 23/06/2009, 18:51
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Mira, según yo el código debe estar así con lo que me pasaste:

Código PHP:

<form name="frm" action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
<label><input name="csv" type="file" /> Archivo CSV</label>
<input type="hidden" name="up" />
<input type="submit" value="Cargar..." />
</form>

<?php
if(isset($_POST['up'])){
    
$result 'mal';
    if(
$_FILE['csv']['name']!=''){ // VERIFICAMOS SI TRAE ALGO
        
if(is_uploaded_file($_FILE['csv']['tmp_name'])){ // SE REALIZO EL UPLOAD?
            
$nombre_temporal 'CSV_'.time().'.csv'// CREAMOS UN NOMBRE CON LA MARCA DE TIEMPO
            
if(copy($_FILE['csv']['tmp_name'],'temp/'.$nombre_temporal)){ // LO COPIAMOS AL DIRECTORIO TEMP
                
$tmpSQL = array(); // DECLARAMOS UN ARRAY EN DONDE ESTARAN LOS DATOS PARA DESPUES COMPLETAR EL SQL
 
$fp fopen('temp/'.$nombre_temporal);
 
$linea fgetcsv($fp,1000,',');
$tmpSQL = array();
                 while((
$linea fgetcsv($fp,1000,','))!==FALSE){
      if(
$linea[0]!='' && $linea[1]!=''){
            
$tmpSQL[] = "('".$linea[0]."','".$linea[1]."')";
      }
}
fclose($fp);
if(
count($tmpSQL)>0){
      
$SQL "INSERT INTO personas(nom,dni) VALUES".implode(',',$tmpSQL);
      die(
$SQL); // PUSE ESTE DIE, PARA VERIFICAR SI ESTA BIEN LA CONSULTA SQL
}  
                    
$r mysql_query($SQL);
                    if(
$r$result 'ok';
                }
            }
        }
    }
    
// REDIRECCIONAMOS HACIA ESTA MISMA PAGINA CON LA VARIABLE DE RESULTADO
    
header('Location: '.$_SERVER['PHP_SELF'].'?result='.$result);exit();
}
?>
Y me marca error en la línea 48.

Gracias por tu ayuda, saludos.
  #18 (permalink)  
Antiguo 23/06/2009, 20:15
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Mmmmmm, como te decia, era solo a modo de ejemplo, lo tenes que adaptar a tu necesidad.
Revisandolo, encontre un par de errores de tipeo, ya que no los probe, aqui te va con algunas correcciones:

Código PHP:
<?php
if(isset($_POST['up'])){
    
$result 'mal';
    if(
$_FILES['csv']['name']!=''){ // VERIFICAMOS SI TRAE ALGO
        
if(is_uploaded_file($_FILES['csv']['tmp_name'])){ // SE REALIZO EL UPLOAD?
            
$nombre_temporal 'CSV_'.time().'.csv'// CREAMOS UN NOMBRE CON LA MARCA DE TIEMPO
            
if(copy($_FILES['csv']['tmp_name'],'temp/'.$nombre_temporal)){ // LO COPIAMOS AL DIRECTORIO TEMP
                
$tmpSQL = array(); // DECLARAMOS UN ARRAY EN DONDE ESTARAN LOS DATOS PARA DESPUES COMPLETAR EL SQL
                
$fp fopen('temp/'.$nombre_temporal);
                
$linea fgetcsv($fp,1000,','); // LEEMOS LA PRIMERA LINEA
                
$tmpSQL = array();
                while((
$linea fgetcsv($fp,1000,','))!==FALSE){
                    if(
$linea[0]!='' && $linea[1]!=''){
                        
$tmpSQL[] = "('".$linea[0]."','".$linea[1]."')";
                    }
                }
                
fclose($fp);
                if(
count($tmpSQL)>0){
                    
$SQL "INSERT INTO personas(nom,dni) VALUES".implode(',',$tmpSQL);
                    die(
$SQL); // PUSE ESTE DIE, PARA VERIFICAR SI ESTA BIEN LA CONSULTA SQL
                    
$r mysql_query($SQL);
                    if(
$r$result 'ok';
                }
            }
        }
    }
    
// REDIRECCIONAMOS HACIA ESTA MISMA PAGINA CON LA VARIABLE DE RESULTADO
    
header('Location: '.$_SERVER['PHP_SELF'].'?result='.$result);exit();
}
?>
<form name="frm" action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
    <label><input name="csv" type="file" /> Archivo CSV</label>
    <input type="hidden" name="up" />
    <input type="submit" value="Cargar..." />
</form>
Cuando te diga que un error se encuentra en la linea X y tu codigo tiene menos lineas que la que dice, de cajon es que esta mal cerrado alguna llave (if, while, switch, etc).

Saludos!
  #19 (permalink)  
Antiguo 24/06/2009, 08:04
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Claro, así sólo lo tomé como ejemplo, pero necesito probarlo antes para ver si me funciona y entonces adaptarlo a mis necesidades.

Ya probé el código, y parece que si me copia el archivo a la carpeta temp, pero no inserta los valores en la base de datos, además de que la página se queda cargando eternamente ¿no hay problema porque sean comas (,) en vez de punto y coma(;)? pensé que tal vez sería porque no se conecta a la BD, pero agregué éste código:

Código PHP:
Ver original
  1. require_once('Connections/conex.php');
  2. mysql_select_db($database_conex, $conex);

Que es con el que me conecto normalmente, ¿alguna idea de que podría ser?

De antemano agradezco tu gran ayuda, saludos.
  #20 (permalink)  
Antiguo 24/06/2009, 08:35
Avatar de Tx
Tx
 
Fecha de Ingreso: enero-2002
Ubicación: Cba - Arg
Mensajes: 188
Antigüedad: 22 años, 3 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Hola Gaug,
me parece que te estas encontrando con todos los problemas juntos, pero eso es muy bueno, asi no te pasan despues, je.

Por un lado, si no me equivoco, parece que estas usando el DW, si bien te facilita muchas cosas, hay algunas que las complica demasiado en el afan de que sean simples para el usuario final.

para conectarte es suficiente algo asi:

Código PHP:
<?php
$conn 
mysql_connect('localhost:3306','mi_usuario','mi_clave');
if(!
$conn) die('No se puedo conectar con el servidor');
$link mysql_select_db('mi_base',$conn);
if(!
$link) die('No se pudo abrir la base de datos');
?>
esto lo incluyes al principio de tu codigo o lo pones en el mismo archivo, da igual, pero que te diga que si existe algun error.
Si continuó, es porque se conecto correctamente y el nombre de la DB esta bien, descartamos problemas relacionados a esto.

Por otro lado, la carga eterna, se debe a que debes estar usando IIS y no Apache como servidor web, una solucion es modificando la linea de redireccion asi:

Código PHP:
// REDIRECCIONAMOS HACIA ESTA MISMA PAGINA CON LA VARIABLE DE RESULTADO
//header('Location: '.$_SERVER['PHP_SELF'].'?result='.$result);exit();
header('Location: pruebacsv.php?result='.$result);exit(); 
La verdad nose porque se produce este error en IIS de Windows, pero en mi caso no me molesta mucho, ya que no trabajamos sobre Windows, por eso no me toco investigar tanto sobre eso.

La insercion debe fallar por algun pequeño error, pero ya casi esta.

Saludos y seguime contando como va.
  #21 (permalink)  
Antiguo 24/06/2009, 09:17
 
Fecha de Ingreso: junio-2009
Mensajes: 250
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Importar desde Excel a Mysql.

Puse los 2 códigos que me proporcionaste y sigo exactamente igual.
No uso IIS, uso Apache que viene con el 'WAMP'.

¿Qué otra cosa podría hacer?

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:21.