2012-09-05 246 views
7

Estoy usando la biblioteca PHPExcel para leer datos en un archivo de Excel. El problema que estoy teniendo es que cuando uso algo como:Ignorar celdas vacías PHPExcel

$obj = PHPExcel_IOFactory::load($file); 
$data = $obj->getActiveSheet()->toArray(null,true,true,true); 

Para cargar mi archivo y convertir su contenido en una matriz, consigo todas las columnas y filas de mi archivo de Excel en mi arsenal incluso aquellos sin ningún dato en ellos ¿Hay algún método o algo en la biblioteca PHPExcel que le indique que ignore las celdas en mi hoja de Excel que no contienen ningún dato? (En lugar de tener un montón de matrices asociativas vacías en mi $data)

+0

Quieres que tu matriz a eliminar sus valores vacíos (los elementos en la matriz que están vacíos?) – Periback

Respuesta

3

No, no hay. El método toArray() devuelve el primer argumento (NULL) para representar una celda vacía. A continuación, puede aplicar funciones de matriz de PHP estándar como array_filter() para eliminar celdas vacías.

foreach($data as $key => &$row) { 
    $row = array_filter($row, 
         function($cell) { 
          return !is_null($cell); 
         } 
      ); 
    if (count($row) == 0) { 
     unset($data[$key]); 
    } 
} 
unset ($row); 

Esto eliminará cada celda que tenga un valor NULO (vacío), y cada fila que no contenga nada más que celdas vacías. Preservará las claves de matriz, por lo que las claves de matriz aún le proporcionarán una referencia de celda.

Tenga en cuenta que una celda que contiene una cadena vacía no es una celda nula, por lo que se conservará, aunque la devolución de llamada array_filter() podría modificarse para eliminarlas también.

+0

Estoy tratando de importar un archivo de Excel con 14k + filas utilizando rangeToArray(), pero lleva bastante tiempo para importar y a menudo finaliza con 504 Gateway Timeout. ¿Tienes alguna sugerencia? ¿El ejemplo que dio arriba es mejor que usar rangeToArray()? – JCharette

+0

@JCharette: si trabaja con libros grandes, es mejor no crear grandes matrices en la memoria, pero para procesar fila por fila (rangeToArray) puede extraer una fila de la hoja de cálculo cada vez, pero no intente obtener toda la hoja de trabajo en una matriz –

+0

Si está trabajando con libros grandes, también es mucho mejor procesarlos como una tarea en segundo plano que como parte de una solicitud del navegador –

13

Si el problema está en conseguir las columnas vacías que van después de los datos reales, y que le gustaría evitar esto, usted podría hacer algo como esto:

$maxCell = $sheet->getHighestRowAndColumn(); 
$data = $sheet->rangeToArray('A1:' . $maxCell['column'] . $maxCell['row']); 

Esto devolverá matriz que representa sólo el área que contiene verdadera datos.

+1

Esto es exactamente lo que necesito gracias. – JCharette

+0

Gracias hombre !!!! ¡Me has salvado el día! –

5

tengo esta solución para mi caso

$maxCell = $objWorksheet->getHighestRowAndColumn(); 
$data = $objWorksheet->rangeToArray('A1:' . $maxCell['column'] . $maxCell['row']); 

devolver todas las filas con todas cadena vacía como:

[1] => Array 
     (
      [0] => 
      [1] => 
      [2] => 
      [3] => 
      [4] => 
      [5] => 
      [6] => 
      [7] => 
      [8] => 
      [9] => 
      [10] => 
      [11] => 
      [12] => 
      [13] => 
     ) 

para eliminar estas filas vacías

$data = array_map('array_filter', $data); 

volverá

[1] => Array ( )

Y esta es la solución final:

 $maxCell = $objWorksheet->getHighestRowAndColumn(); 
     $data = $objWorksheet->rangeToArray('A1:' . $maxCell['column'] . $maxCell['row']); 
     $data = array_map('array_filter', $data); 
     $data = array_filter($data); 

devolverá una tabla con filas llenen sólo .. esperanza de que ayude

Cuestiones relacionadas