ods datei extern auslesen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

ods datei extern auslesen

Beitrag von Reginald »

Hallo zusammen,

wie man eine txt Datei von OO aus ausliest, kann man hier nachlesen:

http://wiki.services.openoffice.org/wik ... e_Library)

Kann man auch eine ods Datei von anderen Applikationan aus auslesen? Am besten mit php ...

Ich habe eine große ods Datei mit einer Art Anwesenheitsliste / Terminkalender, die hier im Shared Modus jeder benutzt, und daran kann ich auch nichts ändern, also die muß weitergeführt werden.

Ich möchte aber gerne Teile davon im Intranet veröffentlichen und am besten auch auf einige Teile schreibend zugreifen, so dass man auch ohne direkten Zugriff auf die Datei Terminänderungen hineinschreiben kann.

Geht so etwas?

Ansätze dazu??

Grüße

Reginald
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Hallo Reginald

Prinzipiell kannst du mit fast jeder Programmiersprache (also auch mit php) auf die LO oder OO API zugreifen,
und so auf jedes Dokument zugreifen, um es auszulesen, oder zu bearbeiten.
Voraussetzung ist natürlich, dass auf dem System LO oder OO installiert ist.
Ich kenne mich Leider nicht mit php aus, deshalb kann ich dir im speziellen nicht weiterhelfen.
Das einzige Beispiel, das ich auf die Schnelle gefunden habe ist hier: http://www.oooforum.org/forum/viewtopic.phtml?t=3474


Eine andere Möglichkeit, die Unabhängig von LO oder OO ist, wäre, dass du die ods-Datei entzipst,
und die XML-Files (aus denen die ods-Datei besteht) Direct bearbeitest.
Dies empfehle ich aber nur Profis, die sich mit der ODF-Spezifikation auskennen,
da du sonst ganz schnell die Datei Zerstören kannst.)

Gruß Frieder
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Hallo ,

ich habe noch mehr nützliche Links für dich:
wie es aussieht, brauchst du Puno.

Dort findest du auch ein par Beispiele.
Hier noch ein weiteres Beispiel:
http://www.oooforum.org/forum/viewtopic.phtml?t=69842
Gruß Frieder
Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

Re: ods datei extern auslesen

Beitrag von Reginald »

Hallo Frieder,

vielen Dank für die schnelle Antwort! Das werde ich mir einmal genauer anschauen!

Viele Grüße
Reginald
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Hallo Reginald

Ich habe ein wenig herumprobiert, und so ist es mir gelungen, Alles was du willst in PHP zu Programmieren.
Und zwar ohne Puno.

Das Makro Läuft bei mir unter Windows7 und PHP 5.3

-Es Überprüft, ob das Dokument bereits offen ist.
-Wenn nicht, versteckt öffnen.
-String in der Zelle A1 auslesen
-String in die Zelle A10 schreiben
-Dokument speichern
-Dokument Shließen
(Falls das Dokument offen bleibt, ist der nächste Zugriff natürlich schneller.)

Code: Alles auswählen

<?php 

//Pfad zur Datei
    $fname = "file:///C:/Users/Nansen/Documents/phpTest.ods" ;


    //echo("Starting COM"); 
    $osm = new COM("com.sun.star.ServiceManager") or die ("Local ServiceManager not initialized\n"); 
    //echo("Lokaler ServiceManager initialized\n"); 


    $odm = $osm->createInstance("com.sun.star.frame.Desktop") or die("Local Desktop not initialized\n"); 
    //echo("Local Desktop initialized\n");

    $comps = $odm->getComponents() or die ("GetComponents failed\n"); 
    $enum = $comps->createEnumeration() or die("createEnumeration of remote desktop components failed\n"); 
 
    $test = "False";
// Wenn es bereits offen ist, dann $Doc= das offen Dokument
    while ( $enum->hasMoreElements() && $test=="False") 
    { 
        $oElement = $enum->nextElement(); 
        $sURL = $oElement->getURL(); 
         //     echo ($sURL. "\n");

        if ($sURL==$fname)
         {

	   echo ("Datei: " . $fname ."\n   ist bereits offen.\n" );
           // Das Dokument ist jetzt $oDoc
           $oDoc = $oElement;
           $test = "True" ;
         }

 
    } 
