Lazarus und LibreOffice Writer (Openoffice Automation)
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Lazarus und LibreOffice Writer (Openoffice Automation)
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
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.
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
Mit den Units:MacWomble hat geschrieben:- die content.xml zu Entpacken und die Platzhalter zu ersetzen wäre eine Möglichkeit, jedoch fehlt mir hier der Ansatz.
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
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
Selbst nie probiert, aber vielleicht hilft das: http://forum.lazarus.freepascal.org/ind ... #msg128463
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
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.
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.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
nun habe ich doch noch ein Problem welches ich nicht gelöst bekomme.
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.
Code: Alles auswählen
slData[i] := StringReplace(slData[i], '#SACHE#', UTF8Decode (dtmVorgang.qryVorgangAktenKurz.AsString), [rfReplaceAll]);
Umlaute dagegen funktionieren scheinbar.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
Ersetze mal das "&" durch das HTML-Äquivalent "&"
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
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?
gibt es hierfür keine Funktion?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
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 + '<';
'>': WrkStr:=WrkStr + '>';
'"': WrkStr:=WrkStr + '"';
'''':WrkStr:=WrkStr + ''';
else
WrkStr:=WrkStr + AText[Idx];
end;
end;
Result:=WrkStr;
end;
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Lazarus und LibreOffice Writer (Openoffice Automation)
Danke, das ist ja recht überschaubar.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Beiträge: 353
- 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)
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:
Funktioniert hier auch
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
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');?
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
-
- Beiträge: 955
- 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)
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