API: Daten in Calc speichern

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

Moderator: Moderatoren

Peter18
Beiträge: 3
Registriert: Mo, 27.07.2020 11:43

API: Daten in Calc speichern

Beitrag von Peter18 »

Ein freundliches Hallo an alle,

ich lese mit Pascal Daten aus einer Calc-Tabelle. Nun möchte ich auch Daten ändern und speichern.

Mit

Code: Alles auswählen

      Par          := VarArrayCreate([0, 0], varVariant);   // [lowest index, highest index]
      oOpenOffice  := CreateOleObject('com.sun.star.ServiceManager')                    ;
      Par[0]       := oOpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')  ;
      Par[0].Name  := 'Hidden'                                                          ;
      Par[0].Value := True                                                              ;
      oStarDesktop := oOpenOffice.createInstance('com.sun.star.frame.Desktop')          ;
      oFCP         := oOpenOffice.createInstance('com.sun.star.ucb.FileContentProvider');
      Path         := oFCP.getFileURLFromSystemPath('', oFilNam)                        ;
      oFil         := oStarDesktop.loadComponentFromURL( Path, '_blank', 0, Par )       ;
      oTab         := oFil.Sheets.getByName( oShNam )                                   ;
öffne ich eine Tabelle und lese die Daten. Danach wird die Tabelle wieder geschlossen:

Code: Alles auswählen

  oFil.close(true)          ;
  oTab         := unassigned;
  oFil         := unassigned;
  oFCP         := unassigned;
  oDisp        := unassigned;
  if not VarIsEmpty( oStarDesktop ) then 
                                         oStarDesktop.terminate;
  oStarDesktop := unassigned;
  oOpenOffice  := unassigned;
Nun möchte ich Daten ändern und in der Tabelle speichern. Dazu wird die Tabelle wie oben geöffnet und die geänderten Daten in die Zellen geschrieben. Beim Speichern gibt es bei "oFil.store(); eine Fehlermeldung, wenn ich aber "oFil.storeAsURL( oFil.Url, Par );" verwende funktioniert es!

Fehlt da noch irgend etwas? Hat jemand einen Tipp, warum das so ist???

Grüße von der Nordsee

Peter
Zuletzt geändert von Peter18 am Do, 04.02.2021 10:32, insgesamt 1-mal geändert.
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: API: Daten in Calc speichern

Beitrag von Hiker »

Erstmal für alle die den bisherigen Verlauf nicht kennen, der Crosspost-Hinweis:
https://www.openoffice-forum.de/viewtop ... 1&t=124991

Hallo Peter,

Du bist der erste Pascal-Programmierer den ich hier sehe. Welchen Compiler nutzt Du (fpc, embacadero, ...) und woher kommt die API-Anbindung?
Das Du unter Windows arbeitest konnte ich dem obigen Thread entnehmen und ich rate Mal: Openoffice statt Libre.... Welche Version?

Kannst Du ein komplettes Testprogramm anhängen?
Ich bin mir derzeit nichtmal sicher ob Dein Pascal direkt ans API geht oder Uno-Befehle über den Desktop schleust bzw. Office via Socket ferngesteuert wird.

Die Python-Programmierer müssten einen Teil Deiner Probleme schon gelöst haben - hoffe ich...

MfG, Jörn
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Peter18
Beiträge: 3
Registriert: Mo, 27.07.2020 11:43

Re: API: Daten in Calc speichern

Beitrag von Peter18 »

Hallo Jörn,

Dank Dir für Deine Antwort!

Ich habe "OpenOffice 4.1.1" installiert und verwende Delphi 4. C wäre mir zwar lieber gewesen, aber Delphi hat einige Vorteile. System ist Win.

Wie Du oben siehst werden 2 Objekte erzeugt: 'com.sun.star.frame.Desktop' und 'com.sun.star.ucb.FileContentProvider'. Die sollten eigentlich über die API gehen. Einiges habe ich aus Beispielen genommen, z.B. Delphi_OOo_v12en.zip. (Hänge ich hier an) "DevelopersGuide_OOo3.1.0_07TextDocuments.odt" und andere Beschreibungen waren auch im Spiel. Mit einem Testprogramm ist das nicht so einfach, weil ich da diverse Schnittstellen zu unterschiedlichen Dateitypen eingebunden habe, um eine einheitliche Schnittstelle verwenden zu können.

Die Texte, die ich oben eingestellt habe sind die zentralen Elemente. An sonsten sind da nur Routinen zwischen, mit denen ich Tabellen auslese und Änderungen zurückschreibe.

Wie Du in dem anderen Thread gesehen hast, haben die Methoden "oFil.store( );" und "oFil.storeAsURL( oFil.Url, Par );" immer nur ein mal funktioniert, wenn das System frisch gestartet war. Nach Einfügen von "oStarDesktop.terminate;" funktionierte "oFil.storeAsURL( oFil.Url, Par );" immer aber "oFil.store( );" nicht. Da scheint noch was zu fehlen oder?

Grüße von der momentan sonnigen Nordsee

Peter
Dateianhänge
Delphi_OOo_v12en.zip
(227.2 KiB) 89-mal heruntergeladen
Antworten