Foros del Web » Programando para Internet » PHP »

Optimizar consulta phpexcel para importar archivo

Estas en el tema de Optimizar consulta phpexcel para importar archivo en el foro de PHP en Foros del Web. Tengo este codigo con phpexcel, el cual inserta los datos de un archivo excel, el problema es que se demora mucho en insertarlos, son aprox ...
  #1 (permalink)  
Antiguo 11/03/2014, 08:54
 
Fecha de Ingreso: enero-2014
Mensajes: 111
Antigüedad: 10 años, 3 meses
Puntos: 1
Optimizar consulta phpexcel para importar archivo

Tengo este codigo con phpexcel, el cual inserta los datos de un archivo excel, el problema es que se demora mucho en insertarlos, son aprox 10.000 registros, cual puede ser la forma en optimizarlo un poco. Saludos y gracias

Código MySQL:
Ver original
  1. <head>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  3. <title>:: Importar de Excel a la Base de Datos ::</title>
  4. </head>
  5.  
  6. <body>
  7. <!-- FORMULARIO PARA SOICITAR LA CARGA DEL EXCEL -->
  8. Selecciona el archivo Listcon:
  9. <form name="importa" method="post" action="<?php echo$_SERVER['PHP_SELF'];?>" enctype="multipart/form-data" >
  10. <input type="file" name="excel" />
  11. <input type='submit' name='enviar'  value="Importar"  />
  12. <input type="hidden" value="upload" name="action" />
  13. </form>
  14. <!-- CARGA LA MISMA PAGINA MANDANDO LA VARIABLE upload -->
  15.  
  16. <?php
  17. $action='';
  18. extract($_POST);
  19. if ($action == 'upload') //si action tiene como valor UPLOAD haga algo (el value de este hidden es es UPLOAD iniciado desde el value
  20. {
  21. //cargamos el archivo al servidor con el mismo nombre(solo le agregue el sufijo bak_)
  22. $archivo = $_FILES['excel']['name']; //captura el nombre del archivo
  23. $tipo = $_FILES['excel']['type']; //captura el tipo de archivo (2003 o 2007)
  24.  
  25. $destino = "bak_".$archivo; //lugar donde se copiara el archivo
  26.  
  27. if (copy($_FILES['excel']['tmp_name'],$destino)) //si dese copiar la variable excel (archivo).nombreTemporal a destino (bak_.archivo) (si se ha dejado copiar)
  28. {
  29. echo "Archivo Cargado Con Exito";
  30. }
  31. {
  32. echo "Error Al Cargar el Archivo";
  33. }
  34.  
  35. //validacion para saber si el archivo ya existe previamente
  36. if (file_exists ("bak_".$archivo))
  37. {
  38. /*INVOCACION DE CLASES Y CONEXION A BASE DE DATOS*/
  39. /** Invocacion de Clases necesarias */
  40.  
  41. require_once 'Classes/PHPExcel.php';
  42. require_once 'Classes/PHPExcel/Reader/Excel2007.php';
  43. //DATOS DE CONEXION A LA BASE DE DATOS
  44. $cn = mysql_connect ("localhost","root","") or die ("ERROR EN LA CONEXION");
  45. $db = mysql_select_db ("perfilados",$cn) or die ("ERROR AL CONECTAR A LA BD");
  46.  
  47. // Cargando la hoja de calculo
  48. $objReader = new PHPExcel_Reader_Excel2007(); //instancio un objeto como PHPExcelReader(objeto de captura de datos de excel)
  49. $objPHPExcel = $objReader->load("bak_".$archivo); //carga en objphpExcel por medio de objReader,el nombre del archivo
  50. $objFecha = new PHPExcel_Shared_Date();
  51.  
  52. // Asignar hoja de excel activa
  53. $objPHPExcel->setActiveSheetIndex(0); //objPHPExcel tomara la posicion de hoja (en esta caso 0 o 1) con el setActiveSheetIndex(numeroHoja)
  54.  
  55. // Llenamos un arreglo con los datos del archivo xlsx
  56. $i=1; //celda inicial en la cual empezara a realizar el barrido de la grilla de excel
  57. $param=0;
  58. $contador=0;
  59. while($param==0) //mientras el parametro siga en 0 (iniciado antes) que quiere decir que no ha encontrado un NULL entonces siga metiendo datos
  60. {
  61.  
  62. $USUARIOS=$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue();
  63. $GRUPO=$objPHPExcel->getActiveSheet()->getCell('B'.$i)->getCalculatedValue();
  64.  
  65. $c=("insert into listcon values('$USUARIOS','$GRUPO')");
  66. mysql_query($c);
  67.  
  68. if($objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue()==NULL)
  69. //pregunto que si ha encontrado un valor null en una columna inicie un parametro en 1 que indicaria el fin del ciclo while
  70. {
  71. $param=1; //para detener el ciclo cuando haya encontrado un valor NULL
  72. }
  73. $i++;
  74. $contador=$contador+1;
  75. }
  76. $totalIngresados=$contador-1; //(porque se se para con un NULL y le esta registrando como que tambien un dato)
  77. echo "Total elementos subidos: $totalIngresados ";
  78. }
  79. else//si no se ha cargado el bak
  80. {
  81. echo "Necesitas primero importar el archivo";}
  82. unlink($destino); //desenlazar a destino el lugar donde salen los datos(archivo)
  83. }
  84.  
  85. ?>
  86. <a  href= "cargaArchivos.html" > Volver</a>
  87. </body>
  88. </html>
  #2 (permalink)  
