Excel einlesen
Oliver
- php
0 Peter Nack0 Deus Figendi0 Oliver0 Deus Figendi0 Oliver
0 jobo0 fastix®
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?
Bitte um Unterstützung
Danke schonmal+lg
Oliver
Hallo Oliver,
auch wenn ich dir jetzt nicht auf deine Frage antworte, aber vielleicht solltest du dir mal das Spreadsheet PEAR-Package anschauen.
Ich habe damit mal vor gut einanhalb Jahren gearbeitet. Zu dem Zeitpunkt war es bereits recht brauchbar. Mittlerweile wird sich da wohl noch einiges getan haben - denke ein Blick waere es mal wert.
MfG
Peter
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;
...
Mir ist dieser Teil von PHP völlig unbekannt, aber hier ein paar Gedanken:
Woher soll dein Script wissen wo die Datei endet? Ich weiß nicht wie's bei Excell ist, aber in OOo.calc sind die Tabellen afaik unendlich groß, also...
Eine Überlegung ist es vielleicht wert auf die innere foreach zu verzichten und stattdessen die letzte gefüllte Zelle der Zeile zu ermitteln und dann mit einer repeat- oder for-Schleife zu durchlaufen, in welcher du eben prüfst ob die jeweilige Zelle "existiert" (denn scheinbar existieren sie ja nicht wenn sie leer sind).
Alternativ ginge ggf. auch dass du die Zellinhalte in einem array ablegst (was du ja wahrscheinlich tust), in welchem du die Indizes entsprechend dem Zellennamen (ich denke mal der ist auch zu ermitteln) festlegst. Möglicherweise gar nummerisch im Stile von ord(ersterBuchstabe)*100+ord(zweiterBuchstabe) oder so... anschließend jagst du eine zweite Schleife drüber, die die fehlenden Zellen mit Leerstings (oder 0 oder null) ergänzt.
Eine Überlegung ist es vielleicht wert auf die innere foreach zu verzichten und stattdessen die letzte gefüllte Zelle der Zeile zu ermitteln und dann mit einer repeat- oder for-Schleife zu durchlaufen, in welcher du eben prüfst ob die jeweilige Zelle "existiert" (denn scheinbar existieren sie ja nicht wenn sie leer sind).
Genau deshalb habe ich hier die Frage gestellt.
Weiß jemand wie man das macht?
Genau deshalb habe ich hier die Frage gestellt.
Weiß jemand wie man das macht?
Naja schau halt nach (var_dump oder so) welche Eigenschaften das Objekt $cell so hat, irgendwo wird da sicher auch ein Index bei sein im Stile
A B C D (...) AA AB AC (...) AY AZ BA (...)
Aber irgendwie erinnert das ja alles ein wenig an JScript, also getElementById? getElementsByName?
Oder wie gesagt du legst es erst in ein array um:
foreach (...) {
$table_array[$cell->rownumber][$cell->colname] = $cell->CellValue;
}
Oder sowas.
Wie man aber bestimmt merkt sind das reine Ratespielchen, die ich hier betreibe, aber ich hoffe einfach den passenden Anstoß zu geben ^^
ja danke ..
Aber so mache ich es eh, nur das eben die Werte in der array dann anders aussehen, weil leere Zellen einfach übergangen werden ..
Hallo,
mich wundert, dass du mit DomDocument da etwas bewerkstelligen kannst bei einem Excel-File.
Gruß
jobo
Moin!
Hallo Community,
bitte dringend um Hilfe beim einlesen einer Excel Datei...
...
Kann mir irgendjemand sagen wie ich zum Beispiel in einer Zeile jede Zelle einzeln abfragen kann, auch wenn diese Leer ist?
Beim Blick in den Quelltext einer solchen Datei sehe ich: Gar nicht. Die Zelle existiert nicht.
Bitte um Unterstützung
Die Zellen nach leeren Zellen haben eine Eigenschaft 'ss:Index'. Also: Nach der Existenz fragen, wenn ja 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=1;
$arValues=array();
foreach ($rows as $row) {
$cells = $row->getElementsByTagName( 'Cell' );
$spalte=1;
foreach( $cells as $cell ) {
if ($cell->hasAttribute('ss:Index')) {
$spalte=$cell->getAttribute('ss:Index');
}
$arValues[$zeile][$spalte]=$cell->nodeValue;
$spalte++;
}
$zeile++;
}
print "Werte:";print_r($arValues);
?>
Bitte. Ach so: Excel zählt die Spalten beginnend mit der 1. Ich habe das hier für die Zeilen beibehalten.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Moin!
Ach so: Excel zählt die Spalten beginnend mit der 1. Wenn Du einen "richtigen" Array brauchst:
<?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;
$maxZeilen=0;
# spalten zählen
foreach ($arValues as $arZeile) {
count($arZeile);
if ($maxZeilen < count($arZeile)) {
$maxZeilen = 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++) {
$zeileHatWert=false;
for ($spalte=0; $spalte < $maxZeilen; $spalte++) {
if (isset($arTemp[$zeile][$spalte])) {
$arValues[$zeile][$spalte]=$arTemp[$zeile][$spalte];
$zeileHatWert=true;
} else {
$arValues[$zeile][$spalte]=false;
}
}
}
unset($arTemp);
print "Werte:<pre>";print_r($arValues);print "</pre>";
?>
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Besten Dank fastix,
du bist ein wahnsinn
lg (lustiges Grinsen)
Oliver