// Wenn es noch nicht offen ist wird es Versteckt geöffnet.
if ($test!="True")
{
//sorgt dafür, dass Das dokument versteckt geöffnet wird
        $args=array(); 
        $prop1 = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue") or die("GetStruct failed\n");
        $prop1->Name="Hidden"; 
        $prop1->Value=True; 
        $args[0]=$prop1; 

    $oDoc = $odm->loadComponentFromURL( 
        $fname, 
        "_blank", 
        0, 
        $args ) or die("Local document not loaded. MAYBE FILE NOT FOUND?\n"); 
}
    $oSheets = $oDoc->Sheets;
    $oSheet =  $oSheets->getByName("Tabelle1");
    $oCell = $oSheet->getCellRangeByName("A2");
//String auslesen
    $sString = $oCell->getString();
echo($sString. "\n");
    $oCell = $oSheet->getCellRangeByName("A10");
    $oCell->setString("Neuer Text");
//Dokument Speichern
    $oDoc->store();
//Dokument schließen
    $oDoc->close(True);


echo("Done."); 
?> 
Da ich kein Profi in PHP bin, kann man den Code bestimmt noch verbessern.

Gruß Frieder
Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

Re: ods datei extern auslesen

Beitrag von Reginald »

Hallo Frieder,

das ist ja obercool!

Also funzt 1a!

Ich bin auch kein php Profi, kopiere mir immer nur etwas Code hier und da und versuche, das beste daraus zu machen, aber dein Makro läuft einwandfrei. Nutze xampp auf Win 7 Ultimate mit OOO 3.3 - alles in Englisch (mußte das Makro noch entsprechend anpassen, schließlich habe ich keine "Tabelle1" in meinem Dokument :-)

Habe das auch mal im shared mode von Calc probiert. Bin gerade unterwegs und kann es von daher nicht im Netzwerk ausprobieren, aber es scheint auch im shared mode zu laufen, denn ein typischer Fehler der auftritt, wenn man ein gesharetes Calc-Dokument auf einer Maschine versucht mehrfach aufzumachen und dann mit Änderungen zu speichern, tritt hier genau in dem Moment auf, wo ich das calc doc auf haben und die Website lade.

Cool!

Sag mal, kannst du mir noch ein Eingabefeld einbauen, wo man etwas frei einträgt, dass er dann in A10 reinschreibt? - Als Ansatz fürs Weitermachen?

Was ich letztlich vorhabe ist, das Calc Doc in php wie eine kleine Datenbank zu werden. Ich habe eine Tabelle mit 10 Spalten. Die erste Spalte ist der Name (Vorname und Nachname in einem Feld). Darüber soll auf der Website gesucht werden können. Dann soll der gesuchte Datensatz auf der Website angezeigt werden, Änderungen vorgenommen werden und diese dann in die Tabelle zurückgeschrieben werden. - Während im shared mode ein oder zwei andere User, die direkten Zugriff auf das Dokument im Netzwerk haben, ihre Sachen über Calc eingeben und speichern.


Grüße

Reginald
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Hallo Reginald

Ich habe dir mal eine Beispiel Homepage erstellt.
phpHomepage.zip
(12.02 KiB) 121-mal heruntergeladen
Sie Besteht aus 4 Unterseiten:
1.MainPage.php = Hauptseite mit Link auf ein Formular.
2.Formular1.html = Ein Formular, zum eingeben eines Neuen Datensatzes.

3.Datenauslesen.php = Ersellt eine Tabelle mit allen eingräten der ods-Datei.(wird auf der Hauptseite angezeigt)
4.NeuerDatensatz.php = Schreibt die Daten in die ods-Datei, und gibt Rückmeldedate + ein Link auf die Hauptseite.
In den Letzten beiden musst du natürlich noch den Pfad anpassen.


Die ods-Datei habe ich auch schon mitgeliefert.
Sie hat aber nur 5 Spalten, da es ja nur ein Beispiel ist.

Gruß Frieder
Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

Re: ods datei extern auslesen

Beitrag von Reginald »

Hey Frieder,

