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.