22.12.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.

20.12.2009

Ein Computer ist ein elektrischer Idiot

Ein Computer ist ein elektrischer Idiot, der jede Programmanweisung (also auch falsche) sehr genau befolgt und dabei wahnsinnig schnell ist und sich sehr viel merken aber auch sehr viel vergessen kann (und wird!). Demnach ist er das geeignete Werkzeug um viel Zeit (für Berechnungen etc.) und Geld zu sparen oder aber zu verschwenden (Daten- und Fehlersuche).

Aus Daten und Programmen macht ein Computer Ausgaben (gibt Auskünfte), die so richtig und vollständig sind wie die Daten und Programme, von denen oft niemand mehr genau weiß wie gut diese sind, also im Normalfall die Richtigkeit und Genauigkeit der erhaltenen Auskünfte kaum noch abschätzen kann. Dem nach unterscheiden sich die Computerbenutzer im Extremfall in notorische Skeptiker (die alles nachprüfen), Blindgläubige (die den Anweisungen des Navigationsgerätes auch folgen, wenn es auf der Autobahn zum Wenden auffordert) und denen die versuchen auf Grund von Erfahrungssätzen (das genau kann ein Computer nicht) einen vernünftigen Weg zwischen beiden zu finden. An den Rändern des Spektrums der Benutzer finden sich Personen, die ebenso dumm sind wie ein Computer (sie folgen einen Programm) - aber längst nicht so schnell.

Was die von einem Computer erhaltenen Auskünfte (Daten und Programmen...) betrifft: Oft sind es nicht die, die wir erwarten. Das bedeutet aber nicht zwingend, dass diese falsch sind.