bei mir kommt noch die Fehlermeldung "Local document not loaded. MAYBE FILE NOT FOUND? "

Ich hatte den Pfad angepaßt. Habe das ganze dann noch einmal mit deinem Originalpfad getestet und einfach die Folder bei mir analog dazu angelegt (und noch die Zugriffsrechte gesetzt).

Also in beiden Fällen sieht man, dass im Hintergrund OO kurz aufgeht, bevor die Meldung kommt ...

--

Jetzt habe ich die Calcdatei manuell in Calc aufgemacht, und wenn ich dann die Mainpage.php parallel dazu aufmache, zeigt er mir die Daten korrekt an.

Wenn ich dann aber was schreiben will, sagt er:

Datei:
file:///C:/Users/Nansen/Documents/phpTest.ods
ist bereits offen.

Der Datensatz wurden erfolgreich gespeichert.

Zurück zur Hauptseite


Das stimmt ja nicht ganz, er schreibt ja nicht - kann er ja nicht, Datei ist ja schon geöffnet ...

Noch ne kleine Politur?

Grüße,
Reginald
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Hallo
Das stimmt ja nicht ganz, er schreibt ja nicht - kann er ja nicht, Datei ist ja schon geöffnet ...
Wenn die Datei bereits geöffnet ist, schreibt er die Daten bei mir problemlos in die Datei, und es kommt genau diese Meldung.

Ich hatte zuerst auch Probleme, das es das nicht schreiben konnte.
Bei mir lag es an Xampp (ApachewebServer+PHP+MySQL+...).
Die Lösung war bei mir, das ich Xamp deinstaliert habe, mir die Zip-Version heruntergeladen habe, und diese dann in das Stammverzeichnis "C:\" entpackt habe.
Anschließend "xampp_install.bat" ausführen, und alles lief.
(Der Benutzerkontenschutz (UAC = User Account Control) muss eventuell noch angepasst werden.)

Gruß Frieder
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Halo Reginald

ich habe den Fehler gefunden.

In "Datenauslesen.php" und "NeuerDatensatz.php"
In Zeile 46 Steht "$prop1->Value=Fals;" .
Es Muss aber heißen:"$prop1->Value=False; "
Es Fehlt jeweils das "e" am Ende.

Code: Alles auswählen

//sorgt dafür, dass Das dokument versteckt geöffnet wird
        $args=array(); 
        $prop1 = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue") or die("GetStruct failed\n");
        $prop1->Name="Hidden"; 
        $prop1->Value=False; 
        $args[0]=$prop1; 
P.S. Ich habe es jetzt so eingerichtet, das die Datei nicht versteckt geöffnet wird, wenn sie noch nicht offen ist.
Und sie wird zwar gespeichert, aber nicht mehr geschlossen.

Die Idee dahinter:
Wenn die Datei Offen ist, geht der Zugriff wesentlich schneller.
außerdem willst du doch parallel dazu in OO oder LO mit der Datei arbeiten.
Das geht aber nicht, wenn sie parallel-Versteckt geöffnet ist.

Gruß Frieder
Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

Re: ods datei extern auslesen

Beitrag von Reginald »

Hey Frieder,

super, das funktioniert!!

Das Ding ist echt cool, also man kann die Calc Datei quasi wie im Calc Shared Modus verwenden, nur dass sie gar nicht geshared ist. Ich weiß nicht, wie OO das macht, aber ich glaube nicht, das MS Excel das kann :-)

Also man kann die Datei tatsächlich offen haben und damit arbeiten und gleichzeitig werden Änderungen übers Web gemacht und dort hineingeschrieben, und das funzt auch alles absolut flott (zumindest auf meinem Netbook mit SSD).

So ein Makro gehört ins Standardrepertoire!

Vielen Dank!!!!

Reginald
Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

Re: ods datei extern auslesen

Beitrag von Reginald »

Hallo Frieder,

also ich bin immer noch ganz begeistert von dem Teil - oder mehr denn je!

Habe mich ein wenig in php eingearbeitet und das Ding aufgebohrt. Spalte 1 und 2 im Grid haben jetzt Benutzername und Kennwort, danach kommen dann etliche Spalten für Name, Adresse etc.

