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.

26.11.2009

Linux mal ganz anders


Des Lernens halber installiere ich gerade Gentoo. Hierbei wird das komplette System aus den Quellen erzeugt, was allerdings gerade auf älteren Rechnern einen ganz schönen Zeitaufwand verursacht. Dafür wird aber das System genau für den Prozessor gebacken (und nutzt dessen Erweiterungen, wie z.B. komplexere und effektivere Befehle) auf dem es dann auch laufen soll. Daneben ist Gentoo, was die Verwaltung betrifft ziemlich "ursprünglich". Nichts da mit Yast.

Das was läuft überzeugt jedenfalls hinsichtlich der Geschwindigkeit. Schade, dass man auf Feinheiten hinsichtlich solcher "Kleinigkeiten" wie der Tastenbelegung erst spät hingewiesen wird.

19.11.2009

openSuSE 11.2 mit Xcfe 4 installiert

Das rennt:
Ich hatte damit gedroht: Hier mein neuer Desktop mit Xfce 4. (und das obwohl openSuSE das KDE in der 11.2 doch ein ganzes Stück meinen Wünschen gemäß angepasst hat)

13.10.2009

Best of PHP-Programming

// The output is the form.
$output = $form;
// So output it.
return $output;
Scheinbar müssen heiß gestrickte Daten erst abkühlen und werden deshalb vor dem Auskippen von einem Topf in den anderen geschüttet.

Leider steigt dadurch der Speicherplatzverbrauch...

Fundstelle? Ein Wordpress-Plug-In.

22.01.2009

Error while calling sox. Not installed? - Problem gelöst

Die obige Fehlermeldung kennen nur wenige. Aber die ihn kennen, haben ein Problem, weil der Capisuite - Anrufbeantworter schickt per Mail statt des Wav Files nur die obige Fehlermeldung Error while calling sox. Not installed? Nur scheinbar ist sox nicht installiert, denn die Fehlermeldung ist irreführend, wie in einfacher Aufruf von
~> sox --version
zeigt.

Ursache des Fehlers:

Bei einigen Linux Versionen hat das Programm "sox", welches zum Konvertieren von Sound-Dateien sehr nützlich ist, ein Update erhalten. Das Programm erwartet jetzt (etwa seit Version 13) andere Optionen. Leider ist die capisuite da offensichtlich nicht mitgekommen.

Zur Abhilfe reicht ein Editor...
Öffnen Sie mit root-Rechten und dem Editor Ihres Vertrauens die Datei "cs-helpers.py" (Der genaue Pfad kann, abhängig von der Python-Version, abweichen):
~> sudo vi /usr/lib64/python2.5/site-packages/cs-helpers.py
oder
~> sudo vi /usr/lib/python2.5/site-packages/cs-helpers.py
Möglicherweise müssen Sie suchen:
~> find / -name cs-helpers.py 2> /dev/null
Suchen Sie in der geöffneten Datei nach folgender Zeile: (etwa Zeile 230)
ret = os.spawnlp(os.P_WAIT,"sox","sox",attachment,"-w",basename+"wav")
und ändern Sie diese wie folgt ab:
ret = os.spawnlp(os.P_WAIT,"sox","sox",attachment,"-2",basename+"wav")
Löschen Sie danach (sicherheitshalber) den binären Cache der Datei, diese wird von python bei der ersten Ausführung neu angelegt:
rm cs-helpers.pyc
Funktioniert.

Ein Restart des capisuite-Dämons oder des ISDN-Systems ist nicht notwendig.