2012-09-05 29 views
7

Sto utilizzando la libreria PHPExcel per leggere i dati in un file Excel. Il problema che sto avendo è che quando uso qualcosa come:Ignora celle vuote PHPExcel

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

Per caricare il mio file e convertire il suo contenuto in una matrice, ottengo tutte le colonne e le righe del mio file di Excel nel mio allineamento anche quelli senza dati in loro. C'è un metodo o qualcosa nella libreria PHPExcel per dirgli di ignorare le celle nel mio foglio Excel che non contengono dati? (Invece di avere un gruppo di array associativi vuoti nel mio $data)

+0

vuoi per l'array eliminare i suoi valori vuoti (gli elementi dell'array sono vuoti?) – Periback

risposta

3

No, non c'è. Il metodo toArray() restituisce il primo argomento (NULL) per rappresentare una cella vuota. È quindi possibile applicare funzioni di array PHP standard come array_filter() per eliminare le celle vuote.

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

Ciò elimina ogni cellula che è un valore NULL (vuoto), e ogni riga che comprende solo celle vuote. Conserverà le chiavi dell'array, quindi i tasti dell'array ti forniranno comunque un riferimento di cella.

Si noti che una cella contenente una stringa vuota non è una cella nulla, quindi verranno conservate, sebbene la callback array_filter() possa essere modificata per rimuoverle.

+0

Sto cercando di importare un file excel con righe 14k + usando rangeToArray(), ma ci vuole un po 'di tempo per importe e spesso termina con 504 Timeout gateway. Hai qualche suggerimento? L'esempio che hai fornito sopra è un modo migliore rispetto all'utilizzo di rangeToArray()? – JCharette

+0

@JCharette - Se stai lavorando con grandi cartelle di lavoro, è meglio non creare array di grandi dimensioni anche in memoria, ma per elaborare riga per riga (rangeToArray) puoi estrarre una riga dal foglio di lavoro ogni volta, ma non provare a richiama l'intero foglio di lavoro su un array –

+0

Se stai lavorando con grandi cartelle di lavoro, è anche molto meglio elaborare come attività in background anziché come parte di una richiesta del browser. –

13

Se il problema è a ottenere le colonne vuote che vanno dopo che i dati reali, e si vorrebbe evitare questi, si potrebbe fare qualcosa di simile:

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

Ciò restituirà array che rappresenta solo l'area che contiene vero dati.

+1

Questo è esattamente ciò di cui ho bisogno grazie. – JCharette

+0

Grazie amico !!!! Hai salvato la mia giornata !!! –

5

Ho questa soluzione per il mio caso

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

di ritorno tutte le righe con tutte stringa vuota come:

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

per rimuovere queste righe vuote

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

tornerà

[1] => Array ( )

E questa è la soluzione finale:

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

restituisce un array con solo le righe piene .. speranza che aiutano

Problemi correlati