kostenloser Webspace werbefrei: lima-city


PHP und Excel -> COM

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. e********l

    Welche EIgenschaften hat denn so ein Com Objekt? Das muss doch in der Dokumentation stehen.
  4. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    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...
  5. e********l

    Dann lass dir mal mit var_dump() bzw. print_r() dein Objekt ausgeben, dann kannst du sehen welche Eigenschaften und Methoden besitzt.
  6. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    hilft nicht wirklich weiter...
    object(variant)#2 (0) { } variant Object
  7. e********l

    muss Name() vllt. klein geschrieben werden? Oder die Funktionsklammern weglassen?
  8. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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
  9. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    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.
  10. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.


    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 ...
  11. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    ok danke erstmal... es funktioniert nun.
    das $ zeichen fehlt in der for schleife vor dem max ;)

    ADanke für die tips!
  12. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    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?
  13. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Jop, hab 'ne Idee:

    $c = wkb->Worksheets[$art]->Range("a1:k10")->Find("Hostname", "xlValues", "xlWhole");


    Kann das funktionieren?
  14. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    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!
  15. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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
  16. Autor dieses Themas

    quakewars

    quakewars hat kostenlosen Webspace.

    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.
  17. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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
  18. 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
  19. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!