Seite 1 von 1

Mail Merge in Datei füllt die Felder nicht

Verfasst: Di, 30.04.2019 09:49
von pkuenemann
Hallo,

ich bin völlig neu in dem Thema OO-API und habe mich daher an bestehenden Beispielen entlang gehangelt. Ich versuche aus access (2016) mit vba Serienbriefe in Dateien zu erstellen. Ich verwende Windows 10 und AOO 4.1.5. Die Serienbrief-Dokumente funktionieren einwandfrei, wenn ich sie aus OO heraus erzeuge. Mit VBA und MailMerge werden die Serienbrief-Felder in der erzeugten Datei jedoch nicht gefüllt. Das Sonderbare ist zudem: Wenn ich diese erzeugte Datei in ein PDF exportiere, sind alle Felder korrekt befüllt. Hat jemand eine Idee, was ich falsch mache? Hier mal der Code-Ausschnitt:

Code: Alles auswählen

Private objServiceManager As Object
Private objMailManager As Object
Private objDesktop As Object
Private objCoreReflection As Object
Private objDataSource As Object
Private objDbContext As Object
Private objConnection As Object
Private objDocument As Object

Public Function GeneratePDF(ByVal origName As String) As Boolean

    Dim MyProps()
    Dim args()

    Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set objMailManager = objServiceManager.createInstance("com.sun.star.text.MailMerge")
    Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
    Set objDbContext = objServiceManager.createInstance("com.sun.star.sdb.DatabaseContext")
    Set objCoreReflection = objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")

    If objDbContext.hasByName("oo-studios") Then
        Set objDataSource = objDbContext.getByName("oo-studios")
    End If
    If Not objDataSource Is Nothing Then
        Set objConnection = objDataSource.GetConnection("", "")
    End If

    With objMailManager
        .DataSourceName = "oo-studios"
        .ActiveConnection = objConnection
        .CommandType = 0
        .Command = "oo-studios"
        .DocumentURL = ConvertToURL("E:\OpenDocs\Kundenformular.odt")
        .OutputType = 2
        .OutputUrl = ConvertToURL("E:\Output")
        .SaveAsSingleFile = False
    End With
    Call objMailManager.Execute(MyProps())
    
    '  generiertes Dokument öffnen - Felder leider nicht gefüll
    RenameOutput "E:\Output\Kundenformular0.odt", "E:\Output\Kundenformular.odt"
    Set objDocument = objDesktop.loadComponentFromURL(ConvertToURL("E:\Output\Kundenformular.odt"), "_blank", 0, args)

    ' Speichern als pdf - hier sind alle Felder korrekt gefüllt
    Dim dummy(0) As Object
    Set dummy(0) = createStruct()
    dummy(0).name = "FilterName"
    dummy(0).Value = "writer_pdf_Export"
    Call objDocument.StoreToUrl(myData.ConvertToURL(E:\Output\Kundenformular.pdf), dummy())
    
End Function
'------------------------------------------------------------------------------------------
Private Sub RenameOutput(ByVal fromFile As String, ByVal toFile As String)

    Dim myFile As Scripting.FileSystemObject

    Set myFile = CreateObject("Scripting.FileSystemObject")
    If Not myFile Is Nothing Then
        myFile.MoveFile fromFile, toFile
        Set myFile = Nothing
    End If

End Sub
'------------------------------------------------------------------------------------------
Private Function createStruct() As Object

    Dim classSize As Object
    Dim aStruct As Object
    
    Set classSize = objCoreReflection.forname("com.sun.star.beans.PropertyValue")
    classSize.CreateObject aStruct
    Set createStruct = aStruct

End Function
In dem Original-Beispielcode wurde ein evtl. bestehender Datasource entfernt und jeweils neu erstellt (oo_RemoveDataSource() und oo_InstallDatasource()). Die Variante hatte ich als erstes durchgespielt jedoch mit dem selben Ergebnis.

Re: Mail Merge in Datei füllt die Felder nicht

Verfasst: Mi, 08.05.2019 17:47
von pkuenemann
Ich habe das Problem nun selbst gelöst: wir verzichten komplett auf die Serienbrief-Funktion und arbeiten nun mit Search/Replace von eigenen Makros (z.B. '<Studioname>').

Re: Mail Merge in Datei füllt die Felder nicht

Verfasst: Mi, 08.05.2019 18:54
von F3K Total
Komisch, wie hast du denn das .pdf mit den befüllten Felden exportiert?

Code: Alles auswählen

ConvertToURL(E:\Output\Kundenformular.pdf)
funktioniert definitiv nicht!
tztztztz...

Re: Mail Merge in Datei füllt die Felder nicht

Verfasst: Sa, 11.05.2019 20:29
von pkuenemann
...Tippfehler. Ich habe die Original-Pfadangaben durch Beispiel-Pfade ersetzt. Korrekt müsste es natürlich lauten:

Code: Alles auswählen

    Call objDocument.StoreToUrl(myData.ConvertToURL("E:\Output\Kundenformular.pdf"), dummy())
Und wie gesagt: der PDF-Export funktioniert ja.

Re: Mail Merge in Datei füllt die Felder nicht

Verfasst: So, 12.05.2019 09:01
von F3K Total
Hi,
wenn der .pdf-Export funktioniert, dann funktioniert definitiv auch das Befüllen der Sereinbrieffelder, denn nur ein befülltes Serienbriefdokument kann überhaupt in ein .pdf exportiert werden. Es wird ein Anzeigefehler sein, hast du mal unter Menü Ansicht die Feldnamen ausgeschaltet (STRG+F9)
Gruß R