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.