Bitte um Hilfe
Seriendruck analog zu MS-Word ( <<PLZ>> und INCLUDE Datei)
Ich habe eine Vorlage in der ich Platzhalter (wie in MS-Word <<STRASSE>> <<PLZ>> usw habe,
zusätzlich möchte ich Text aus einem anderen .odt Dokument einbinden
(zb: wenn ich im Text den Platzhalter
INLCUDE C:\Öffnungszeiten_Wien.odt
finde, soll der Text eingelesen in eine Variable od. Array gelesen werden.
Wie kann ich ein Dokument lesen (ca 5-10 Zeile) und in einer Variablen
ablegen.
Meine Versuchen gingen alle nicht
Dim Doc
Dim sPath as String
Dim sVar
sPath = ConvertToURL("C:\Öffnungszeiten_Wien.odt")
'Open the document in the _hidden frame
dim myFileProp(0) as New com.sun.star.beans.PropertyValue
myFileProp(0).name="Hidden"
myFileProp(0).value=True
Doc = StarDesktop.loadComponentFromURL(sPath, "_blank", 0, myFileProp() )
wie kann ich den Text in eine Variable bekommen
danke F.P
Seriendruck analog zu MS-Word
Moderator: Moderatoren
Re: Seriendruck analog zu MS-Word
z.B.wie kann ich den Text in eine Variable bekommen
Code: Alles auswählen
sPath = ConvertToURL("C:\Öffnungszeiten_Wien.odt")
dim myFileProp(0) as New com.sun.star.beans.PropertyValue
myFileProp(0).name="Hidden"
myFileProp(0).value=True
Doc = StarDesktop.loadComponentFromURL(sPath, "_blank", 0, myFileProp() )
mytextCursor=Doc.text.createtextcursor()
mytextCursor.gotoEnd(true)
MeinTextInVariable = mytextCursor.String
Doc.Close(True)
Msgbox MeinTextInVariable
Gruß
Stephan
Re: Seriendruck analog zu MS-Word
Herzlichen Dank, funkt SUPER!
Seriendruck analog zu MS-Word, viele Probleme
Hallo!
Da hab ich mir was angefangen!
ZWECK:
Seriendruckumstellung von MS-Word auf OO-Writer
WAS/WIE nache ich das
1) Seriendruckfelder ersetzen (siehe weiter unten )
funktioniert
2) In den Word Vorlagen gibt es auch Bedinungsfelder
IF {MERGEFIELD LetzteBestellung} <> "" .......
diese Felder muss ich vorher unter Feldbefehl,andere,..
als Variable deklarieren und kann sie nicht mehr wie unter Punkt 1 mit den Daten befüllen, da sollte dann auch die Bedingung ziehen.
Gibt es da eine andere Lösung??
3) Tabellen im Writer (in diesen Tabellen sind ebenfalls Seriendruckfelder. Im 1. Durchgang werden die Werte eingetragen und
angezeigt, dann muss ich aber auch noch die Berechnung aufrufen. Derzeit habe ich noch keine Möglichkeit gefunden im Makro
die Funktion "Felder aktualisieren = F9" aufzurufen
Gibt es da eine Lösung?
-- SERIENDRUCKFELDER ERSETZEN----
-- Daten für Seriendruck --
-- über 100 Datenfelder sind da drinnen
-- ich lese diese in ein array ein
-- zuerst die 1.Zeile mit den Feldnamen
-- dann die anderen Zeilen mit den Daten
SERIENDRUCK-DATEN
------------------
Vorname;Familienname;Geburtsdatum;Geschlecht;LetzteBestellung;Saldo
"Franz";"Meier";"12.12.1912","M";"";"100,00"
VORLAGE
-------
<Vorname> <Familienname>
....
IF {MERGEFIELD LetzteBestellung} <> "" "Danke für Ihre letzte Bestellung vom <LetzteBestellung>"
DATEN EINLESEN
-------------------
a1=Split(p1,";")
count = 0
sPath = ConvertToURL("c:\mischdaten\Daten.txt")
oFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oInputStream = oFileAccess.openFileRead(sPath)
oFileRead = createUnoService("com.sun.star.io.TextInputStream")
oFileRead.InputStream = oInputStream
oFileRead.Encoding = "ISO-8859-15"
oCursor = oDoc.Text.createTextCursor
Dim aPLH(500) --Platzhalter = FELDNAMEN
Dim aINH(500) --Inhalt = DATEN
Do While NOT oFileRead.IsEOF
sCurrentLine = oFileRead.readLine
aLines = Split(sCurrentLine,";")
'dim aPLH(UBound(aLines))
'dim aINH(UBound(aLines))
' --- Lesen der Feldnamen (werden im Text dann in Text in spitzen Klammern verwendet <FELDNAMEN>
For i = 0 to UBound(aLines)
aPLH(i) = "<"& aLines(i) & ">"
Next i
' -- weiterlesen zu den Daten, dort die Hochkomma entfernen
sCurrentLine = oFileRead.readLine
aLines = Split(sCurrentLine,";")
For i = 0 to UBound(aLines)
if left(aLines(i),1) = chr$(34) THEN
aINH(i) = Mid( aLines(i),2,Len(aLines(i)) -2)
end if
Next i
Loop
'-- dann werden alle Felder in der Vorlage welche mit <FELDNAME>
'-- aus dem Array aPLZ(i) übereinstimmen mit den Daten ersetzt
for i = 0 to uBound(aPLH())
trageEin(oDoc, aINH(i), aPLH(i)
next
........
REM diese Funktion ersetzt die Platzhalter im Dokument
sub trageEin(oDokument as object, sNeuTxt as string, sPlatzhalter as string)
oSuche = oDokument.createReplaceDescriptor()
with oSuche
.setSearchString(sPlatzhalter)
.setReplaceString(sNeuTxt)
end with
oDokument.replaceAll(oSuche)
end sub
-- BIN ICH NOCH ZU RETTEN ? --
Danke für jede Hilfe und lg
F.P
Da hab ich mir was angefangen!
ZWECK:
Seriendruckumstellung von MS-Word auf OO-Writer
WAS/WIE nache ich das
1) Seriendruckfelder ersetzen (siehe weiter unten )
funktioniert
2) In den Word Vorlagen gibt es auch Bedinungsfelder
IF {MERGEFIELD LetzteBestellung} <> "" .......
diese Felder muss ich vorher unter Feldbefehl,andere,..
als Variable deklarieren und kann sie nicht mehr wie unter Punkt 1 mit den Daten befüllen, da sollte dann auch die Bedingung ziehen.
Gibt es da eine andere Lösung??
3) Tabellen im Writer (in diesen Tabellen sind ebenfalls Seriendruckfelder. Im 1. Durchgang werden die Werte eingetragen und
angezeigt, dann muss ich aber auch noch die Berechnung aufrufen. Derzeit habe ich noch keine Möglichkeit gefunden im Makro
die Funktion "Felder aktualisieren = F9" aufzurufen
Gibt es da eine Lösung?
-- SERIENDRUCKFELDER ERSETZEN----
-- Daten für Seriendruck --
-- über 100 Datenfelder sind da drinnen
-- ich lese diese in ein array ein
-- zuerst die 1.Zeile mit den Feldnamen
-- dann die anderen Zeilen mit den Daten
SERIENDRUCK-DATEN
------------------
Vorname;Familienname;Geburtsdatum;Geschlecht;LetzteBestellung;Saldo
"Franz";"Meier";"12.12.1912","M";"";"100,00"
VORLAGE
-------
<Vorname> <Familienname>
....
IF {MERGEFIELD LetzteBestellung} <> "" "Danke für Ihre letzte Bestellung vom <LetzteBestellung>"
DATEN EINLESEN
-------------------
a1=Split(p1,";")
count = 0
sPath = ConvertToURL("c:\mischdaten\Daten.txt")
oFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oInputStream = oFileAccess.openFileRead(sPath)
oFileRead = createUnoService("com.sun.star.io.TextInputStream")
oFileRead.InputStream = oInputStream
oFileRead.Encoding = "ISO-8859-15"
oCursor = oDoc.Text.createTextCursor
Dim aPLH(500) --Platzhalter = FELDNAMEN
Dim aINH(500) --Inhalt = DATEN
Do While NOT oFileRead.IsEOF
sCurrentLine = oFileRead.readLine
aLines = Split(sCurrentLine,";")
'dim aPLH(UBound(aLines))
'dim aINH(UBound(aLines))
' --- Lesen der Feldnamen (werden im Text dann in Text in spitzen Klammern verwendet <FELDNAMEN>
For i = 0 to UBound(aLines)
aPLH(i) = "<"& aLines(i) & ">"
Next i
' -- weiterlesen zu den Daten, dort die Hochkomma entfernen
sCurrentLine = oFileRead.readLine
aLines = Split(sCurrentLine,";")
For i = 0 to UBound(aLines)
if left(aLines(i),1) = chr$(34) THEN
aINH(i) = Mid( aLines(i),2,Len(aLines(i)) -2)
end if
Next i
Loop
'-- dann werden alle Felder in der Vorlage welche mit <FELDNAME>
'-- aus dem Array aPLZ(i) übereinstimmen mit den Daten ersetzt
for i = 0 to uBound(aPLH())
trageEin(oDoc, aINH(i), aPLH(i)
next
........
REM diese Funktion ersetzt die Platzhalter im Dokument
sub trageEin(oDokument as object, sNeuTxt as string, sPlatzhalter as string)
oSuche = oDokument.createReplaceDescriptor()
with oSuche
.setSearchString(sPlatzhalter)
.setReplaceString(sNeuTxt)
end with
oDokument.replaceAll(oSuche)
end sub
-- BIN ICH NOCH ZU RETTEN ? --
Danke für jede Hilfe und lg
F.P
Re: Seriendruck analog zu MS-Word
Ja - erstelle ein normale Seriendruckvorlage in Writer und vergiss dieses Makrogewurstel.Bin ich noch zu retten
Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)