Antiguo 11/03/2014, 08:57
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Optimizar consulta phpexcel para importar archivo

en la linea 66
$c=("insert into listcon values('$USUARIOS','$GRUPO')");
haces un insert por cada linea.
mejor acumula los datos y cada 1000 registros o la cantidad que quieras y haces un insert multiple, eso te ayudaria mucho
  #3 (permalink)  
Antiguo 11/03/2014, 09:23
 
Fecha de Ingreso: enero-2014
Mensajes: 111
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: Optimizar consulta phpexcel para importar archivo

no tienes algun ejemplo de como podria ser mas menos. Saludos y gracias
  #4 (permalink)  
Antiguo 11/03/2014, 10:15
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Optimizar consulta phpexcel para importar archivo

Cita:
Iniciado por JorgeQuirino Ver Mensaje
no tienes algun ejemplo de como podria ser mas menos. Saludos y gracias
no eso queda en el ingenio de cada persona
te doy una pista


Código PHP:
$f=1000//para insertmultiple
while($param==0//mientras el parametro siga en 0 (iniciado antes) que quiere decir que no ha encontrado un NULL entonces siga metiendo datos
{

$USUARIOS=$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue();
$GRUPO=$objPHPExcel->getActiveSheet()->getCell('B'.$i)->getCalculatedValue();
 
$valores.="('$USUARIOS','$GRUPO'),";
if(
$i==$f){
$valores=substr($valores,0,-1);
$c="insert into listcon values ".$valores;
mysql_query($c);
$f+=1000;
}

 
if(
$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue()==NULL)
//pregunto que si ha encontrado un valor null en una columna inicie un parametro en 1 que indicaria el fin del ciclo while
{
$param=1//para detener el ciclo cuando haya encontrado un valor NULL
}
$i++;
$contador=$contador+1;

  #5 (permalink)  
Antiguo 11/03/2014, 10:31
 
Fecha de Ingreso: enero-2014
Mensajes: 111
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: Optimizar consulta phpexcel para importar archivo

Me funciono de lujo. La consulta es cuando la cantidad de datos cambia. como puedo hacerlo para no cambiarle los parametros
  #6 (permalink)  
Antiguo 11/03/2014, 10:44
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Optimizar consulta phpexcel para importar archivo

Cita:
Iniciado por JorgeQuirino Ver Mensaje
Me funciono de lujo. La consulta es cuando la cantidad de datos cambia. como puedo hacerlo para no cambiarle los parametros
no entendi que quieres decir con eso?
  #7 (permalink)  
Antiguo 11/03/2014, 12:50
 
Fecha de Ingreso: enero-2014
Mensajes: 111
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: Optimizar consulta phpexcel para importar archivo

que por ejemplo ahora el archivo tiene 12.000 registros pero la prox ves puede tener mas o menos.
  #8 (permalink)  
Antiguo 11/03/2014, 13:19
 
Fecha de Ingreso: enero-2014
Mensajes: 111
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: Optimizar consulta phpexcel para importar archivo

Código PHP:
Ver original
  1. $f=1000; //para insertmultiple
  2.  
  3.  
  4.  
  5. $f+=1000;
  6. }

me puedes explicar esas 2 lineas. Saludos Gracias!!!
  #9 (permalink)  
Antiguo 11/03/2014, 14:03
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Optimizar consulta phpexcel para importar archivo

Pues asi

Código PHP:
<?PHP

// AGREGO UNA FUNCION PUES YA SON MAS DE 2 VECES QUE SE REPITE EL CODIGO
function insert($valores){
    
mysql_query("insert into listcon values ".$valores);
}

$f=1000//para insertmultiple
while($param==0//mientras el parametro siga en 0 (iniciado antes) que quiere decir que no ha encontrado un NULL entonces siga metiendo datos
{

$USUARIOS=$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue();
$GRUPO=$objPHPExcel->getActiveSheet()->getCell('B'.$i)->getCalculatedValue();
 
$valores.="('$USUARIOS','$GRUPO'),";
if(
$i==$f){
$valores=substr($valores,0,-1);
insert($valores//INSERTAMOS
$f+=1000;
}

if(
$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue()==NULL)
//pregunto que si ha encontrado un valor null en una columna inicie un parametro en 1 que indicaria el fin del ciclo while
{
$param=1//para detener el ciclo cuando haya encontrado un valor NULL
}
$i++;
$contador=$contador+1;


// verificas cuando sales del while que no quede ningun resto in cargar
if($i<$f && $i>($f-1000)){
$valores=substr($valores,0,-1);
insert($valores//INSERTAMOS
}else{
    if(
$i<1000){ // SI NO SUPERA LOS 1000 REGISTROS CARGA LOS QUE ALLA
    
$valores=substr($valores,0,-1);
    
insert($valores//INSERTAMOS
    
}
}
//-----------------------------------------------------------------------/ 
?>

Última edición por enlinea777; 11/03/2014 a las 14:12
  #10 (permalink)  
Antiguo 11/03/2014, 14:18
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Optimizar consulta phpexcel para importar archivo

Cita:
Iniciado por JorgeQuirino Ver Mensaje
Código PHP:
Ver original
  1. $f=1000; //para insertmultiple
  2.  
  3.  
  4.  
  5. $f+=1000;
  6. }

me puedes explicar esas 2 lineas. Saludos Gracias!!!

$f=1000;
es la base Para comparar con $i, cuando $i sea igual a $f se ingresan 1000 registros y pasa por
$f+=1000;
es igual que $f=$f+1000;osea 2000


me falto limpiar el valor $valores despues de cada insert aqui el codigo:
Código PHP:
<?PHP

// AGREGO UNA FUNCION PUES YA SON MAS DE 2 VECES QUE SE REPITE EL CODIGO
function insert($valores){
    
mysql_query("insert into listcon values ".$valores);
}

$f=1000//para insertmultiple
while($param==0//mientras el parametro siga en 0 (iniciado antes) que quiere decir que no ha encontrado un NULL entonces siga metiendo datos
{

$USUARIOS=$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue();
$GRUPO=$objPHPExcel->getActiveSheet()->getCell('B'.$i)->getCalculatedValue();
 
$valores.="('$USUARIOS','$GRUPO'),";
if(
$i==$f){
$valores=substr($valores,0,-1);
insert($valores//INSERTAMOS
$f+=1000;
$valores=""//Limpia la variable para los proximos 1000 registros
}

if(
$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getCalculatedValue()==NULL)
//pregunto que si ha encontrado un valor null en una columna inicie un parametro en 1 que indicaria el fin del ciclo while
{
$param=1//para detener el ciclo cuando haya encontrado un valor NULL
}
$i++;
$contador=$contador+1;


// verificas cuando sales del while que no quede ningun resto in cargar
if($i<$f && $i>($f-1000)){
$valores=substr($valores,0,-1);
insert($valores//INSERTAMOS
}else{
    if(
$i<1000){ // SI NO SUPERA LOS 1000 REGISTROS CARGA LOS QUE ALLA
    
$valores=substr($valores,0,-1);
    
insert($valores//INSERTAMOS
    
}
}
//-----------------------------------------------------------------------/ 
?>

Etiquetas: fecha, formulario, html, mysql, phpexcel, registro, select, usuarios, variable
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 19:17.