2010-11-21 18 views
7

Ich versuche, einige Excel-Dateien mit phpexcel zu lesen, was soweit funktioniert. phpexcel ist allerdings etwas zu schlau und entfernt führende Nullen aus meinen Zellen. Ich denke, ich muss es sagen, um die Zelle als Textzeichenfolge zu behandeln, nicht als allgemein oder Nummer. aber ich habe versagt. Ich habe sogar Threads auf Stackoverflow gefunden, aber die vorgeschlagenen Lösungen würden einfach nicht funktionieren.Zellenformate in phpexcel

unten ist ein Ausschnitt der Dinge, an denen ich arbeite.

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

irgendeine Idee? Ich möchte mich nicht darauf beschränken, nur numerische Inhalte zu lesen, da ich keine Kontrolle darüber habe, was die Benutzer hochladen. alles so zu behandeln, als wäre die Saite perfekt.

/peder

Antwort

3

Die Methode getValue() genau das tut, was es tun soll, ohne versucht, schlau zu sein. Es gibt den tatsächlichen Wert zurück, der in der Zelle gespeichert ist. Wenn diese Zelle eine Ganzzahl enthält, wird eine Ganzzahl zurückgegeben. Wenn die Zelle einen Float enthält, wird ein Float zurückgegeben. Wenn es eine Zeichenfolge enthält, wird eine Zeichenfolge zurückgegeben. Wenn Sie clever sind, geben Sie diesen Wert als formatierten String (ggf. mit führenden Nullen) zurück, dann müssen Sie eine andere Methode verwenden und die Zellenformatierung auf den zurückgegebenen Wert anwenden.

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

oder wenn die Zelle enthält eine Formel:

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

Und bitte nicht @ Fehler zu versuchen und zu unterdrücken. PHPExcel löst Ausnahmen aus, und Sie sollten diese wirklich abfangen wollen.

Für das, was Sie tun, könnten Sie jedoch die Methode toArray() des Arbeitsblatts in Betracht ziehen, die ein Array aller Zellenwerte im Arbeitsblatt zurückgibt.

+0

Dank, alle guten Sachen. aber - wendete dies an und versuchte, eine CSV-Datei zu parsen, aber es scheint, als wären alle meine Zellen als "allgemein" formatiert. Datei sieht so aus: http://dl.dropbox.com/u/252696/csv.csv ist dies eine Einschränkung des csv-Formats, und wenn ja - wäre es nicht besser, wenn phpexcel nur den Inhalt der Zellen zurückgibt ? – fjallstrom

+0

Wenn PHPExcel einfach die "Zeichenfolgen" zurückgegeben hat, hätte es seine Fähigkeit zur Verarbeitung von Daten aus Excel-Arbeitsblättern verloren.Wenn Sie nur versuchen, eine CSV-Datei in ein Array zu lesen, ist die PHP-integrierte csv-Verarbeitungsfunktion die beste Option, z. B. fgetcsv() –

+0

Wenn Sie möchten, dass PHPExcel Eingaben aus der CSV-Datei als Zeichenfolgen und nicht als Zahlen behandelt Sie können einen einfachen "Lese-Filter" schreiben, der sicherstellt, dass alle Eingaben aus der Datei als Strings behandelt werden. –

1

Es gibt etwas einfacher als diese Iteratoren. Für foreach tun können Sie auch toArray Methode in Beispiel verwenden:

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

gut für mich gearbeitet und scheint auch dann Iteratoren schneller zu sein, genauso wie Mark Baker traurig.

Bei der Verarbeitung von CVS sehe ich ein Hauptproblem: Benutzer müssen Daten aus Excel exportieren und dieser Prozess kann für die meisten von ihnen verwirrend sein. Deshalb habe ich nach einer Lösung für den Import direkt aus Excel gesucht.

In der Verwendung dieser Iteratoren ist etwas seltsam für mich, und ich habe wirklich nicht viel damit angefangen. Beim Zugriff auf Daten durch Verwendung von Iterator gibt es wenige (von 2 bis 4 in meinem Fall) serialisierte Objekte zurück, und das Herausholen von Daten war ein Albtraum.

1

keine der angebotenen Lösungen gearbeitet für mich (CSV-Import mit PHPExcel v1.7.5) i durch Sollwert Bindemittel wie folgt gelöst:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder()); 

vor PHPExcel_IOFactory::createReader('CSV')