Dienstag, 22. Dezember 2009

PHP, Einlesen einer Excel-Datei

Hallo Community,
bitte dringend um Hilfe beim einlesen einer Excel Datei...

Also ich lade eine Excel Datei hoch, und möchte sie Zeile für Zeile und Spalte für Spalte aus lesen.

So sieht mein Script etwa aus:
----------------

$dom = DOMDocument::load( $_FILES['file']['tmp_name'] );
$rows = $dom->getElementsByTagName( 'Row' );

foreach ($rows as $row)
{
$cells = $row->getElementsByTagName( 'Cell' );
foreach( $cells as $cell )
{
$cellwas=$cell->nodeValue;
...
---------------


Leider kann ich so nur alle Zellen mit Inhalt auslesen. Also leere Zellen werden einfach übergangen, wodurch das ganze unbrauchbar wird.

Kann mir irgendjemand sagen wie ich zum Beispiel in einer Zeile jede Zelle einzeln abfragen kann, auch wenn diese Leer ist?


Eine schnelle Lösung:

Beim Blick in den Quelltext einer solchen Datei sehe ich: Leere Zellen lassen sich gar nicht abfragen. Die Zelle existiert in den Daten schlicht nicht. Die Zellen nach leeren Zellen haben aber ein Attribut 'ss:Index'. Also: Nach der Existenz des Attributes fragen, wenn es existiert den Spaltenzähler auf den Wert setzen.

Bei mir funktionierte mit test.xml als (aus OpenOffice exportierte) Excel-2003-xml-Datei:
<?php
$dom = DOMDocument::load( "test.xml" );
$rows = $dom->getElementsByTagName( 'Row' );
$zeile=0;
$arValues=array();
foreach ($rows as $row) {
$cells = $row->getElementsByTagName( 'Cell' );
$spalte=0;
foreach( $cells as $cell ) {
if ($cell->hasAttribute('ss:Index')) {
$spalte=$cell->getAttribute('ss:Index')-1;
}
$arValues[$zeile][$spalte]=$cell->nodeValue;
$spalte++;
}
$zeile++;
}

$zeile=0;
$maxSpalten=0;

# spalten zählen
foreach ($arValues as $arZeile) {
if ($maxSpalten < count($arZeile)) {
$maxSpalten = count($arZeile);
}
}

# Array mit false aufüllen und für foreach schön machen:
$arTemp=$arValues;
$arValues=array();
for ($zeile=0; $zeile < count($arTemp); $zeile++) {
for ($spalte=0; $spalte < $maxSpalten; $spalte++) {
if (isset($arTemp[$zeile][$spalte])) {
$arValues[$zeile][$spalte]=$arTemp[$zeile][$spalte];
} else {
$arValues[$zeile][$spalte]=false;
}
}
}
unset($arTemp);
print "Werte:<pre>";print_r($arValues);print "</pre>";
?>


Hinweis:

Diese schnelle Lösung berücksichtigt übrigens noch nicht, dass ein solches Dokument auch Tabellenblätter hat.

Keine Kommentare:

Kommentar veröffentlichen