Folgende Benutzer bedankten sich beim Autor Lukas Sanders für den Beitrag (Insgesamt 2):
msfox • ewx
Folgende Benutzer bedankten sich beim Autor Lukas Sanders für den Beitrag:
msfox
Hast du dafür mal "3 Zeilen" Quellcode?Lukas Sanders hat geschrieben: ↑14.05.2020 17:04Durch ein wenig Analyse des XML-Standards ist es uns gelungen, damit nicht nur Mergefields zu ersetzen,
Laut Blog nutzt diese Klasse aber OLE, was für Webdynpros eher nicht geeignet ist.Lukas Sanders hat geschrieben: ↑14.05.2020 17:04Ansonsten haben wir noch eine Klasse im Blick die Word-Dokumente "aus dem Nichts" erstellt und binär zurückliefert
Im Grunde wurden einfach die Mergefields vollständig durch Inhalt ersetzt, sie wurden also nur als Platzhalter eingefügt. Ungefähr nach diesem Muster (auf das eigentliche Programm habe ich leider keinen Zugriff mehr):msfox hat geschrieben: ↑12.09.2022 09:27Hast du dafür mal "3 Zeilen" Quellcode?Lukas Sanders hat geschrieben: ↑14.05.2020 17:04Durch ein wenig Analyse des XML-Standards ist es uns gelungen, damit nicht nur Mergefields zu ersetzen,
--
Soweit ich mir das technisch erkläre, übergab man bisher dem DOCX eine Liste mit Key/Value für die MergeFelder. Erst zur Laufzeit im ActivX (ACF) hat MS Office diese auf die MergeFelder geschrieben.
Jetzt muss das quasi vorher selbst machen.
Aber bleiben es dann MergeFelder oder ersetzt ihr das MergeFeld komplett durch den realen Inhalt?
Code: Alles auswählen.
* 1. Dokument irgendwo herholen und ggf. in XSTRING konvertieren
* 2. Dokument in Klasse CL_DOCX_DOCUMENT laden
CALL METHOD cl_docx_document=>load_document
EXPORTING
iv_data = xstring
RECEIVING
rr_doc = docx.
* 3. Inhaltsteil holen (als XML, XSTRING)
xml = docx->get_maindocumentpart( )->get_data( ).
* 4. XML in String umwandeln
string = CL_BCS_CONVERT=>XSTRING_TO_STRING( IV_XSTR = xml IV_CP = 'Codepage' ).
* 5. Für jedes Feld entsprechend Ersetzung vornehmen
REPLACE ALL OCCURRENCES OF '«Name_des_Mergefields»' IN string WITH wert.
Ich rufe die u.a. aus einer Fiori-Oberfläche über einen Webservice auf, das klappt bisher problemlos.msfox hat geschrieben: ↑12.09.2022 09:27Laut Blog nutzt diese Klasse aber OLE, was für Webdynpros eher nicht geeignet ist.Lukas Sanders hat geschrieben: ↑14.05.2020 17:04Ansonsten haben wir noch eine Klasse im Blick die Word-Dokumente "aus dem Nichts" erstellt und binär zurückliefert
Den Weg sind wir jetzt auch gegangen, nach der gleichen Logik. Nur Punk 5 ist etwas aufwendiger.Lukas Sanders hat geschrieben: ↑15.11.2022 07:55Im Grunde wurden einfach die Mergefields vollständig durch Inhalt ersetzt, sie wurden also nur als Platzhalter eingefügt.
Es gibt bei uns Kunden mit sehr vielen Dokumenten die noch in "doc" erstellt und irgendwo nur als "docx" gespeichert wurden. Dort sind die MERGE_FIELDS noch nicht duch « und » gekennzeichnet. D.h. man muss erst die Definition des MERGE_FIELDS (MergeID) ermitteln und erst die nächstfolgenden Zeichenkennte mit dieser ID ist dann der Teil, den man ersetzt. Die Ermittlung der Merge-ID ist auch nicht ohne, da die Kunden auch die Optionen für "Text davor" "Text danach" etc. verwenden. "Text davor" "Text danach" muss dann natürlich auch mit an diese Stelle kommen. Auch wird die Definition der Merge-ID mal als XML-Tag und mal als XML-Attribut gekennzeichnet.Lukas Sanders hat geschrieben: ↑15.11.2022 07:55Code: Alles auswählen.
* 5. Für jedes Feld entsprechend Ersetzung vornehmen REPLACE ALL OCCURRENCES OF '«Name_des_Mergefields»' IN string WITH wert.
Probleme dieser Art hatten wir auch, der gesamte Prozess war auch eher ein laufendes Experimentieren und Anpassen (heute würde man das vermutlich agil nennen). Bei Änderungen gibt es auch regelmäßig Anpassungsbedarf, allein weil unsere Lösung als Provisorium nicht besonders dynamisch gestaltet war (neues Feld = Programmänderung etc.).
Folgende Benutzer bedankten sich beim Autor Lukas Sanders für den Beitrag:
msfox