Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2015
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Dim objServiceManager
  2. Dim objDesktop
  3. Dim objCoreReflection
  4. Dim objDatasource
  5. Dim objConnection
  6. Dim objMailMerge
  7. Dim OODatei
  8. Dim OOPfad
  9. Dim OODataSourceName
  10. Dim MyProps()
  11.  
  12. Set objServiceManager = Nothing
  13. Set objDesktop = Nothing
  14. Set objCoreReflection = Nothing
  15.  
  16. Sub ErstelleDok()
  17. '[...] irrelevanter code vorher: Eigenschaften setzen, CSV generieren, Dateien kopieren und verschieben
  18.  
  19.    'csv zu utf-8 konvertieren
  20.   KonvUTF8noBom(strDateiPfad_CSV)
  21.  
  22.    'Verbindung zu OpenOffice
  23.   Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
  24.    Set objDesktop = objServiceManager.CreateInstance("com.sun.star.frame.Desktop")
  25.    Set objCoreReflection = objServiceManager.CreateInstance("com.sun.star.reflection.CoreReflection")
  26.  
  27.    'Pfadangaben zu Testdateien
  28.   OODatei = "file:///C:/Users/RVama/Desktop/Test.odt"
  29.    'OODatei = "file:///C:/Users/RVAdmin/Desktop/Test1.odt"
  30.   'OOPfad = "file:///C:/Users/RVama/Desktop/"
  31.   OOPfad = "C:/Users/RVama/Desktop/"
  32.    OODataSourceName = "opog"
  33.  
  34.    'Datenquelle erstellen, registrieren, verbinden
  35.   Set objDatasource = OO_InstallDatasource(OOPfad, OODataSourceName)
  36.    Set objConnection = objDatasource.getConnection("", "")
  37.    'Set objConnection = objDatasource.connectWithCompletion("", "")
  38.  
  39.    'Daten aus "Steuerdatei" einfügen
  40.   Set objMailMerge = objServiceManager.CreateInstance("com.sun.star.text.MailMerge")
  41.    With objMailMerge
  42.       .DataSourceName = OODataSourceName   'Datenbankname (nicht der Dateiname der Datenquelle)
  43.      .ActiveConnection = objConnection
  44.       .DocumentURL = OODatei
  45.       .CommandType = 0               '0 = Tabelle
  46.      .Command = strDateiName_CSV          'Tabellenname in der Datenbank (= Dateiname der Datenquelle)
  47.      .OutputType = 2
  48.       '.OutputURL = OOPfad
  49.      .SaveAsSingleFile = True
  50.    End With
  51.    Call objMailMerge.Execute(MyProps)
  52.  
  53.    '[...] irrelevanter code danach: Dokument öffnen, Fehlermeldungen ausgeben bei Fehlern
  54. End Sub
  55.  
  56. 'Datei als UTF-8 no BOM speichern, dazu:
  57.   '1) Inhalt der Datenquelle (CSV) einlesen und zwischenspeichern
  58.   '2) den Inhalt an einen Stream übergeben
  59.   '3) Pointer-Position des Streams auf 3 setzten, um den BOM-Teil zu überspringen
  60.   '4) Inhalt (ohne BOM) in einen neuen, binären Stream kopieren und diesen als Datei speichern
  61.   'BOM: https://de.wikipedia.org/wiki/Byte_Order_Mark
  62. Function KonvUTF8noBom(Datei)
  63.     dim content
  64.    
  65.     'CSV einlesen
  66.    dim fso : set fso  = CreateObject("Scripting.FileSystemObject")
  67.     'als Unicode öffnen
  68.    dim file : set file = fso.OpenTextFile(Datei, 1, false, -1)
  69.    
  70.     'Inhalt speichern und Datei schließen
  71.    content = file.ReadAll
  72.     file.close
  73.     'MsgBox "length: " & len(content) & vbCrLf & "Inhalt: " & content
  74.  
  75.    'UTF-8 (mit BOM) Stream erzeugen und CSV-Inhalt übergeben
  76.   dim stream : set stream = CreateObject("ADODB.Stream")
  77.    with stream
  78.       .Charset        = "utf-8"
  79.       .Type           = 2 'text
  80.      .Mode         = 3 'ReadWrite
  81.      .LineSeparator  = 10 'Line feed only
  82.      .Open
  83.       .WriteText content
  84.       '.Position = 0
  85.      '.SaveToFile    Datei, 2 'überschreibe Datei
  86.      .Position       = 3 'BOM überspringen
  87.      '.Close
  88.   end with
  89.    
  90.    'binären Stream erzeugen, um Inhalt ohne BOM-Anteil übergeben zu können
  91.   dim bStream : set bStream = CreateObject("adodb.stream")
  92.    with bStream
  93.        .Type = 1 'binär
  94.       .Mode = 3 'ReadWrite
  95.       .Open
  96.     end with
  97.    
  98.     'kopieren
  99.    stream.CopyTo bStream
  100.    
  101.     stream.Flush
  102.     stream.Close
  103.    
  104.     'speichern
  105.    bStream.SaveToFile Datei, 2 'überschreibe Datei
  106.    bStream.Flush
  107.     bStream.Close
  108. End Function
  109.  
  110.  
  111. Function OO_InstallDatasource(filePath, filename)
  112.     Dim databaseContext
  113.     Dim dataSource
  114.    
  115.     Dim dsProps(4)
  116.     Dim IDs_props()
  117.     Dim continue
  118.    
  119.     continue = True
  120.    
  121.     Set databaseContext = objServiceManager.CreateInstance("com.sun.star.sdb.DatabaseContext")
  122.    
  123.     'Wenn Datenquelle unter dem gleichen Namen bereits registriert ist -> entfernen
  124.     If (databaseContext.hasByName(filename)) Then
  125.         If (OO_RemoveDatasource(filename) = False) Then
  126.             continue = False
  127.             If Not (IsEmpty(dataSource)) Then Set dataSource = Nothing
  128.             If Not (IsEmpty(databaseContext)) Then Set databaseContext = Nothing
  129.         End If
  130.     End If
  131.    
  132.     If (continue) Then
  133.         Set dataSource = databaseContext.CreateInstance()
  134.        
  135.         'Parameter für Datenbanktreiber "flat" setzen (Verbinungs- bzw. Datenbanktyp)
  136.         'https://www.openoffice.org/api/docs/common/ref/com/sun/star/sdbc/FLATConnectionProperties.html
  137.         dataSource.URL = "sdbc:flat:" & filePath & "Test_ama" & ".csv"
  138.         Set dsProps(0) = OO_setPropVal("HeaderLine", true)
  139.         Set dsProps(1) = OO_setPropVal("FieldDelimiter", Chr(59)) ';
  140.         Set dsProps(2) = OO_setPropVal("StringDelimiter", Chr(34)) '"
  141.         Set dsProps(3) = OO_setPropVal("CharSet", "UTF-8")
  142.         Set dsProps(4) = OO_setPropVal("Extension", "csv")
  143.         dataSource.Info = dsProps
  144.        
  145.         'dumpDsProps(dsProps)
  146.         'MsgBox TypeName(dsProps(0))
  147.        
  148.         '.odb Datenbankdatei anlegen
  149.         Call dataSource.DatabaseDocument.StoreAsUrl("file:///" & filePath & "Test_ama" & ".odb", IDs_props)
  150.         'Datenbank im Datenquellen-Register eintragen
  151.         Call databaseContext.registerObject(filename, dataSource)
  152.        
  153.         Set OO_InstallDatasource = dataSource
  154.     End If
  155. End Function
  156.  
  157. Function OO_RemoveDatasource(RDs_strDatasourceName)
  158.    OO_RemoveDatasource = False
  159.    
  160.    Dim RDs_objDatabaseContext
  161.    Set RDs_objDatabaseContext = objServiceManager.CreateInstance("com.sun.star.sdb.DatabaseContext")
  162.    
  163.    If RDs_objDatabaseContext.hasByName(RDs_strDatasourceName) Then
  164.       Call RDs_objDatabaseContext.revokeObject(RDs_strDatasourceName)
  165.       OO_RemoveDatasource = True
  166.    End If
  167. End Function
  168.  
  169. Function OO_setPropVal(propName, propValue)
  170.     dim propVal
  171.     Set propVal = OO_createStruct("com.sun.star.beans.PropertyValue")
  172.     propVal.Name = propName
  173.     propVal.Value = propValue
  174.     Set OO_setPropVal = propVal
  175. End Function
  176.  
  177. Function OO_createStruct(strTypeName)
  178.    Dim classSize
  179.    Set classSize = objCoreReflection.forname(strTypeName)
  180.    
  181.    Dim aStruct
  182.    classSize.CreateObject aStruct
  183.  
  184.    Set OO_createStruct = aStruct
  185. End Function
  186.  
  187. Sub dumpDsProps(arr)
  188.     Dim s
  189.     For i = 0 To uBound(arr)
  190.         s = s & i & ": " & arr(i).Name & " - " & arr(i).Value & vbCrLf
  191.     Next
  192.  
  193.     MsgBox s
  194. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement