2011-12-16 16 views
6

Sto usando PHPExcel per caricare file xls in un database mysql. Tutto funziona perfettamente, tranne una cosa: PHPExcel legge TUTTE le righe nel foglio di lavoro, anche quelle vuote e se, ad esempio, il mio xls ha 100 righe, il lettore scorre fino alla riga # 3359 (che suppongo sia il numero predefinito di righe per un foglio di lavoro vuoto).

Che cosa fa il lettore a contare anche le righe vuote? Questo è il mio codice:

$objPHPExcel = PHPExcel_IOFactory::load($path); 
$objWorksheet = $objPHPExcel->setActiveSheetIndex(0); 

    $highestRow = $objWorksheet->getHighestRow(); 
    $highestColumn = $objWorksheet->getHighestColumn(); 
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); 
    $nrColumns = ord($highestColumn) - 64; 

    $rowsadded=0; 
    $begin_row=5; // 1st line of data in excel file 
    for ($row = $begin_row; $row <= $highestRow; ++ $row) { 
     $val=array(); 
     for ($col=0; $col < $highestColumnIndex; $col++) { 
      $cell = $objWorksheet->getCellByColumnAndRow($col, $row); 
      $val[] = $cell->getValue(); 
     } 

     if ($val[0]<>'' && $val[1]<>'') { //check that row contains data before inserting 

      $rowsadded++; 
      $sql1 = sprintf("INSERT INTO aitisi (name_u, onoma_u, asf_gr, code, compid, im_egr, im_exp, symb, programa, cost, showcost, omadiko, ar_tayt, afm, dieyth, poli, til_st, til_kin, ep_te1, on_te1, ep_te2, on_te2, ep_te3, on_te3, ep_te4, on_te4, name_us, onoma_us) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", 
        GetSQLValueString($val[0], "text"), 
        GetSQLValueString($val[1], "text"), 
             ... 
        GetSQLValueString($val[11], "text"), 
        GetSQLValueString($val[12], "text"), 
        GetSQLValueString($val[13], "text"), 
        GetSQLValueString($val[14], "text"), 
        GetSQLValueString($val[15], "text"), 
        GetSQLValueString($val[16], "text"), 
        GetSQLValueString($val[17], "text")).';'; 
      $result = mysql_query($sql1) or die(mysql_error()); 
      $field_id = mysql_insert_id(); 
        } 
+0

Prima di leggere il file - filtri/cancelli le righe da esso? – matino

+0

Νο, l'ho semplicemente caricato. – bikey77

risposta

1

3359 non è il numero predefinito di righe per un foglio di lavoro vuoto .... vuol dire che chi ha creato il foglio di lavoro effettivamente creato con queste righe vuote (probabilmente involontariamente). Al lettore non importa se una riga è vuota o no, gli hai detto di leggere il foglio di lavoro e lo fa esattamente.

A meno che non si sappia esattamente quante righe si desidera leggere prima di caricare la cartella di lavoro (nel qual caso, è possibile applicare un filtro di lettura per leggere solo quelle righe), sarà necessario testare ogni riga per vedere se è vuota o no nel tuo ciclo for.

+0

Ho testato lo stesso script con altri file e il ciclo si è fermato nell'ultima riga contenente i dati, come lo spieghi? Non c'è un modo per ottenere l'ultima riga con i dati? – bikey77

+0

Non ho bisogno di spiegarlo: quegli altri file sono stati semplicemente creati senza righe vuote dopo l'ultima riga di dati. Qualsiasi numero di elementi può aggiungere righe vuote alla cartella di lavoro, incluse (ad esempio) le impostazioni di stile, le aree di stampa, ecc. Non esiste alcuna funzione per restituire l'ultima riga che contiene effettivamente dati in PHPExcel. –

+0

Sembra strano che un'applicazione così fine manchi di una funzione così semplice, ma comunque, grazie per il vostro aiuto. – bikey77

3

L'ho usato per filtrare le righe vuote. Anche se li stampo sul mio schermo per essere modificato forse sarà di qualche utilità per te:

foreach($worksheet->getRowIterator() as $row) { 
    $range = 'A'.$row->getRowIndex().':'.$highestColumn.$row->getRowIndex(); 
    $rowData = $worksheet->rangeToArray($range, NULL,TRUE,TRUE,TRUE); 
    $rowData = $rowData[$row->getRowIndex()]; 
    if(implode("",$rowData) != "") { 
     foreach($rowData as $column => $value){} 
    } 
}