Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Dim objServiceManager
- Dim objDesktop
- Dim objCoreReflection
- Dim objDatasource
- Dim objConnection
- Dim objMailMerge
- Dim OODatei
- Dim OOPfad
- Dim OODataSourceName
- Dim MyProps()
- Set objServiceManager = Nothing
- Set objDesktop = Nothing
- Set objCoreReflection = Nothing
- Sub ErstelleDok()
- '[...] irrelevanter code vorher: Eigenschaften setzen, CSV generieren, Dateien kopieren und verschieben
- 'csv zu utf-8 konvertieren
- KonvUTF8noBom(strDateiPfad_CSV)
- 'Verbindung zu OpenOffice
- Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
- Set objDesktop = objServiceManager.CreateInstance("com.sun.star.frame.Desktop")
- Set objCoreReflection = objServiceManager.CreateInstance("com.sun.star.reflection.CoreReflection")
- 'Pfadangaben zu Testdateien
- OODatei = "file:///C:/Users/RVama/Desktop/Test.odt"
- 'OODatei = "file:///C:/Users/RVAdmin/Desktop/Test1.odt"
- 'OOPfad = "file:///C:/Users/RVama/Desktop/"
- OOPfad = "C:/Users/RVama/Desktop/"
- OODataSourceName = "opog"
- 'Datenquelle erstellen, registrieren, verbinden
- Set objDatasource = OO_InstallDatasource(OOPfad, OODataSourceName)
- Set objConnection = objDatasource.getConnection("", "")
- 'Set objConnection = objDatasource.connectWithCompletion("", "")
- 'Daten aus "Steuerdatei" einfügen
- Set objMailMerge = objServiceManager.CreateInstance("com.sun.star.text.MailMerge")
- With objMailMerge
- .DataSourceName = OODataSourceName 'Datenbankname (nicht der Dateiname der Datenquelle)
- .ActiveConnection = objConnection
- .DocumentURL = OODatei
- .CommandType = 0 '0 = Tabelle
- .Command = strDateiName_CSV 'Tabellenname in der Datenbank (= Dateiname der Datenquelle)
- .OutputType = 2
- '.OutputURL = OOPfad
- .SaveAsSingleFile = True
- End With
- Call objMailMerge.Execute(MyProps)
- '[...] irrelevanter code danach: Dokument öffnen, Fehlermeldungen ausgeben bei Fehlern
- End Sub
- 'Datei als UTF-8 no BOM speichern, dazu:
- '1) Inhalt der Datenquelle (CSV) einlesen und zwischenspeichern
- '2) den Inhalt an einen Stream übergeben
- '3) Pointer-Position des Streams auf 3 setzten, um den BOM-Teil zu überspringen
- '4) Inhalt (ohne BOM) in einen neuen, binären Stream kopieren und diesen als Datei speichern
- 'BOM: https://de.wikipedia.org/wiki/Byte_Order_Mark
- Function KonvUTF8noBom(Datei)
- dim content
- 'CSV einlesen
- dim fso : set fso = CreateObject("Scripting.FileSystemObject")
- 'als Unicode öffnen
- dim file : set file = fso.OpenTextFile(Datei, 1, false, -1)
- 'Inhalt speichern und Datei schließen
- content = file.ReadAll
- file.close
- 'MsgBox "length: " & len(content) & vbCrLf & "Inhalt: " & content
- 'UTF-8 (mit BOM) Stream erzeugen und CSV-Inhalt übergeben
- dim stream : set stream = CreateObject("ADODB.Stream")
- with stream
- .Charset = "utf-8"
- .Type = 2 'text
- .Mode = 3 'ReadWrite
- .LineSeparator = 10 'Line feed only
- .Open
- .WriteText content
- '.Position = 0
- '.SaveToFile Datei, 2 'überschreibe Datei
- .Position = 3 'BOM überspringen
- '.Close
- end with
- 'binären Stream erzeugen, um Inhalt ohne BOM-Anteil übergeben zu können
- dim bStream : set bStream = CreateObject("adodb.stream")
- with bStream
- .Type = 1 'binär
- .Mode = 3 'ReadWrite
- .Open
- end with
- 'kopieren
- stream.CopyTo bStream
- stream.Flush
- stream.Close
- 'speichern
- bStream.SaveToFile Datei, 2 'überschreibe Datei
- bStream.Flush
- bStream.Close
- End Function
- Function OO_InstallDatasource(filePath, filename)
- Dim databaseContext
- Dim dataSource
- Dim dsProps(4)
- Dim IDs_props()
- Dim continue
- continue = True
- Set databaseContext = objServiceManager.CreateInstance("com.sun.star.sdb.DatabaseContext")
- 'Wenn Datenquelle unter dem gleichen Namen bereits registriert ist -> entfernen
- If (databaseContext.hasByName(filename)) Then
- If (OO_RemoveDatasource(filename) = False) Then
- continue = False
- If Not (IsEmpty(dataSource)) Then Set dataSource = Nothing
- If Not (IsEmpty(databaseContext)) Then Set databaseContext = Nothing
- End If
- End If
- If (continue) Then
- Set dataSource = databaseContext.CreateInstance()
- 'Parameter für Datenbanktreiber "flat" setzen (Verbinungs- bzw. Datenbanktyp)
- 'https://www.openoffice.org/api/docs/common/ref/com/sun/star/sdbc/FLATConnectionProperties.html
- dataSource.URL = "sdbc:flat:" & filePath & "Test_ama" & ".csv"
- Set dsProps(0) = OO_setPropVal("HeaderLine", true)
- Set dsProps(1) = OO_setPropVal("FieldDelimiter", Chr(59)) ';
- Set dsProps(2) = OO_setPropVal("StringDelimiter", Chr(34)) '"
- Set dsProps(3) = OO_setPropVal("CharSet", "UTF-8")
- Set dsProps(4) = OO_setPropVal("Extension", "csv")
- dataSource.Info = dsProps
- 'dumpDsProps(dsProps)
- 'MsgBox TypeName(dsProps(0))
- '.odb Datenbankdatei anlegen
- Call dataSource.DatabaseDocument.StoreAsUrl("file:///" & filePath & "Test_ama" & ".odb", IDs_props)
- 'Datenbank im Datenquellen-Register eintragen
- Call databaseContext.registerObject(filename, dataSource)
- Set OO_InstallDatasource = dataSource
- End If
- End Function
- Function OO_RemoveDatasource(RDs_strDatasourceName)
- OO_RemoveDatasource = False
- Dim RDs_objDatabaseContext
- Set RDs_objDatabaseContext = objServiceManager.CreateInstance("com.sun.star.sdb.DatabaseContext")
- If RDs_objDatabaseContext.hasByName(RDs_strDatasourceName) Then
- Call RDs_objDatabaseContext.revokeObject(RDs_strDatasourceName)
- OO_RemoveDatasource = True
- End If
- End Function
- Function OO_setPropVal(propName, propValue)
- dim propVal
- Set propVal = OO_createStruct("com.sun.star.beans.PropertyValue")
- propVal.Name = propName
- propVal.Value = propValue
- Set OO_setPropVal = propVal
- End Function
- Function OO_createStruct(strTypeName)
- Dim classSize
- Set classSize = objCoreReflection.forname(strTypeName)
- Dim aStruct
- classSize.CreateObject aStruct
- Set OO_createStruct = aStruct
- End Function
- Sub dumpDsProps(arr)
- Dim s
- For i = 0 To uBound(arr)
- s = s & i & ": " & arr(i).Name & " - " & arr(i).Value & vbCrLf
- Next
- MsgBox s
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement