OpenOffice Serienbrief mit AutoIT füllen 7ZIP

  • Hallo Community,

    leider finde ich im Forum oder Google keine passende Antwort.

    Ich möchte einen Serienbrief, welchen ich als ODT gespeichert habe, mit AutoIT füllen und drucken (notfalls auch Zwischenspeichern).
    Das ganze mit Word hatte ich bereits realisiert, leider haben wir jetzt auf OpenOffice umgestellt und hier bekomme ich das ganze nicht hin.

    Hier ein Auszug aus der Wordumsetzung:

    [autoit]


    $oWord = ObjCreate("Word.Application")
    $oWord.Visible = 0
    $oWordDocuments = $oWord.Documents
    $oWordDocument = $oWordDocuments.Open($document)
    $mm = $oWordDocument.MailMerge
    $mm.OpenDataSource("", 0, False, False, False, False, "", "", False, "", "", "XXXX")
    $mm.Destination = 1
    $mm.ViewMailMergeFieldCodes = 9999998
    $oWord.ActiveDocument.PrintOut
    _WordDocClose ( $oWord, 0,0, 0 )
    $oWord.ActiveDocument.Close False
    $oWord.Quit

    [/autoit]

    Hat hier jemand bereits Erfahrungen gemacht, oder einen nützlichen Link?

    Vielen Dank,
    Saft

    2 Mal editiert, zuletzt von Saft (3. März 2011 um 15:07)

    • Offizieller Beitrag

    Hi,

    .odt ist ein gezipptes XML-Format. Das heißt, du kannst die Datei mit einem Zip-Programm auspacken, dann in der richtigen Datei mit FileRead, StringReplace, FileWrite die Daten austauschen und das ganze wieder zippen und .pdt nennen. So sollten sich die Daten austauschen lassen.

    Johannes

  • Das ist schon mal super, wusste ich nicht.
    Leider gibt es den Nachteil, dass ich jedes Formelfeld einzeln in AutoIT programmieren müsste (sind wirklich viele).

    Gibt es hier keine API oder ähnliches, damit ich es wie in Word abbilden kann?

  • Meine Datenquelle sieht so aus:

    [autoit]

    Global $sqlConMSSQL = ObjCreate("XXX.Connection")
    $sqlConMSSQL.Open("Provider=SQLOLEDB; Data Source=" & $server & "; User ID=" & $benutzer & "; Password=" & $passwort & "; database=" & $datenbank & ";")

    [/autoit]


    wie man das nennt, gute Frage ^^
    Mein Plan wäre es, die Formelfelder, die es im Dokument gibt, gegen die Datenquelle zu schießen.

    Die Links hatte ich auch schon mal gefunden, da bin ich aber leider geistig ausgestiegen :/
    Notfalls muss ich mich mal richtig hinsetzten, um das zu verstehen.

  • Hallo nochmals,

    ich versuche jetzt die Version mit dem entpacken.
    Leider habe ich ein Problem, das entpacken funkioniert wunderbar:
    "J:\7z.exe" a -tzip "C:\Test.zip" "C:\Temp\Test\"

    Nur leider wenn ich das ganze wieder in eine zip packe und mit FileMove in ODT umbenenne, kann ich diese mit OpenOffice nicht öffnen.

    Woran kann das liegen?

  • Super, ich werde es probieren.

    Falls das nicht geht habe ich einen Plan B:
    Ich versuche jetzt anstatt die ZIP zu entpacken und eine neue zu erstellen nur die content.xml zu entpacken und später in die vorhandene ZIP einzufügen.

    Sobald es funkioniert, werde ich mein Code hier posten, oder ich muss euch nochmal mit Fragen belästigen :)

  • Vorausetzung:
    7z.exe und 7z.dll in einem Ordner 7zip im Scriptordner

    $temp = Tempordner, in dem das Zeug zwischengespeichert wird.
    $Dokumentenname = Der Name der Datei, befindet sich bei mir im Tempordner

    [autoit]

    $odtfile = $temp & $dokumentenname & ".odt"
    $zipfile = $temp & $dokumentenname & ".zip"

    [/autoit][autoit][/autoit][autoit]

    ;~ ;Umbenennen der ODT in ZIP
    While FileMove($odtfile,$zipfile) <> 1
    Sleep(500)
    Wend
    ;~
    ;~ ;Entpacken der CONTENT.XML
    $befehl = """" & @Scriptdir&"\7zip\7z.exe""" & " e """ & $zipfile&"""" & " -o""" & $temp &$dokumentenname&"\"& """" & " content.xml -r"
    RunWait($befehl,"",@SW_HIDE )

    [/autoit][autoit][/autoit][autoit]

    ;~ ExitFileWriteFromArray

    [/autoit][autoit][/autoit][autoit]

    ;Abändern der CONTENT.XML
    $ContentXMLinhalt = FileRead($temp &$dokumentenname&"\" & "content.xml")

    [/autoit][autoit][/autoit][autoit]

    ;Hier das Zeug mit der ContentXML machen, was man haben will.

    [/autoit][autoit][/autoit][autoit]

    FileDelete($temp &$dokumentenname&"\" & "content1.xml")
    _FileCreate($temp &$dokumentenname&"\" & "content.xml")
    FileWrite($temp &$dokumentenname&"\" & "content.xml",$ContentXMLinhalt)
    ;~ Hinzufügen der CONTENT.XML zur ZIP
    RunWait("""" & @Scriptdir&"\7zip\7z.exe""" & " u """ & $zipfile&"""" & " """ & $temp &$dokumentenname&"\" & "content.xml"&"""","",@SW_HIDE )

    [/autoit][autoit][/autoit][autoit]

    ;~ ;Umbenennen der ZIP in ODT
    FileMove($zipfile,$odtfile)

    [/autoit]

    Das funktioniert soweit, jetzt muss ich nur noch die Formelfelder richtig abändern :)