PHP und Excel -> COM
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alten versuch
alternativ
automation
beitrag
bessere deutlichere fehlermeldungen
cell
count
einsatzgebiet
methode
mglichkeit
not
objekt
parameter
problemchen
schleifen
set
spalten
uebrigens
versuch
zeile
-
hallo!
ich möchte via PHP aus einer exceltabelle inforationen auslesen.
Zuerst möchte ich mich etwas einarbeiten und aus eiener existierenden excelmappe die verscheidenen sheetsnamen auslesen. schon daran scheitere ich :(
bis ejtzt habe ich folgendes gecodet:
$excel = new COM("excel.application"); $excel->Visible = 1; $x=0; //Create a new workbook $wkb = $excel->Workbooks->Open("D:\\test.xls"); $sheet = $wkb->Worksheets(); for($x=0;$x<count($sheet->Name());$x++) { $sheets[$x]=$sheet->Name(); //zeile 11 echo $sheets[$x]; $x++; } funktioniert aber nicht. fehler ist: [code]Fatal error: Call to undefined method variant::Name() in C:\Program Files\xampp\htdocs\com.php on line 11
kann mir da jemand weiterhelfen? hat jemand eine einführung in das arbeiten mit exvel via php?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Welche EIgenschaften hat denn so ein Com Objekt? Das muss doch in der Dokumentation stehen.
-
zu dem com objekt selbst steht schon etwas in der doku: http://de2.php.net/manual/de/class.com.php
aber da sie sehr viele einsatzgebiete hat wird niocht wirklich auf excel eingegangen..
im allgemeinen findet man sehr wenig darüber.
ich weiß, das COM(excel.application) die klasse Application aus Excel (VBA) ist, also die gleichen methoden haben...
trotzdem bekomme ich kein lauffähiges script zustande.
In VBA würde mein script folgendermasen aussehen:
For Each ws In Worksheets MsgBox ws.Name Next ws
bekomme es aber nich in php umgesetzt... -
Dann lass dir mal mit var_dump() bzw. print_r() dein Objekt ausgeben, dann kannst du sehen welche Eigenschaften und Methoden besitzt.
-
hilft nicht wirklich weiter...
object(variant)#2 (0) { } variant Object -
muss Name() vllt. klein geschrieben werden? Oder die Funktionsklammern weglassen?
-
Ich würde bei der Schleife folgendes machen: (ich weiß zwar nicht, ob das korrektes PHP ist, weil ich da erst Anfänger bin, aber nach der VBA-Doku von Excel müßte das stimmen):
$sheet = $wkb->Worksheets();
$max = $sheet->count;
for($x=1;$x<=max;$x++) {
//ist bei Ecel so, dass der Index bei 1 beginnt ...
$sheets[$x-1]=$wkb->Worksheets[$x]->Name();
echo $sheets[$x];
$x++; //MACHT DAS PHP NICHT AUTOMATISCH????
//du würdest den Schleifenzähler ja doppelt inkrementieren!
}
EDIT: Ich würde das in VBA vorbauen, und dann in PHP "nachscripten", weil dir das VBA bessere (deutlichere) Fehlermeldungen rauswirft, und du kannst auch einfach durchdebuggen ... (Hab ich übrigens gerade für den Post auch gemacht).
Beitrag geändert: 16.7.2007 16:08:00 von burgi -
ahhh danke schonmal ein schritt weiter.
ich habe zwar keine ausgabe der sheets aber auch keine fehlermeldungen :D
das increment ist da fehlerhafterweiße von einem alten versuch mit eeiner while schleife.
das vorbauen mit VBA ist schon eine gute möglichkeit. nur habe ich noch nie wirklick mit VBA gearbeitet.
werde es aber mal versuchen. -
das vorbauen mit VBA ist schon eine gute möglichkeit. nur habe ich noch nie wirklick mit VBA gearbeitet.
werde es aber mal versuchen.
Wenn du PHP kannst, dann wirst du mit VBA auch kein Problem haben. Ist zwar von der Syntax ganz anders, aber die VBA-Hilfe (vorausgesetzt, du hast sie bei Excel mitinstalliert) ist sehr ausführlich und sehr gut. Außerdem können dir bei VBA sicherlich viele Leute helfen ... -
ok danke erstmal... es funktioniert nun.
das $ zeichen fehlt in der for schleife vor dem max ;)
ADanke für die tips! -
also ich hab ein script jetzt mal mit VBA vorgebaut:
With Worksheets("S12").Range("a1:k10") Set c = .Find("Hostname", LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then firstAddress = c.Address Do MsgBox (c.Address) Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstAddress End If End With
Problem: wie setze ich: Find("Hostname", LookIn:=xlValues, LookAt:=xlWhole)
in PHP um? ghet das überhaupt?
mein versuch
$wkb->Worksheets[$art]->Range("a1:k10")->Find("Hostname", "LookIn:=xlValues", "LookAt:=xlWhole");
auch
$wkb->Worksheets[$art]->Range("a1:k10")->Find("Hostname", "xlValues", "xlWhole");
funktioniert nicht.
jemand eine idee? -
Jop, hab 'ne Idee:
$c = wkb->Worksheets[$art]->Range("a1:k10")->Find("Hostname", "xlValues", "xlWhole");
Kann das funktionieren? -
leider nein
Die Find Eigenschaft des Range-Objektes kann nicht zugeordnet werden.
wird wohl heißen, dass VBA z.B. LookIn benötigt..
danke für dein Script im anderen Thread burgi! -
Bei genauerer Betrachtung ist mir das noch afgefallen: Die Parameter xlValue und xlWhole darfst du nicht als String übergeben, sondern als Integer-Wert. Den Inhalt der Konstanten xlValue und xlWhole dürftest du in der VBA-Doku finden, ansonsten sollte es auch im Direktfenster funktionieren.
EDIT:
lt. VBA
xlValue = 2
xlWhole = 1
Beitrag geändert: 18.7.2007 10:11:55 von burgi -
danke für deine mühen!
also in VBA ist es kein problem, wenn es in VBA per zahl übergebe.
Leider besteht in PHP das Problem der zuweisung trotzdem.
wie würde man in VBA denn abprüfen ob eine Zelle einen exakten wert hat?
dann könnte ich das ganze manuell abfragen und dem problem so aus dem weg gehen. -
Normalerweise so:
$wkb->Worksheets[$art]->Range("a1").value //Zahlenwert $wkb->Worksheets[$art]->Range("a1").text //für Strings
EDIT: Hab' gerade noch ein bisschen probiert:
am besten du verwendest anstatt Range("A1")
st$ = $wkb->Worksheets[$art]->Cells(1,1).Text //Cells(Zeile, Spalte), Index bei 1 beginnend
Deinen String st$ überprüfst du dann, ob sich der konvertieren läßt in eine Zahl. Ich weiß nämlich nicht, wie Excel bei OLE-Automation reagiert, wenn du mit den Datentypen Probleme hast. In VBA direkt wirft er nämlich eine Exception "13: Datentypen unverträglich". Also ist es besser, einen String auszulesen, und die Typenumwandlung in PHP zu machen. Dann kannst du das Verhalten deines Programms/Skripts SELBER kontrollieren, und bist nicht auf Excel angewiesen. (Ich hatte nämlich in dieser Hinsicht schon öfters mal Problemchen, wenn ich OLE-Automation mit Ecel von Delphi aus gemacht hab.)
Beitrag geändert: 18.7.2007 12:08:27 von burgi -
Hab mal ein kleines Beispiel gemacht. Mußt eigentlich nur drauf archten, dass du Objekte hast und keine String-Werte.
<?php $app = new COM("excel.application"); print "Application name: {$app->Application->value}<br />\n" ; print "Loaded version: {$app->Application->version}<br />\n"; $oWorkbook = $app->Workbooks->Open('D:\Mappe1.xls') or die("Konnte Datei nicht öffnen."); $oSheets = $oWorkbook->Worksheets(); echo 'Anzahl Blätter: '.$oSheets->count."<br />\n"; // Count von 1 aufwärts, weil Tabellenblatt1 hat Wert1 for($i=1; $i < $oSheets->count+1; $i++) { echo 'Das '.$i.'. Blatt ist: '.$oSheets[$i]->Name()."<br />\n"; } // Das 2. Blatt wählen und aktivieren // alternativ geht auch der Name "Tabelle2" anstatt der 2 $oWorksheet = $oWorkbook->Worksheets(1); $oWorksheet->activate; // Zellobjekt bestimmen (1.Zeile,2.Spalte) $oCell = $oWorksheet->Cells(1,2); // alternativ auch über Range // $oCell = $oWorksheet->Range("B1"); // Wert der Zelle bestimmen echo 'Zellwert: '.$oCell->value; #Excel beenden $oWorkbook->Close; unset($oWorksheet); unset($oWorkbook); $app->Workbooks->Close(); $app->Quit(); unset($app); ?>
Die verfügbaren Funktionen findet man übrigens so:
1. Excel öffnen
2. Alt + F12 drücken für VBA Manager
3. F2 drücken für Funktionsübersicht
Viel Spaß noch beim proggen.
Grüßle
Beitrag geändert: 18.7.2007 19:38:31 von scout -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage