Lazarus und LibreOffice Writer (Openoffice Automation)

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 987
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 20.2 Cinnamon / FPC 3.2.2/Lazarus 2.0.12
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von MacWomble »

Steh ich auf dem Schlauch oder ist das wirklich nicht machbar?

Ich habe mehrere odt-Dateien mit Platzhaltern. Diese sollen aus der Lazarus-Applikation (Windows und LINUX !) mit entsprechenden Daten befüllt werden.
Ich stelle mir das so vor:
1. Es gibt odt-Dateien als Vorlagedatei(en) mit Platzhaltern.
2. Die Anwendung kopiert die gewünschte odt-Datei bei Bedarf und ersetzt in der Kopie die Platzhalter durch Werte aus einer csv-Datei oder der Datenbank
3. Die Anwendung startet Libreoffice mit der neuen odt-Datei

Mein Problem:
- Die Serienbrieffunktion ist hierfür nicht brauchbar, da die Daten nicht statisch ins Dokument überführt werden. Dieser Weg ist auch reichlich kompliziert.
- LO-Bereiche funktionieren leider nicht, da die Daten nur verknüpft und nicht im Dokument eingebunden werden.
- rtf scheidet wegen massiver Unregelmäßigkeiten aus
- die content.xml zu Entpacken und die Platzhalter zu ersetzen wäre eine Möglichkeit, jedoch fehlt mir hier der Ansatz.

Seit Tagen versuche ich hier eine gangbare Lösung zu finden, leider bisher ohne richtigen Erfolg.
Gibt es eine Komonente oder fertigige Routinen für diese Problematik - oder einfach einen guten Tipp, wie so etwas am besten zu realisieren geht?

Danke für eure Hilfe
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
theo
Beiträge: 8706
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von theo »

MacWomble hat geschrieben:- die content.xml zu Entpacken und die Platzhalter zu ersetzen wäre eine Möglichkeit, jedoch fehlt mir hier der Ansatz.


Mit den Units:
zipper, XMLRead, XMLWrite, DOM
wären alle Bordmittel da für dieses Vorhaben.

http://wiki.freepascal.org/paszlib
http://wiki.lazarus.freepascal.org/XML_Tutorial/de

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von wp_xyz »

Selbst nie probiert, aber vielleicht hilft das: http://forum.lazarus.freepascal.org/ind ... #msg128463

MacWomble
Lazarusforum e. V.
Beiträge: 987
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 20.2 Cinnamon / FPC 3.2.2/Lazarus 2.0.12
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von MacWomble »

Danke für die Tipps!

Für meine Aufgabe scheint das aber alles viel zu kompliziert zu sein. Jedoch hat der Tipp mit Zipper weiter geholfen:

Ich entpacke nun die odt, ersetze in content.xml und styles.xml die Texte in meinen eigenen Platzhaltern (#NAME#) mit StringReplace und packe alles wieder zusammen. Funktioniert so weit wunderbar.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 987
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 20.2 Cinnamon / FPC 3.2.2/Lazarus 2.0.12
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von MacWomble »

nun habe ich doch noch ein Problem welches ich nicht gelöst bekomme.

Code: Alles auswählen

slData[i] := StringReplace(slData[i], '#SACHE#',  UTF8Decode (dtmVorgang.qryVorgangAktenKurz.AsString), [rfReplaceAll]);


in qryVorgangAktenKurz ist ein Eintrag ,ist einem Kaufmanns-Und (&), welcher als XML-Fehler beim Öffnen der ODT angezeigt wird. Ich habe schon alles mögliche mit UTF8-Umwandlung probiert, aber nichts hilft. Wo liegt mein Fehler?
Umlaute dagegen funktionieren scheinbar.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von wp_xyz »

Ersetze mal das "&" durch das HTML-Äquivalent "&"

MacWomble
Lazarusforum e. V.
Beiträge: 987
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 20.2 Cinnamon / FPC 3.2.2/Lazarus 2.0.12
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von MacWomble »

Dann geht es, das ist schon klar - aber gibt es denn nicht noch mehr Sonderzeichen, die man dann umsetzen muss - und wenn ja:
gibt es hierfür keine Funktion?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von wp_xyz »

In fpspreadsheet wird das "Schwesterformat" .ods für die Tabellenkalkulation Calc geschrieben. Dort wird die folgende Funktion verwendet, um die in XML nicht erlaubten Zeichen umzuwandeln:

Code: Alles auswählen

 
function UTF8TextToXMLText(AText: string): string;
var
  Idx:Integer;
  WrkStr, AppoSt: string;
begin
  WrkStr:='';
  for Idx:=1 to Length(AText) do
  begin
    case AText[Idx] of
      '&':
        begin
          AppoSt:=Copy(AText, Idx, 6);
          if (Pos('&',  AppoSt) = 1) or
             (Pos('<',   AppoSt) = 1) or
             (Pos('>',   AppoSt) = 1) or
             (Pos('"', AppoSt) = 1) or
             (Pos(''', AppoSt) = 1) then begin
            //'&' is the first char of a special chat, it must not be converted
            WrkStr:=WrkStr + AText[Idx];
          end else begin
            WrkStr:=WrkStr + '&';
          end;
        end;
      '<': WrkStr:=WrkStr + '&lt;';
      '>': WrkStr:=WrkStr + '&gt;';
      '"': WrkStr:=WrkStr + '&quot;';
      '''':WrkStr:=WrkStr + '&apos;';
    else
      WrkStr:=WrkStr + AText[Idx];
    end;
  end;
  Result:=WrkStr;
end;

MacWomble
Lazarusforum e. V.
Beiträge: 987
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 20.2 Cinnamon / FPC 3.2.2/Lazarus 2.0.12
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von MacWomble »

Danke, das ist ja recht überschaubar.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

ErnstVolker
Beiträge: 263
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von ErnstVolker »

Hallo zusammen,

ich hänge mich mal mit meinen Fragen an diesen Beitrag. Es geht mir um die Automatisierung von LibreOffice Calc mit Lazarus.

Hier finden sich Beispiele: https://wiki.lazarus.freepascal.org/CalcAutomation/de
In einem Beispiel findet sich diese Zeile:

Code: Alles auswählen

varCLApp := CreateOleObject('com.sun.star.ServiceManager');

Funktioniert hier auch

Code: Alles auswählen

varCLApp := GetActiveOleObject('com.sun.star.ServiceManager');?
Dann könnte Lazarus aus einer laufenden Calc-Sitzung heraus angesprochen werden, oder?

Hat das von Euch schon mal jemand gemacht? Oder aber ein ein "AddInn" für LibreOffice-Calc mit Lazarus programmiert?

Wenn ja, funktioniert dann auch GUI? Sprich aus LO öffnet sich ein Lazarus-Fenster und man kann Zahlen, Texte etc. aus der Laz-GUI in die Tabelle schreiben.

Meine Frage scheint merkwürdig zu sein, aber ich habe die Erfahrung gemacht, dass man mit Python als Makroprogrammiersprache in LO keine wxWidgets GUI's oder Qt-GUI's verwenden kann. Siehe hier: https://www.python-forum.de/viewtopic.php?t=43994 Man muß das von LO verwaltete GUI-Toolkit via Python ansprechen. Als Alternative zu LO-Basic. Das geht auch. Ich finde es nur umständlich. Deshalb meine Frage ob man mit der Lazarus-IDE eine GUI bauen kann, die dann unter LO läuft ohne LO zum Absturz zu bringen.

Ich habe mal was mitbekommen, dass man mit Lazarus DLL-Dateien erstellen kann, die auch GUI enthalten. Dann könnte man doch theoretisch sich eine DLL proggen die man dann von LO aus mit dessen Basic lädt. Oder auch eine *.exe-Datei aufruft, die Verbindung zur laufenden LO-Instanz via "GetActiveOleObject" aufnimmt.

Ole ist doch windowsspezifisch, oder? D.h. die die Befehle "CreateOleObject" bzw. "GetActiveOleObject" funktionieren unter Linux und MacOs nicht, richtig? Wie würde man da dann auf den 'com.sun.star.ServiceManager' zugreifen?

Vielen Dank und viele Grüße

Volker

PascalDragon
Beiträge: 394
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Lazarus und LibreOffice Writer (Openoffice Automation)

Beitrag von PascalDragon »

Unter nicht-Windows lautet das Stichwort Universal Network Objects, was quasi etwas ähnliches wie COM/OLE ist. Es gibt hier eine UNO Bridge für Delphi, die wohl auch mit FPC funktioniert, aber der Code ist von Anno Tobak, also keine Ahnung wie gut der funktioniert (die auf der Seite erwähnten Probleme könnten mittlerweile sogar gelöst sein). Aber vielleicht kannst du damit was basteln...
FPC Compiler Entwickler

Antworten