ich bin jetzt schon seit 2 Tagen am Schreiben eines einfachen Skripts und komme einfach nicht weiter, egal wo ich mir im Netz / in Foren noch Anregungen hole.
Situation: Ich möchte, dass ich ein VBS-Skript unter Windows (7 oder XP) auf der Kommandozeile starte und dieses sich dann eine xls-Datei nach der nächsten vornimmt, diese in LibreOffice lädt, alle Blätter der jeweiligen Dateien als CSV abspeichert und dann LibreOffice schließt.
Problem 1: Immer wenn Calc eine Datei speichert, dann enthält sie eigentlich ein ODS (!) (Zip-Container, etc., fängt mit
Code: Alles auswählen
PK u‚°@…l9Š. . mimetypeapplication/vnd.oasis.opendocument.spreadsheet
Makro? Als Makro mittels Makrorekorder klappt das alles sehr gut:
Code: Alles auswählen
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Users/lutz/Desktop/test.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "9,0,76,1,,0,false,true,true"
dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
Problem 2: In VBS funktioniert das gar nicht. Oder ich bin zu blöd. Habe es stattdessen mit StoreToUrl gemacht. Dabei tritt aber Problem 1 auf. Hier der Code:
Code: Alles auswählen
' Scripting Objekt
Dim wshshell
' Dateisystem Objekt
Dim objFSO
' OpenOffice / LibreOffice Service Manager
Dim objServiceManager
' OpenOffice / LibreOffice Desktop
Dim objDesktop
' Runcommand, falls nicht in Cscript aufgerufen
Dim runcommand
Dim Pfad
Dim Speicherpfad
Dim Dateiname
Dim url
Dim args0(0)
Dim args1(3)
' Dateisystemobjekt erstellen
Set wshshell = CreateObject("Wscript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Wenn nicht im Cscript aufgerufen, rufe über Cscript auf
if instr(1, wscript.fullname, "cscript.exe")=0 then
runcommand = "cscript //Nologo xls2csv_calc.vbs"
wshshell.run runcommand, 1, true
wscript.quit
end if
' Wenn Dateien vorhanden, dann starte Calc
If objFSO.GetFolder(".").Files.Count>0 then
' Den Service-Manager abfragen
' Falls kein LibreOffice offen -> starten
Set objServiceManager = WScript.CreateObject("com.sun.star.ServiceManager")
' Desktop aufbauen
Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
else
' Falls keine Dateien im Verzeichnis
wscript.echo "Keine Dateien gefunden!"
wscript.quit
End If
on error resume next
bError=False
For each Datei in objFSO.GetFolder(".").Files
if lcase(right(Datei.Name,3))="xls" then
' Zugriff auf Verzeichnisse
url = ConvertToURL(Datei.Path)
objDesktop = GlobalScope.BasicLibraries.loadLIbrary( "Tools" )
Set args0(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Set objDocument = objDesktop.loadComponentFromURL(url, "_blank", 0, args0 )
' Dateinamen ohne Erweiterung und Pfad einlesen
Pfad = ConvertToURL( Datei.ParentFolder ) & "/"
Dateiname = objFSO.GetBaseName( Datei.Path )
Speicherpfad = ConvertToURL( Datei.ParentFolder )
' Args festlegen
Set args1(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Set args1(1) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Set args1(2) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
sFilterName = "Text - txt - csv (StarCalc)"
sFilterOptions = "9,0,76,1,,0,false,true,true"
sOverwrite = True
Set args1(0) = MakePropertyValue( "FilterName", sFilterName )
Set args1(1) = MakePropertyValue( "FilterOptions", sFilterOptions )
Set args1(2) = MakePropertyValue( "Overwrite", sOverwrite )
' Einzelne Arbeitsblätter in einzelne csv speichern
objSheets = objDocument.Sheets
For i = 0 to objDocument.Sheets.getcount -1
objSheet = objDocument.Sheets.getByIndex(i)
Call objDocument.CurrentController.setActiveSheet(objSheet)
Call objDocument.storeToURL( ConvertToURL( Datei.ParentFolder & "\" & Dateiname & "_" & objDocument.sheets.getByIndex(i).Name & ".csv" ), args1 )
Next
' Dokument schließen
objDocument.close(True)
Set objDocument = Nothing
Pfad = ""
Speicherpfad = ""
Dateiname = ""
Else
End If
Next
' LibreOffice schließen
objDesktop.terminate
Set objDesktop = nothing
Set objServiceManager = nothing
So... hat jemand eine Idee was ich falsch mache? Oder kann mir jemand sagen wie ich den Dispatcher richtig im VBS aufrufe?
Ich bin für jede Hilfe dankbar, da ich langsam etwas verzweifelt bin!