von pkuenemann » Di, 30.04.2019 09:49
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.
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]
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
[/code]
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.