Loginscript, was auf Spalte 1 und 2 zugreift, und anschließend sieht man seinen eigenen Datensatz und kann ihn auch bearbeiten.

WIrd für eine Art Vereinsverwaltung verwendet.

Natürlich ist - theoretisch - eine Datenbank besser, aber derjenige, der mit dem Ding arbeiten soll, kennt sich mit Datenbanken nicht aus. - Mit Excel / Calc schon. Ist ja supersimpel.

Und das Ding ist auch echt superschnell. Also wenn das Grid geöffnet bleibt, dann kann man in Sekundenbruchteilen darauf zugreifen.

Auf einem Rechner lief es bisher nicht. Auf zwei anderen (in allen Fällen XAMP Light) einwandfrei.

Weißt du, ob das auch mit php unter Linux geht?

Weißt du, wie man Calc dazu bringen kann, dass Zahlen als Zahlen und nicht als Text - also nicht mit 'Hochkomma voran - in die Zellen geschrieben werden?


Grüße
Reginald
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Halo Reginald
Reginald hat geschrieben:Hallo Frieder,
Weißt du, ob das auch mit php unter Linux geht?
Ja natürlich geht das auch unter Linux.
Die Anleitung zur Installation und für den Betrieb findest du hier.
Reginald hat geschrieben: Weißt du, wie man Calc dazu bringen kann, dass Zahlen als Zahlen und nicht als Text - also nicht mit 'Hochkomma voran - in die Zellen geschrieben werden?
Ja das ist ganz einfach. Du musst statt der Methode

Code: Alles auswählen

$oCell->setString("meinString");
die Methode

Code: Alles auswählen

$oCell->setValue (23.6);
verwnenden.

Mit setString() werden die werde als Text (String) geschrieben. Damit OO oder LO weiß,
dass die Zahl als Text behandelt werden soll, wird ein Hochkomma davor gesetzt.

Mit setValue (23.6) wird eine Zahl geschrieben.(also ohne Hochkomma.)

Du kannst entweder mit einer If Abfrage in der schleife entscheiden,
ob ein String oder eine Zahl geschrieben werden soll,
oder du verzichtest auf eine schleife, und schreibst für jede Zelle eine eigene Zeile.

Hier ein Beispiel mit automatischer Erkennung:
Zum Testen:

Code: Alles auswählen

 <?php 
$Text[0] = "Text 123" ;
$Text[1] =  "-3.6"      ;
$Text[2] =  "3,789789" ;
$Text[3] =   3.534566890 ;
$Text[4] =   "-4.8e10" ;
  for ($i = 0; $i <= 4; $i++) 
   {

      If   (is_numeric($Text[$i]) )
      {
       Echo $Text[$i]." ist numerisch  <br>";
      } else
      {
       Echo $Text[$i]." ist nicht numerisch  <br>";
      }
   }
?>
und so ungefähr müsste es dann in deinem Code aussehen.

Code: Alles auswählen

  for ($i = 0; $i <= 4; $i++) 
   {
    $oCell = $oSheet->getCellByPosition($i,$LastRow+1);
      If  ( is_numeric($Text[$i]) )
      {
       $oCell->setValue($Text[$i]);
      } else
      {
       $oCell->setString($Text[$i]);
      }
   }
Gruß Frieder
Zuletzt geändert von Frieder D. am Mo, 19.03.2012 17:56, insgesamt 1-mal geändert.
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

Halo Reginald

Hier noch ein Nachtrag:

wenn deine Zahl Nachkommastellen hat, so müssen diese natürlich mit einem Punkt getrennt werden (Englische Schreibweise), damit es funktioniert.

Falsch: 4,45

Richtig: 4.45

Gruß Frieder
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: ods datei extern auslesen

Beitrag von Frieder D. »

P.P.S

Wenn eine Kommazahl in deinem Formular mit "," getrennt eingegeben werden soll, so kannst du sie nachträglich natürlich in eine "." getrennte Zahl umwandeln:

Code: Alles auswählen


$Text[2] =  "3,789789" ;
$Text[2] = str_replace(",", ".", $Text[2]);
// ergibt : $Text[2] = "3.789789"  also numerisch.

Hier die Anleitung für str_replace() .

Gruß Frieder
Antworten