2011-12-16 4 views
6

J'utilise PHPExcel pour charger des fichiers xls dans une base de données mysql. Tout fonctionne correctement, sauf pour une chose: le PHPExcel lit TOUTES les lignes dans la feuille de calcul, même celles qui sont vides et si, par exemple, mon xls a 100 lignes, le lecteur boucle tout le long jusqu'à la ligne # 3359 (ce que je suppose le nombre de lignes par défaut pour une feuille de calcul vide).

Qu'est-ce qui fait que le lecteur compte même les lignes vides? Voici mon code:

$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

Avant de lire le fichier - filtrez-vous/supprimez-vous des lignes? – matino

+0

Alors, je l'ai simplement téléchargé. – bikey77

Répondre

1

3359 n'est pas le nombre de lignes par défaut pour une feuille vierge .... cela signifie que celui qui a créé la feuille de calcul, il en fait créé avec les lignes blanches (probablement par erreur). Le lecteur ne se soucie pas de savoir si une ligne est vide ou non, vous lui avez dit de lire la feuille de calcul et c'est exactement ce qu'il fait.

Si vous ne savez pas exactement combien de lignes vous souhaitez lire avant de charger le classeur (auquel cas vous pouvez appliquer un filtre de lecture pour lire uniquement ces lignes), vous devez tester chaque ligne pour voir si elle est vide ou pas dans votre boucle for.

+0

J'ai testé le même script avec d'autres fichiers et la boucle s'est arrêtée à la dernière ligne contenant des données, comment expliquez-vous cela? N'y a-t-il pas moyen d'obtenir la dernière ligne avec des données? – bikey77

+0

Je n'ai pas besoin de l'expliquer: ces autres fichiers ont simplement été créés sans lignes vides après la dernière ligne de données. N'importe quel nombre de choses peut ajouter des lignes vides au classeur, y compris (par exemple) les paramètres de style, les zones d'impression, etc. Il n'y a pas de fonction pour retourner la dernière ligne qui contient réellement des données dans PHPExcel. –

+0

Il semble étrange qu'une telle application manque d'une telle fonction simple mais de toute façon, merci pour votre aide. – bikey77

3

Je l'ai utilisé pour filtrer les lignes vides. Bien que je les imprime sur mon écran pour être édité, peut-être que cela vous sera utile:

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){} 
    } 
}