2010-11-21 17 views
7

J'essaie de lire quelques fichiers Excel avec phpexcel, qui fonctionne bien jusqu'à présent. phpexcel est un peu trop intelligent, et supprime les zéros de mes cellules. Je suppose que je dois le dire pour traiter la cellule comme une chaîne de texte, pas comme général ou nombre. mais j'ai échoué. J'ai même trouvé des discussions sur stackoverflow à ce sujet, mais les solutions suggérées ne fonctionneraient tout simplement pas.formats de cellules dans phpexcel

ci-dessous est un extrait des slideshows sur lesquels je travaille.

foreach(@$objWorksheet->getRowIterator() as $row){ 
    $cellIterator = $row->getCellIterator(); 
    $cellIterator->setIterateOnlyExistingCells(false); 
    foreach($cellIterator as $cell){ 
     #$objWorksheet->getStyle($cell->getCoordinate())->getNumberFormat()->setFormatCode('@'); 
     $cells[] = $cell->getValue(); 
    } 
} 

une idée? Je ne veux pas me limiter à lire uniquement du contenu numérique, car je n'ai aucun contrôle sur ce que les utilisateurs vont télécharger. traiter tout comme des chaînes serait parfait.

/Peder

Répondre

3

La méthode getValue() fait exactement ce qu'il doit faire, sans essayer d'être intelligent. Il renvoie la valeur réelle stockée dans la cellule. Si cette cellule contient un entier, elle renvoie un entier; si la cellule contient un flottant, elle renvoie un flottant; S'il contient une chaîne, il renvoie une chaîne. Être intelligent renvoie cette valeur sous la forme d'une chaîne formatée (avec des zéros non significatifs si nécessaire), puis vous devez utiliser une méthode plutôt différente et appliquer la mise en forme de la cellule à la valeur renvoyée.

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

ou si la cellule contient une formule:

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

Et s'il vous plaît ne pas utiliser @ pour essayer de supprimer les erreurs. PHPExcel lance des exceptions, et vous devriez vraiment vouloir les piéger.

Toutefois, pour ce que vous faites, vous pouvez considérer la méthode toArray() de la feuille de calcul, qui retournera un tableau de toutes les valeurs de cellule dans la feuille de calcul.

+0

merci, toutes les bonnes choses. mais - appliqué cela et essayé d'analyser un fichier csv, mais il semble que toutes mes cellules sont formatées comme "général". le fichier ressemble à ceci: http://dl.dropbox.com/u/252696/csv.csv est-ce une limitation du format csv, et si c'est le cas - ne serait-il pas mieux si phpexcel vient de renvoyer le contenu des cellules ? – fjallstrom

+0

Si PHPExcel renvoyait simplement les "chaînes", il aurait perdu toute sa capacité à traiter les données des feuilles de calcul Excel.Si vous essayez simplement de lire un fichier CSV dans un tableau, votre meilleure option est les fonctions de gestion de csv intégrées à PHP, comme fgetcsv() –

+0

Si vous voulez que PHPExcel traite les entrées du fichier CSV comme des chaînes plutôt que des nombres, alors vous pouvez écrire un "filtre de lecture" simple qui garantit que toutes les entrées du fichier sont traitées comme des chaînes. –

1

Il y a quelque chose de plus facile que ces itérateurs. Pour faire foreach Vous pouvez également utiliser la méthode toArray, dans l'exemple:

$active_sheet = $objPHPExcel -> getActiveSheet(); 
foreach($active_sheet -> toArray() as $row_n => $row){ 
foreach($row as $cell_n => $cell){ 
    // operations here 
} 
} 

a bien fonctionné pour moi et semble aussi être plus rapide alors itérateurs, comme Mark Baker triste.

Lors du traitement de CVS, je vois un problème principal: l'utilisateur doit exporter des données Excel et ce processus peut prêter à confusion pour la plupart d'entre eux. C'est pourquoi j'ai cherché une solution pour l'importation directement à partir d'Excel.

Dans l'utilisation de ces itérateurs est quelque chose d'étrange pour moi et je n'ai pas vraiment beaucoup parlé. En accédant à des données en utilisant l'itérateur, il retourne quelques objets sérialisés (de 2 à 4 dans mon cas) et en extraire des données était un cauchemar.

1

aucune des solutions proposées a fonctionné pour moi (CSV import avec PHPExcel v1.7.5) i résolu par liant valeur définie comme ceci:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder()); 

avant PHPExcel_IOFactory::createReader('CSV')