CSV in XLSX mit OpenOffice und VBS und das ganze in meine Batchscript, das die Datei per Mail versendet
Datein werden Exportiert als CSV und werden dann per Mail versendet. Diese werden aber als XLSX benötigt
Ja Moin Moin,
also wie im Vorwort geht es darum, das ich ein Batchscript habe, das die exportierte CSV Datei versendet.
Bisher isses dann so, das die Datei abgespeichert wurd und als XLSX neu gespeichert wird - unnötiger Arbeitsschritt der vor dem Abschicken bereits geschehen kann.
Problem 1. MSOffice ist auf dem PC nicht installiert, nur OpenOffice in der aktuellsten Version.
Problem 2. Habe ich wenig ahnung von VBS UND bin zwar drauf gestoßen wie das schick zu lösen ist, aber wie geht das unter OpenOffice?
Hoffe ihr könnt mir helfen. Würd das ganze dann in mein Batch einbauen (das weiß ich dank Bastla wie das geht).
Danke im Vorraus.
Gruß Zero
Ja Moin Moin,
also wie im Vorwort geht es darum, das ich ein Batchscript habe, das die exportierte CSV Datei versendet.
Bisher isses dann so, das die Datei abgespeichert wurd und als XLSX neu gespeichert wird - unnötiger Arbeitsschritt der vor dem Abschicken bereits geschehen kann.
Problem 1. MSOffice ist auf dem PC nicht installiert, nur OpenOffice in der aktuellsten Version.
Problem 2. Habe ich wenig ahnung von VBS UND bin zwar drauf gestoßen wie das schick zu lösen ist, aber wie geht das unter OpenOffice?
Hoffe ihr könnt mir helfen. Würd das ganze dann in mein Batch einbauen (das weiß ich dank Bastla wie das geht).
Danke im Vorraus.
Gruß Zero
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 187593
Url: https://administrator.de/contentid/187593
Ausgedruckt am: 21.11.2024 um 18:11 Uhr
60 Kommentare
Neuester Kommentar
Hallo ColdZero89.
Es wäre mir neu, dass man mit OOo im XLSX Format speichern kann. XLS sollte aber funktionieren. Ich bin nicht der OOo Experte, da ich beruflich ausschließlich mit M$ Office zu tun habe.
Kurzerhand zusammen geschrieben, aber nur unzureichend getestet:
Beachte dass Pfadangaben im URL Format stehen müssen!
Grüße
rubberman
Es wäre mir neu, dass man mit OOo im XLSX Format speichern kann. XLS sollte aber funktionieren. Ich bin nicht der OOo Experte, da ich beruflich ausschließlich mit M$ Office zu tun habe.
Kurzerhand zusammen geschrieben, aber nur unzureichend getestet:
Dim i, arrProp(1), oSvcMan, oDsktp, oDoc
Const sCsvURL = "file:///C:/pfad/test.csv"
Const sXlsURL = "file:///C:/pfad/test.xls"
Set oSvcMan = WScript.CreateObject("com.sun.star.ServiceManager")
Set oDsktp = oSvcMan.createInstance("com.sun.star.frame.Desktop")
For i = 0 To UBound(arrProp)
Set arrProp(i) = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Next
arrProp(0).Name = "FilterName"
arrProp(0).Value = "Text - txt - csv (StarCalc)"
arrProp(1).Name = "FilterOptions"
arrProp(1).Value = "59,34,ANSI,1,"
Set oDoc = oDsktp.loadComponentFromURL(sCsvUrl, "_blank", 0, arrProp)
arrProp(0).Value = "MS Excel 97"
arrProp(1).Name = ""
arrProp(1).Value = ""
oDoc.storeAsURL sXlsURL, arrProp
oDoc.close(True)
oDsktp.terminate
For i = 0 To UBound(arrProp)
Set arrProp(i) = Nothing
Next
Set oDoc = Nothing
Set oDsktp = Nothing
Set oSvcMan = Nothing
Grüße
rubberman
Hallo rubberman!
Tolles Skript
Gibt's auch ne Möglichkeit, die Konvertierung mit Visible = False auszuführen und wie müsste dass arrProp definiert sein, wenn ich eine *.ods-Datei in's *.xls-Format konvertieren möchte?
Gruß Dieter
Tolles Skript
Es wäre mir neu, dass man mit OOo im XLSX Format speichern kann
Habe mir die aktuelle OO-Version auf meinen virtuellen PC installiert und kann zum einen bestätigen, dass es funktioniert und zum anderen, dass (max) nur ein 97er *.xls-Format erstellt werden kannGibt's auch ne Möglichkeit, die Konvertierung mit Visible = False auszuführen und wie müsste dass arrProp definiert sein, wenn ich eine *.ods-Datei in's *.xls-Format konvertieren möchte?
Gruß Dieter
Hallo Dieter,
danke für die Blumen
Zu deinen Fragen:
"Hidden" gehört zu den Eigenschaften, die beim Öffnen eines Dokuments festgelegt werden können. Ordne einen booleschen Wert zu.
Für ODS Dateien reicht dann die Hidden Eigenschaft bereits zum Öffnen (bzw. ein leeres Array, wenn du keine weiteren Properties festlegen willst).
Grüße
rubberman
danke für die Blumen
Zu deinen Fragen:
"Hidden" gehört zu den Eigenschaften, die beim Öffnen eines Dokuments festgelegt werden können. Ordne einen booleschen Wert zu.
Dim i, arrProp(2), oSvcMan, oDsktp, oDoc
Const sCsvURL = "file:///C:/pfad/test.csv"
Const sXlsURL = "file:///C:/pfad/test.xls"
Set oSvcMan = WScript.CreateObject("com.sun.star.ServiceManager")
Set oDsktp = oSvcMan.createInstance("com.sun.star.frame.Desktop")
For i = 0 To UBound(arrProp)
Set arrProp(i) = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Next
arrProp(0).Name = "Hidden"
arrProp(0).Value = True
arrProp(1).Name = "FilterName"
arrProp(1).Value = "Text - txt - csv (StarCalc)"
arrProp(2).Name = "FilterOptions"
arrProp(2).Value = "59,34,ANSI,1,"
Set oDoc = oDsktp.loadComponentFromURL(sCsvUrl, "_blank", 0, arrProp)
arrProp(1).Value = "MS Excel 97"
arrProp(2).Name = ""
arrProp(2).Value = ""
oDoc.storeAsURL sXlsURL, arrProp
oDoc.close(True)
oDsktp.terminate
For i = 0 To UBound(arrProp)
Set arrProp(i) = Nothing
Next
Set oDoc = Nothing
Set oDsktp = Nothing
Set oSvcMan = Nothing
Für ODS Dateien reicht dann die Hidden Eigenschaft bereits zum Öffnen (bzw. ein leeres Array, wenn du keine weiteren Properties festlegen willst).
Dim i, arrProp(1), oSvcMan, oDsktp, oDoc
Const sOdsURL = "file:///C:/pfad/test.ods"
Const sXlsURL = "file:///C:/pfad/test.xls"
Set oSvcMan = WScript.CreateObject("com.sun.star.ServiceManager")
Set oDsktp = oSvcMan.createInstance("com.sun.star.frame.Desktop")
For i = 0 To UBound(arrProp)
Set arrProp(i) = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Next
arrProp(0).Name = "Hidden"
arrProp(0).Value = True
Set oDoc = oDsktp.loadComponentFromURL(sOdsUrl, "_blank", 0, arrProp)
arrProp(1).Name = "FilterName"
arrProp(1).Value = "MS Excel 97"
oDoc.storeAsURL sXlsURL, arrProp
oDoc.close(True)
oDsktp.terminate
For i = 0 To UBound(arrProp)
Set arrProp(i) = Nothing
Next
Set oDoc = Nothing
Set oDsktp = Nothing
Set oSvcMan = Nothing
Grüße
rubberman
Hallo rubberman!
Super Und vielen Dank für Deine Mühe!
Grüße und ein schönes Wochendende
Dieter
Super Und vielen Dank für Deine Mühe!
Grüße und ein schönes Wochendende
Dieter
Hallo ColdZero89.
Kann ich nachvollziehen Von dem Script ist auch nicht mal die Hälfte VBScript. Vorwiegend sind es Methoden und Eigenschaften der referenzierten OOo Objekte.
@Dieter
Nachdem ich noch ein bisschen herum experimentiert habe, ist es öfters passiert, dass der OOo Menüdesktop trotzdem für Sekunden oder Sekundenbruchteile sichtbar war. Ist auch kein Wunder, da die Hidden Eigenschaft ja erst beim Öffnen des Dokuments gesetzt wird.
Folgende Änderung des Codes beruht auf:
- der Tatsache, dass soffice.exe mit der Option
- der Beobachtung/Annahme, dass mehrere Instanzen des OOo Desktops unter nur einem bereits gestarteten soffice.exe Process laufen.
Wie du siehst gibt es nun auch die Funktion ToOOFileURL(). Somit kannst du wie gewohnt mit Windows Pfadangaben arbeiten. Relative Pfade werden entsprechend erweitert.
Grüße
rubberman
Kann ich nachvollziehen Von dem Script ist auch nicht mal die Hälfte VBScript. Vorwiegend sind es Methoden und Eigenschaften der referenzierten OOo Objekte.
@Dieter
Nachdem ich noch ein bisschen herum experimentiert habe, ist es öfters passiert, dass der OOo Menüdesktop trotzdem für Sekunden oder Sekundenbruchteile sichtbar war. Ist auch kein Wunder, da die Hidden Eigenschaft ja erst beim Öffnen des Dokuments gesetzt wird.
Folgende Änderung des Codes beruht auf:
- der Tatsache, dass soffice.exe mit der Option
-invisible
ohne GUI startet.- der Beobachtung/Annahme, dass mehrere Instanzen des OOo Desktops unter nur einem bereits gestarteten soffice.exe Process laufen.
Option Explicit
Dim i, iRet, iPID
Dim sExe, sExePath
Dim arrProp(2)
Dim oReg, oFSO, oWMI, oStartup, oConfig, oProcess, colProc, oSvcMan, oDsktp, oDoc
Const sCsvPath = "test.csv"
Const sXlsPath = "test.xls"
Const iHKLM = &h80000002
Const sKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\soffice.exe"
Const sVal = ""
Const sComp = "."
Const iSleep = 2000
Const SW_HIDE = 0
''' OOo Starten (hidden) '''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Wo ist OOo installiert? (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\soffice.exe)
Set oReg = GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\" & sComp & "\root\default:StdRegProv")
oReg.GetStringValue iHKLM, sKey, sVal, sExe
Set oReg = Nothing
If IsNull(sExe) Then WScript.Quit
' OOo Arbeitsverzeichnis
Set oFSO = CreateObject("Scripting.FileSystemObject")
sExePath = oFSO.GetParentFolderName(sExe)
Set oFSO = Nothing
' OOo ohne GUI öffnen.
Set oWMI = GetObject _
("winmgmts:{impersonationLevel=impersonate}!\\" & sComp & "\root\cimv2")
Set oStartup = oWMI.Get("Win32_ProcessStartup")
Set oConfig = oStartup.SpawnInstance_
oConfig.ShowWindow = SW_HIDE
Set oProcess = oWMI.Get("Win32_Process")
iRet = oProcess.Create _
(sExe & " -invisible", sExePath, oConfig, iPID) ' Option -invisible ist erforderlich!
Set oProcess = Nothing
Set oConfig = Nothing
If iRet > 0 Then WScript.Quit
' Auf Prozess "soffice.bin" warten und sicherstellen dass er vollständig geladen ist.
Do
Set colProc = oWMI.ExecQuery( _
"Select * from Win32_Process Where Caption = 'soffice.bin' " & _
"And ParentProcessID = '" & CStr(iPID) & "'")
For Each oProcess In colProc
Exit Do
Next
WScript.Sleep 300
Loop
WScript.Sleep iSleep
Set oProcess = Nothing
Set colProc = Nothing
Set oWMI = Nothing
''' CSV zu XLS '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' OOo ServiceManager
Set oSvcMan = WScript.CreateObject("com.sun.star.ServiceManager")
' OOo Menü - Desktop
Set oDsktp = oSvcMan.createInstance("com.sun.star.frame.Desktop")
' OOo Property - Struct
For i = 0 To UBound(arrProp)
Set arrProp(i) = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Next
' Properties für das Öffnen der CSV Datei.
arrProp(0).Name = "Hidden"
arrProp(0).Value = True
arrProp(1).Name = "FilterName"
arrProp(1).Value = "Text - txt - csv (StarCalc)"
arrProp(2).Name = "FilterOptions"
' Delimiter ';' (59), Texttrenner '"' (34), Zeichensatz ANSI, Start in Zeile 1
arrProp(2).Value = "59,34,ANSI,1,"
Set oDoc = oDsktp.loadComponentFromURL( _
ToOOFileURL(sCsvPath), "_blank", 0, arrProp)
' Properties für das Speichern als XLS Datei.
arrProp(1).Value = "MS Excel 97"
arrProp(2).Name = ""
arrProp(2).Value = ""
oDoc.storeAsURL ToOOFileURL(sXlsPath), arrProp
' Dokument schließen
oDoc.close(True)
' OOo schließen
oDsktp.terminate
' Speicher freigeben
For i = 0 To UBound(arrProp)
Set arrProp(i) = Nothing
Next
Set oDoc = Nothing
Set oDsktp = Nothing
Set oSvcMan = Nothing
''' Windows Pfadangabe zu OOo File URL '''''''''''''''''''''''''''''''''''''''''
Function ToOOFileURL(sPath)
' Absolute Pfade oder Pfade relativ zum Script werden entsprechend konvertiert.
' OOo hält sich nicht an die Restriktionen in RFC 1738. Weniger ist hier mehr.
ToOOFileURL = "file:///" & Replace(Replace(Replace( _
CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(sPath), _
"\", "/"), "%", "%25"), " ", "%20")
End Function
Grüße
rubberman
Hallo rubberman!
Dein (WOW)-Skript muss ich mir erstmal in Ruhe zu Gemüte führen
Bei meinen Testereien ist mir in dieser Hinsicht nix aufgefallen und wenn, dann ist der Umstand wohl vernachlässigbar
Danke für Deine Mühe!
Gruß Dieter
Nachdem ich noch ein bisschen herum experimentiert habe, ist es öfters passiert,
dass der OOo Menüdesktop trotzdem für Sekunden oder Sekundenbruchteile sichtbar war.
Ist auch kein Wunder, da die Hidden Eigenschaft ja erst beim Öffnen des Dokuments gesetzt wird.
Ist ja bei Excel auch nicht anders, es sei denn, man lädt die Excel-Datei mit GetObject, was allerdings auch nur zum Lesen (.Close False) einer Excel-Datei geeignet ist. Beim Speichern und erneutem Öffnen sind die Excel-Einstellungen zum Großteil futschdass der OOo Menüdesktop trotzdem für Sekunden oder Sekundenbruchteile sichtbar war.
Ist auch kein Wunder, da die Hidden Eigenschaft ja erst beim Öffnen des Dokuments gesetzt wird.
Dein (WOW)-Skript muss ich mir erstmal in Ruhe zu Gemüte führen
Bei meinen Testereien ist mir in dieser Hinsicht nix aufgefallen und wenn, dann ist der Umstand wohl vernachlässigbar
Danke für Deine Mühe!
Gruß Dieter
Hallo rubberman!
Zum ermitteln des Pfades verwende ich folgenden Code:
Gruß und gute Nacht
Dieter
' Wo ist OOo installiert? (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\soffice.exe)
Da ist bei mir keine soffice.exe zu finden, da Office nur unter Current-User installiert istZum ermitteln des Pfades verwende ich folgenden Code:
Const sComputer = "."
Const sSql_OpenOffice = "SELECT Version FROM Win32_Product WHERE Name Like 'OpenOffice%'"
Const iHKCU = &H80000001
Const iHKLM = &H80000002
Const sRegKey = "Software\OpenOffice.org\"
Const sRegVal = "Path"
Dim oWMI, oItem, sProduktName, sKey, sExePath
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\CIMV2")
For Each oItem In oWMI.ExecQuery(sSql_OpenOffice)
sProduktName = oItem.Name
Next
sKey = sRegKey & Replace(sProduktName, " ", "\")
With GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\default:StdRegProv")
.GetStringValue iHKCU, sKey, sRegVal, sExePath
End With
Gruß und gute Nacht
Dieter
Hallo rubberman!
Hm.., bei mir geht's Ratzfatz. Liegt wohl daran, dass auf meinem XP-Mode nicht viel installiert ist
Es geht aber auch so:
Gruß Dieter
[edit] einen kleinen Fehler entdeckt und geändert [/edit]
Hm.., bei mir geht's Ratzfatz. Liegt wohl daran, dass auf meinem XP-Mode nicht viel installiert ist
Es geht aber auch so:
Const sComputer = "."
Const iHKCR = &H80000000
Const iHKCU = &H80000001
Const iHKLM = &H80000002
Const iHKUS = &H80000003
Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"
Const sRegValue = "Path"
Dim oReg, oSubKey, aRegValues, sExePath
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
sComputer & "\root\default:StdRegProv")
oReg.EnumKey iHKCU, sRegKey, aRegValues
If IsArray(aRegValues) Then
If IsNumeric(aRegValues(0)) Then
oReg.GetStringValue iHKCU, sRegKey & aRegValues(0), sRegValue, sExePath
End If
End If
MsgBox sExePath
Gruß Dieter
[edit] einen kleinen Fehler entdeckt und geändert [/edit]
Hallo ColdZero89!
Gruß Dieter
kurze anmerkung: Ihr seid Verrückt.
Das sind doch nur Spielereien und es geht eigentlich nur darum, den Prozess völlig im Hintergrund auszuführen. In den vorigen Skripts greift die Option Hidden erst, nachdem OpenOffice schon geöffnet wurde und jenachdem, wie lange das dauert, kann es sein, dass das Fenster für eine kurze Zeit sichtbar wird. Im letzten Skript hingegen, wird OpenOffice durch den Prozess-Manager im Hintergrund gestartet und bleibt somit unsichtbar. Allerdings ist der Aufwand dafür nicht gerade unerheblich, da ja u.a. auch ersteinmal der direkte Pfad der OpenOffice-Exe ermittelt werden muss...Gruß Dieter
Hallo ColdZero89!
Naja, ich bin ja durch und durch ein Handwerker und übe auch einen Handwerksberuf (Schwerstarbeit) aus. Mit IT und/oder Programmierung habe ich ansich nix zu tun. Deshalb ist es für mich eine Spielerei nach dem Motto 'Wer lesen kann ist im Vorteil..', um in meinem Alter mental noch halbwegs fit zu bleiben
Du Konvertierst doch von *.csv nach *.xls. Ansonsten könnte man sich ja das ganze sparen, wenn du schon eine *.xls-Datei hättest?
Gruß Dieter
Naja, ich bin ja durch und durch ein Handwerker und übe auch einen Handwerksberuf (Schwerstarbeit) aus. Mit IT und/oder Programmierung habe ich ansich nix zu tun. Deshalb ist es für mich eine Spielerei nach dem Motto 'Wer lesen kann ist im Vorteil..', um in meinem Alter mental noch halbwegs fit zu bleiben
Was mir noch einfällt, was unerwähnt geblieben ist: Die Ausgangsdatei EXISTIERT jedesmal vom Namen her schon und muss überschrieben werden. Rattert der das so durch oder muss da nun noch ne Zeile hinzu?
Wie jetze? Wieso existiert die Datei schon?Du Konvertierst doch von *.csv nach *.xls. Ansonsten könnte man sich ja das ganze sparen, wenn du schon eine *.xls-Datei hättest?
Gruß Dieter
@Dieter
das sieht doch gut aus. Das ganze noch in eine Funktion geworfen, und schon wird's für uns beide und hoffentlich auch für andere funktionieren.
[EDIT]... und Dieters Korrektur nachgezogen[/EDIT]
@ColdZero89
[OT]
Brrrr... Bei solchen Temperaturen übertaktet mein Zähneklappern schon beim Lesen
Die Hardware an der ich (berufsbedingt) herumbastle ist nicht so "hard", wie mein Nickname bereits vermuten lässt. Das Ganze hat auch eher was mit höheren Temperaturen zu tun.
Ich hoffe du nimmst es Dieter und mir nicht übel, wenn wir deinen Thread für ein wenig Geplänkel rund um's Thema missbrauchen
[/OT]
Am Script solls nicht liegen und OOo hat auch keine Probleme damit. Das Problem würde (wie so oft) vor dem Rechner sitzen, nämlich wenn die Datei mit Calc oder Excel geöffnet und somit gesperrt ist.
Grüße
rubberman
das sieht doch gut aus. Das ganze noch in eine Funktion geworfen, und schon wird's für uns beide und hoffentlich auch für andere funktionieren.
Option Explicit
Const iHKCU = &H80000001
Const iHKLM = &H80000002
Dim sExe
sExe = GetSofficeExePath(iHKCU)
If IsEmpty(sExe) Then sExe = GetSofficeExePath(iHKLM)
If IsEmpty(sExe) Then WScript.Quit 1
MsgBox sExe
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function GetSofficeExePath(iHKey)
Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"
Const sRegValue = "Path"
Const sComputer = "."
Dim oReg, aRegValues, sExePath
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
& sComputer & "\root\default:StdRegProv")
oReg.EnumKey iHKey, sRegKey, aRegValues
If IsArray(aRegValues) Then
If IsNumeric(aRegValues(0)) Then
oReg.GetStringValue iHKey, sRegKey & aRegValues(0), sRegValue, sExePath
End If
End If
Set oReg = Nothing
GetSofficeExePath = sExePath
End Function
@ColdZero89
[OT]
Zitat von @ColdZero89:
Spielereien sind für mich wenn ich ne Stickstoffkühlung auf meinen CPU baue und den Übertakte
Spielereien sind für mich wenn ich ne Stickstoffkühlung auf meinen CPU baue und den Übertakte
Brrrr... Bei solchen Temperaturen übertaktet mein Zähneklappern schon beim Lesen
Die Hardware an der ich (berufsbedingt) herumbastle ist nicht so "hard", wie mein Nickname bereits vermuten lässt. Das Ganze hat auch eher was mit höheren Temperaturen zu tun.
Ich hoffe du nimmst es Dieter und mir nicht übel, wenn wir deinen Thread für ein wenig Geplänkel rund um's Thema missbrauchen
[/OT]
Zitat von @ColdZero89:
Die Ausgangsdatei EXISTIERT jedesmal vom Namen her schon und muss überschrieben werden. Rattert der das so durch oder muss da nun noch ne Zeile hinzu?
Die Ausgangsdatei EXISTIERT jedesmal vom Namen her schon und muss überschrieben werden. Rattert der das so durch oder muss da nun noch ne Zeile hinzu?
Am Script solls nicht liegen und OOo hat auch keine Probleme damit. Das Problem würde (wie so oft) vor dem Rechner sitzen, nämlich wenn die Datei mit Calc oder Excel geöffnet und somit gesperrt ist.
Grüße
rubberman
Hallo rubberman!
Beim Durchlesen Deines Postes ist mir ein kleiner Fehler aufgefallen und zwar müsste (in meinem Code schon geändert) bei Dir die Codezeile 31 etwas nach oben in den IsNumeric-Block, wobei man sich die sKey-Variable dann auch gleich sparen kann
Ist Dir wohl nicht aufgefallen?
Gruß Dieter
Beim Durchlesen Deines Postes ist mir ein kleiner Fehler aufgefallen und zwar müsste (in meinem Code schon geändert) bei Dir die Codezeile 31 etwas nach oben in den IsNumeric-Block, wobei man sich die sKey-Variable dann auch gleich sparen kann
Ist Dir wohl nicht aufgefallen?
Gruß Dieter
Hallo Dieter!
Nö, im Gegenteil. Beim ersten Durchlesen des Codes sah es mir so aus als würdest du darauf hinaus wollen letztlich die höchste Versionsnummer in Variable sKey zu haben. Keine Ahnung, wie ich darauf gekommen bin. Natürlich könnte man über aRegValues iterieren und prüfen ob es mehrere Versionen gibt. Das ist aber unsinnig, da bei Installation von OOo die vorherige Version deinstalliert wird. Ergo: es genügt völlig aRegValues(0) als Maß der Dinge anzunehmen.
Danke für das Update. Ich passe die Funktion entsprechend an.
Grüße
rubberman
Zitat von @76109:
Ist Dir wohl nicht aufgefallen?
Ist Dir wohl nicht aufgefallen?
Nö, im Gegenteil. Beim ersten Durchlesen des Codes sah es mir so aus als würdest du darauf hinaus wollen letztlich die höchste Versionsnummer in Variable sKey zu haben. Keine Ahnung, wie ich darauf gekommen bin. Natürlich könnte man über aRegValues iterieren und prüfen ob es mehrere Versionen gibt. Das ist aber unsinnig, da bei Installation von OOo die vorherige Version deinstalliert wird. Ergo: es genügt völlig aRegValues(0) als Maß der Dinge anzunehmen.
Danke für das Update. Ich passe die Funktion entsprechend an.
Grüße
rubberman
Hallo ColdZero89!
Achso! Und ich dachte, dass bei Dir schon alles läuft
Habe mal was mit rubbermans Anfangs-Script zusammengebastelt, damit Du auch was zum spielen hast:
Gruß Dieter
Achso! Und ich dachte, dass bei Dir schon alles läuft
Habe mal was mit rubbermans Anfangs-Script zusammengebastelt, damit Du auch was zum spielen hast:
'Aufrufbeispiele über Batch:
'Eine Csv-/Text-Datei [csv, txt]
'@cscript //nologo "E:\Test\ConvertCsvToXls.vbs" "E:\Test\Test.csv"
'Mehrere Csv-/Text-Dateien [csv, txt]
'@cscript //nologo "E:\Test\ConvertCsvToXls.vbs" "E:\Test\*.csv"
'Main Beg
Dim oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile
Set oArgs = WScript.Arguments
If oArgs.Count <> 1 Then
WScript.Echo "Falsche Anzahl an Argumenten!": WScript.Quit 1
End If
sSrcFile = oArgs(0)
Set oFso = CreateObject("Scripting.FileSystemObject")
sExtName = oFso.GetExtensionName(sSrcFile)
If LCase(sExtName) <> "csv" And LCase(sExtName) <> "txt" Then
WScript.Echo "Falscher Dateityp [csv, txt]!": WScript.Quit 1
End If
sBaseName = oFso.GetBaseName(sSrcFile)
sFolder = oFso.GetParentFolderName(sSrcFile)
If sBaseName = "*" Then
For Each oFile In oFso.GetFolder(sFolder).Files
If LCase(oFso.GetExtensionName(oFile)) = sExtName Then
sBaseName = oFso.GetBaseName(oFile)
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")
Call ConvertCsvToXls(oFile.Path, sDstFile)
End If
Next
ElseIf Not oFso.FileExists(sSrcFile) Then
WScript.Echo "Quell-Datei nicht gefunden!": WScript.Quit 1
Else
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")
Call ConvertCsvToXls(sSrcFile, sDstFile)
End If
Set oFso = Nothing
WScript.Echo "Fertig!": WScript.Quit 0
'Main End
Private Sub ConvertCsvToXls(ByRef sCsvFile, sXlsFile)
Dim oSvcMan, oDsktp, oDoc, aProp(2), i, sCsvURL, sXlsURL
sCsvURL = "file:///" & Replace(sCsvFile, "\", "/")
sXlsURL = "file:///" & Replace(sXlsFile, "\", "/")
Set oSvcMan = CreateObject("com.sun.star.ServiceManager")
Set oDsktp = oSvcMan.createInstance("com.sun.star.frame.Desktop")
For i = 0 To UBound(aProp)
Set aProp(i) = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Next
aProp(0).Name = "Hidden"
aProp(0).Value = True
aProp(1).Name = "FilterName"
aProp(1).Value = "Text - txt - csv (StarCalc)"
aProp(2).Name = "FilterOptions"
aProp(2).Value = "59,34,ANSI,1,"
Set oDoc = oDsktp.loadComponentFromURL(sCsvURL, "_blank", 0, aProp)
aProp(1).Value = "MS Excel 97"
aProp(2).Name = ""
aProp(2).Value = ""
oDoc.storeAsURL sXlsURL, aProp
oDoc.Close False
oDsktp.Terminate
For i = 0 To UBound(aProp)
Set aProp(i) = Nothing
Next
Set oDoc = Nothing
Set oDsktp = Nothing
Set oSvcMan = Nothing
End Sub
Gruß Dieter
Hallo ColdZero89.
Mal noch 'ne Randnotiz von meiner Seite ...
Wenn ich das lese, frage ich mich was anderes ... was in aller Welt machst du eigentlich noch mit deiner Batchdatei? Ohne nun deine vorangegangenen Threads im Detail studiert zu haben, ist mir aufgefallen, dass du so ziemlich alles in VBScript erledigst. Du benutzt die Batchdatei um ein VBScript zu schreiben und anschließend aufzurufen - öhm ... Wo klemmt's eigentlich noch, um das nicht gleich ganz per VBS zu verwursten? Oder gibt es da einen speziellen Grund?
Grüße
rubberman
Mal noch 'ne Randnotiz von meiner Seite ...
Zitat von @ColdZero89:
Was ich mich nun frage: Wie in aller Welt bekomm ich DAS in mein Batch unter?
Was ich mich nun frage: Wie in aller Welt bekomm ich DAS in mein Batch unter?
Wenn ich das lese, frage ich mich was anderes ... was in aller Welt machst du eigentlich noch mit deiner Batchdatei? Ohne nun deine vorangegangenen Threads im Detail studiert zu haben, ist mir aufgefallen, dass du so ziemlich alles in VBScript erledigst. Du benutzt die Batchdatei um ein VBScript zu schreiben und anschließend aufzurufen - öhm ... Wo klemmt's eigentlich noch, um das nicht gleich ganz per VBS zu verwursten? Oder gibt es da einen speziellen Grund?
Grüße
rubberman
Hallo Zero.
... und genau darauf wollte ich hinaus. Letztlich hast du mehrere Scripts (ob du sie nun aus dem Batch erst erstellst oder gleich parallel liegen hast ändert nichts an der Tatsache ). Umbenennen und Kopieren ist mit VBS genauso machbar. Aber gut ...
Grüße
rubberman
... und genau darauf wollte ich hinaus. Letztlich hast du mehrere Scripts (ob du sie nun aus dem Batch erst erstellst oder gleich parallel liegen hast ändert nichts an der Tatsache ). Umbenennen und Kopieren ist mit VBS genauso machbar. Aber gut ...
Grüße
rubberman
Hallo zusammen!
Nachdem ich nun das Ganze nochmal getestet habe, insbsondere mit mehreren Dateien (*.csv, *.txt, *.ods), musste ich leider feststellen, dass das OO-Fenster doch ziemlich nervt. Dank rubbermans hervorragender Vorarbeit, habe ich nun ein Skript gebastelt, mit dem der Vorgang völlig im Hintergrund stattfindet.
Ausserdem habe ich im Sinne der besseren Performance, dass Skript so gestaltet, dass beim Konvertieren mehrerer Dateien, der OpenOffice-Prozess nur einmal zu Begin geladen und erst am Ende terminiert wird.
Hier der Vollständigkeit halber, die neue Version:
Gruß Dieter
Nachdem ich nun das Ganze nochmal getestet habe, insbsondere mit mehreren Dateien (*.csv, *.txt, *.ods), musste ich leider feststellen, dass das OO-Fenster doch ziemlich nervt. Dank rubbermans hervorragender Vorarbeit, habe ich nun ein Skript gebastelt, mit dem der Vorgang völlig im Hintergrund stattfindet.
Ausserdem habe ich im Sinne der besseren Performance, dass Skript so gestaltet, dass beim Konvertieren mehrerer Dateien, der OpenOffice-Prozess nur einmal zu Begin geladen und erst am Ende terminiert wird.
Hier der Vollständigkeit halber, die neue Version:
'Aufrufbeispiel über Batch mit den Dateitypen [*.csv, *.txt, *.ods]:
'@cscript //nologo "E:\Test\ConvertToXls.vbs" "E:\Test\*.csv"
'Aufrufbeispiel direkt mit den Dateitypen [*.csv, *.txt, *.ods]:
'E:\Test\ConvertToXls.vbs "E:\Test\*.csv"
Option Explicit
Const CsvChar = "ANSI" 'Zeichensatz
Const CsvText = """" 'Text-Trennzeichen = (")
Const CsvDelim = ";" 'Trennzeichen = (;)
Const CsvStart = 1 'Startzeile
Const ErrMsg1 = "Falsche Anzahl an Argumenten!"
Const ErrMsg2 = "Falscher Dateityp [*.csv, *.txt, *.ods]"
Const ErrMsg3 = "Quell-Datei nicht gefunden!"
Const ErrMsg4 = "OpenOffice konnte nicht geladen werden!"
'Konstanten zum ermitteln des Pfades der OpenOffice-Start-Exe
Const iHKCU = &H80000001
Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"
Const sRegValue = "Path"
'Konstanten zum Laden des OpenOffice-Prozesses im Hintergrund
Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"
Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"
Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin' And ParentProcessID="
Const SW_HIDE = 0
Dim oOODesktop, aOOArgs(2), oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile
'Main Beg
Set oArgs = WScript.Arguments
If oArgs.Count <> 1 Then
WScript.Echo ErrMsg1: WScript.Quit 1
End If
sSrcFile = oArgs(0)
Set oFso = CreateObject("Scripting.FileSystemObject")
sExtName = LCase(oFso.GetExtensionName(sSrcFile))
Select Case sExtName
Case "csv", "txt", "ods"
Case Else: WScript.Echo ErrMsg2: WScript.Quit 1
End Select
sBaseName = oFso.GetBaseName(sSrcFile)
sFolder = oFso.GetParentFolderName(sSrcFile)
If sBaseName = "*" Then
Call OpenOfficeStartup
For Each oFile In oFso.GetFolder(sFolder).Files
If LCase(oFso.GetExtensionName(oFile)) = sExtName Then
sBaseName = oFso.GetBaseName(oFile)
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")
Call ConvertToXls(oFile.Path, sDstFile)
End If
Next
Call OpenOfficeTerminate
ElseIf Not oFso.FileExists(sSrcFile) Then
WScript.Echo ErrMsg3: WScript.Quit 1
Else
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")
Call OpenOfficeStartup
Call ConvertToXls(sSrcFile, sDstFile)
Call OpenOfficeTerminate
End If
Set oFso = Nothing
WScript.Echo "Fertig!": WScript.Quit 0
'Main End
Private Sub ConvertToXls(ByRef sCsvFile, sXlsFile)
Dim iCsvDelim, iCsvText, iFilter
Select Case LCase(Right(sCsvFile, 3))
Case "csv", "txt"
iFilter = True
Case "ods"
iFilter = False
Case Else
Exit Sub
End Select
aOOArgs(0).Name = "Hidden"
aOOArgs(0).Value = True
aOOArgs(1).Name = "FilterName"
aOOArgs(1).Value = ""
aOOArgs(2).Name = "FilterOptions"
aOOArgs(2).Value = ""
iCsvDelim = Asc(CsvDelim): iCsvText = Asc(CsvText)
If iFilter Then 'Argumente nur für *.csv und *.txt
aOOArgs(1).Value = "Text - txt - csv (StarCalc)"
aOOArgs(2).Value = Join(Array(iCsvDelim, iCsvText, CsvChar, CsvStart), ",")
End If
With oOODesktop.LoadComponentFromURL(GetURL(sCsvFile), "_blank", 0, aOOArgs)
aOOArgs(1).Value = "MS Excel 97"
aOOArgs(2).Value = ""
.storeAsURL GetURL(sXlsFile), aOOArgs
.Close False
End With
End Sub
Private Sub OpenOfficeStartup()
Dim i
Call LoadOpenOfficeProcess
With CreateObject("com.sun.star.ServiceManager")
For i = 0 To UBound(aOOArgs)
Set aOOArgs(i) = .Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Next
Set oOODesktop = .createInstance("com.sun.star.frame.Desktop")
End With
End Sub
Private Sub LoadOpenOfficeProcess()
Dim oConfig, aRegValues, sExeFile, sExeFolder, iPID
'Den Pfad der OpenOffice-Soffice.Exe in der Registry ermitteln
With GetObject(sWinReg)
.EnumKey iHKCU, sRegKey, aRegValues
If IsArray(aRegValues) Then
If IsNumeric(aRegValues(0)) Then
.GetStringValue iHKCU, sRegKey & aRegValues(0), sRegValue, sExeFile
End If
End If
End With
'OpenOffice-Programm-Verzeichnis ermitteln
sExeFolder = oFso.GetParentFolderName(sExeFile)
If sExeFolder = "" Then WScript.Echo ErrMsg4: WScript.Quit 1
'OpenOffice ohne GUI versteckt öffnen und warten bis der Prozess vollständig geladen ist
With GetObject(sWinMan)
Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_: oConfig.ShowWindow = SW_HIDE
If .Get("Win32_Process").Create(sExeFile & " -invisible", sExeFolder, oConfig, iPID) Then
WScript.Echo ErrMsg4: WScript.Quit 1
End if
Do Until .ExecQuery(sBinSql & iPID).Count: Loop
End With
End Sub
Private Sub OpenOfficeTerminate()
Dim i
oOODesktop.Terminate: Set oOODesktop = Nothing
For i = 0 To UBound(aOOArgs)
Set aOOArgs(i) = Nothing
Next
End Sub
Rem Absolute/Relative Pfade ins OO-URL-Format konvertieren
Private Function GetURL(ByRef sFilename)
Dim sChars, sClient, i
If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"
sChars = Array("\", "/", "%", "%25", " ", "%20")
GetURL = sClient & oFso.GetAbsolutePathName(sFilename)
For i = 0 To UBound(sChars) Step 2
GetURL = Replace(GetURL, sChars(i), sChars(i + 1))
Next
End Function
Gruß Dieter
Hallo Dieter,
super! Da hast du noch einiges an Funktionalität und Feinarbeit hinein gesteckt.
Ein Problem habe ich noch immer und ich weiß nicht, ob das nur auf meiner Kiste so ist:
Ich hatte oben ein Sleep von 2 Sekunden eingebaut. Selbst wenn soffice.bin bereits detektiert wird, heißt das irgendwie nicht, dass nicht doch noch eine 2. Instanz erzeugt wird und der OO Desktop trotzdem sichtbar wird. Nach diesen 2 Sekunden passiert das nicht mehr. Hast du eine Erklärung? Ich denke, dass entweder der Prozess noch nicht vollständig geladen ist, oder es einfach eine gewisse Zeit braucht, bis der Prozess im gesamten OS bekannt ist. Ich habe diesen Effekt schon mehrfach in anderen Scripts beobachtet, aber nie eine Möglichkeit gefunden ausfindig zu machen, wann es gefahrlos weiter gehen kann. Diese 2 Sekunden sind nur ein Erfahrungswert.
Übrigens sind wir quitt. Nachdem mein Script bei dir nicht auf Anhieb gelaufen ist, gilt das nun umgekehrt auch (Stichwort HKCU/HKLM)
Grüße
rubberman
super! Da hast du noch einiges an Funktionalität und Feinarbeit hinein gesteckt.
Ein Problem habe ich noch immer und ich weiß nicht, ob das nur auf meiner Kiste so ist:
Ich hatte oben ein Sleep von 2 Sekunden eingebaut. Selbst wenn soffice.bin bereits detektiert wird, heißt das irgendwie nicht, dass nicht doch noch eine 2. Instanz erzeugt wird und der OO Desktop trotzdem sichtbar wird. Nach diesen 2 Sekunden passiert das nicht mehr. Hast du eine Erklärung? Ich denke, dass entweder der Prozess noch nicht vollständig geladen ist, oder es einfach eine gewisse Zeit braucht, bis der Prozess im gesamten OS bekannt ist. Ich habe diesen Effekt schon mehrfach in anderen Scripts beobachtet, aber nie eine Möglichkeit gefunden ausfindig zu machen, wann es gefahrlos weiter gehen kann. Diese 2 Sekunden sind nur ein Erfahrungswert.
Übrigens sind wir quitt. Nachdem mein Script bei dir nicht auf Anhieb gelaufen ist, gilt das nun umgekehrt auch (Stichwort HKCU/HKLM)
Grüße
rubberman
Hallo rubberman!
Also, ich habe jetzt mal folgendes getestet (im XP-Mode):
Erst den OO-Desktop geöffnet und dann das Script gestartet (30 Dateien), mit dem Ergebnis:
Es wird keine weitere Instanz von OO geladen und der zuvor manuell geöffnete Desktop wird terminiert (Calc nicht sichtbar).
Erst Script gestartet und dann versucht den Desktop zu öffnen, mit dem Ergebnis:
Es läßt sich in der Zeit, in der das Script läuft, keine weitere Instanz des Desktops zusätzlich öffnen.
Und das Ganze mit 2 Sekunden Pause, genau der gleiche Effekt
Falls Calc bereits zuvor geöffnet ist, dann ebenfalls der gleiche Ablauf, wobei im Falle von Änderungen in der Calc-Datei eine entsprechende Meldung (speichern, verwerfen, abbrechen) angezeigt wird. Ansonsten, wird der zuvor gestartete Calc-Prozess ebenfalls gleich mit terminiert.
Am besten wird sein, vor dem Start des Scripts zu prüfen ob OO gerade aktiv ist und wenn ja, dann das Script mit einer entsprechenden Meldung abbrechen.
Gruß Dieter
Übrigens sind wir quitt. Nachdem mein Script bei dir nicht auf Anhieb gelaufen ist,
gilt das nun umgekehrt auch (Stichwort HKCU/HKLM)
Freut mich zu hörengilt das nun umgekehrt auch (Stichwort HKCU/HKLM)
Also, ich habe jetzt mal folgendes getestet (im XP-Mode):
Erst den OO-Desktop geöffnet und dann das Script gestartet (30 Dateien), mit dem Ergebnis:
Es wird keine weitere Instanz von OO geladen und der zuvor manuell geöffnete Desktop wird terminiert (Calc nicht sichtbar).
Erst Script gestartet und dann versucht den Desktop zu öffnen, mit dem Ergebnis:
Es läßt sich in der Zeit, in der das Script läuft, keine weitere Instanz des Desktops zusätzlich öffnen.
Und das Ganze mit 2 Sekunden Pause, genau der gleiche Effekt
Falls Calc bereits zuvor geöffnet ist, dann ebenfalls der gleiche Ablauf, wobei im Falle von Änderungen in der Calc-Datei eine entsprechende Meldung (speichern, verwerfen, abbrechen) angezeigt wird. Ansonsten, wird der zuvor gestartete Calc-Prozess ebenfalls gleich mit terminiert.
Am besten wird sein, vor dem Start des Scripts zu prüfen ob OO gerade aktiv ist und wenn ja, dann das Script mit einer entsprechenden Meldung abbrechen.
Gruß Dieter
Hallo Dieter!
Sorry, wenn ich mich nicht richtig ausgedrückt habe. Natürlich gibt es immer nur eine Instanz. Auf dieser Basis arbeiten wir ja wenn wir OOo im Vorfeld versteckt öffnen.
Ich weiß nicht wie ich es besser erklären kann, als wenn
Wie auch immer, ich war in der Lage dieses Problem zu umschiffen. Es scheint, als würde das entsprechende InstanceCreationEvent genau um die richtige Zeitspanne später kommen. Siehe Zeilen 33, 155, 161 - 166.
Ich habe mal versucht dein Script entsprechend zu adaptieren.
[EDIT]Dieters Test auf bereits laufenden OOo Prozess eingefügt.[/EDIT]
Grüße
rubberman
Sorry, wenn ich mich nicht richtig ausgedrückt habe. Natürlich gibt es immer nur eine Instanz. Auf dieser Basis arbeiten wir ja wenn wir OOo im Vorfeld versteckt öffnen.
Ich weiß nicht wie ich es besser erklären kann, als wenn
CreateObject("com.sun.star.ServiceManager")
schneller ankommt, als die zuvor erzeugte Instanz bekannt ist, dann kommt das GUI trotzdem.Wie auch immer, ich war in der Lage dieses Problem zu umschiffen. Es scheint, als würde das entsprechende InstanceCreationEvent genau um die richtige Zeitspanne später kommen. Siehe Zeilen 33, 155, 161 - 166.
Ich habe mal versucht dein Script entsprechend zu adaptieren.
'Aufrufbeispiel über Batch mit den Dateitypen [*.csv, *.txt, *.ods]:
'@cscript //nologo "E:\Test\ConvertToXls.vbs" "E:\Test\*.csv"
'Aufrufbeispiel direkt mit den Dateitypen [*.csv, *.txt, *.ods]:
'E:\Test\ConvertToXls.vbs "E:\Test\*.csv"
Option Explicit
Const CsvChar = "ANSI" 'Zeichensatz
Const CsvText = """" 'Text-Trennzeichen = (")
Const CsvDelim = ";" 'Trennzeichen = (;)
Const CsvStart = 1 'Startzeile
Const ErrMsg0 = "Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!"
Const ErrMsg1 = "Falsche Anzahl an Argumenten!"
Const ErrMsg2 = "Falscher Dateityp [*.csv, *.txt, *.ods]"
Const ErrMsg3 = "Quell-Datei nicht gefunden!"
Const ErrMsg4 = "OpenOffice konnte nicht geladen werden!"
'Konstante zum Check, ob OpenOffice bereits läuft
Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin'"
'Konstanten zum ermitteln des Pfades der OpenOffice-Start-Exe
Const iHKCU = &H80000001
Const iHKLM = &H80000002
Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"
Const sRegValue = "Path"
'Konstanten zum Laden des OpenOffice-Prozesses im Hintergrund
Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"
Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"
Const sEvtSql = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"
Const SW_HIDE = 0
Dim oOODesktop, aOOArgs(2), oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile
'Main Beg
If GetObject(sWinMan).ExecQuery(sBinSql).Count Then
WScript.Echo ErrMsg0: WScript.Quit 1
End If
Set oArgs = WScript.Arguments
If oArgs.Count <> 1 Then
WScript.Echo ErrMsg1: WScript.Quit 1
End If
sSrcFile = oArgs(0)
Set oFso = CreateObject("Scripting.FileSystemObject")
sExtName = LCase(oFso.GetExtensionName(sSrcFile))
Select Case sExtName
Case "csv", "txt", "ods"
Case Else: WScript.Echo ErrMsg2: WScript.Quit 1
End Select
sBaseName = oFso.GetBaseName(sSrcFile)
sFolder = oFso.GetParentFolderName(sSrcFile)
If sBaseName = "*" Then
Call OpenOfficeStartup
For Each oFile In oFso.GetFolder(sFolder).Files
If LCase(oFso.GetExtensionName(oFile)) = sExtName Then
sBaseName = oFso.GetBaseName(oFile)
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")
Call ConvertToXls(oFile.Path, sDstFile)
End If
Next
Call OpenOfficeTerminate
ElseIf Not oFso.FileExists(sSrcFile) Then
WScript.Echo ErrMsg3: WScript.Quit 1
Else
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")
Call OpenOfficeStartup
Call ConvertToXls(sSrcFile, sDstFile)
Call OpenOfficeTerminate
End If
Set oFso = Nothing
WScript.Echo "Fertig!": WScript.Quit 0
'Main End
Private Sub ConvertToXls(ByRef sCsvFile, sXlsFile)
Dim iCsvDelim, iCsvText, iFilter
Select Case LCase(Right(sCsvFile, 3))
Case "csv", "txt"
iFilter = True
Case "ods"
iFilter = False
Case Else
Exit Sub
End Select
aOOArgs(0).Name = "Hidden"
aOOArgs(0).Value = True
aOOArgs(1).Name = "FilterName"
aOOArgs(1).Value = ""
aOOArgs(2).Name = "FilterOptions"
aOOArgs(2).Value = ""
iCsvDelim = Asc(CsvDelim): iCsvText = Asc(CsvText)
If iFilter Then 'Argumente nur für *.csv und *.txt
aOOArgs(1).Value = "Text - txt - csv (StarCalc)"
aOOArgs(2).Value = Join(Array(iCsvDelim, iCsvText, CsvChar, CsvStart), ",")
End If
With oOODesktop.LoadComponentFromURL(GetURL(sCsvFile), "_blank", 0, aOOArgs)
aOOArgs(1).Value = "MS Excel 97"
aOOArgs(2).Value = ""
.storeAsURL GetURL(sXlsFile), aOOArgs
.Close False
End With
End Sub
Private Sub OpenOfficeStartup()
Dim i
Call LoadOpenOfficeProcess
With CreateObject("com.sun.star.ServiceManager")
For i = 0 To UBound(aOOArgs)
Set aOOArgs(i) = .Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Next
Set oOODesktop = .createInstance("com.sun.star.frame.Desktop")
End With
End Sub
Private Sub LoadOpenOfficeProcess()
Dim oConfig, oEventSrc, oEvent, sExeFile, sExeFolder, iPID
'Den Pfad der OpenOffice-Soffice.Exe in der Registry ermitteln
sExeFile = GetSofficeExePath(iHKCU)
If IsEmpty(sExeFile) Then sExeFile = GetSofficeExePath(iHKLM)
'OpenOffice-Programm-Verzeichnis ermitteln
sExeFolder = oFso.GetParentFolderName(sExeFile)
If sExeFolder = "" Then WScript.Echo ErrMsg4: WScript.Quit 1
'OpenOffice ohne GUI versteckt öffnen und warten bis der Prozess vollständig geladen ist
With GetObject(sWinMan)
Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_: oConfig.ShowWindow = SW_HIDE
Set oEventSrc = .ExecNotificationQuery(sEvtSql)
If .Get("Win32_Process").Create(sExeFile & " -invisible", sExeFolder, oConfig, iPID) Then
WScript.Echo ErrMsg4: WScript.Quit 1
End if
Do
Set oEvent = oEventSrc.NextEvent()
If oEvent.TargetInstance.Name = "soffice.bin" And oEvent.TargetInstance.ParentProcessID = iPID Then
Exit Do
End If
Loop
End With
End Sub
Private Sub OpenOfficeTerminate()
Dim i
oOODesktop.Terminate: Set oOODesktop = Nothing
For i = 0 To UBound(aOOArgs)
Set aOOArgs(i) = Nothing
Next
End Sub
Rem Absolute/Relative Pfade ins OO-URL-Format konvertieren
Private Function GetURL(ByRef sFilename)
Dim sChars, sClient, i
If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"
sChars = Array("\", "/", "%", "%25", " ", "%20")
GetURL = sClient & oFso.GetAbsolutePathName(sFilename)
For i = 0 To UBound(sChars) Step 2
GetURL = Replace(GetURL, sChars(i), sChars(i + 1))
Next
End Function
Private Function GetSofficeExePath(iHKey)
Dim aRegValues, sExePath
With GetObject(sWinReg)
.EnumKey iHKey, sRegKey, aRegValues
If IsArray(aRegValues) Then
If IsNumeric(aRegValues(0)) Then
.GetStringValue iHKey, sRegKey & aRegValues(0), sRegValue, sExePath
End If
End If
End With
GetSofficeExePath = sExePath
End Function
Grüße
rubberman
Hallo rubberman!
Und danke, dass Du mein Skript entsprechend angepasst (adaptiert) hast
Gruß Dieter
Ich weiß nicht wie ich es besser erklären kann, als wenn CreateObject("com.sun.star.ServiceManager") schneller ankommt, als die zuvor erzeugte Instanz bekannt ist, dann kommt das GUI trotzdem.
Jetzt hab ich's verstanden! Bei mir ist dieser Effekt allerdings nicht aufgetretenUnd danke, dass Du mein Skript entsprechend angepasst (adaptiert) hast
Gruß Dieter
Hallo rubberman!
Bei der neuen Methode gibt es leider ein kleines Problem
Wenn die OpenOffice-Anwendung bereits geöffnet ist, dann bleibt das Skript hängen.
Abhilfe schafft eine entsprechende Abfrage am Skriptanfang:
Diese Konstanten noch hinzufügen:
Und diese Codezeilen am Anfang einfügen:
Das wäre so oder so sinnvoll und der Einfachheit halber schlage ich vor, dass Du dein Skript entsprechend editierst
Gruß Dieter
Bei der neuen Methode gibt es leider ein kleines Problem
Wenn die OpenOffice-Anwendung bereits geöffnet ist, dann bleibt das Skript hängen.
Abhilfe schafft eine entsprechende Abfrage am Skriptanfang:
Diese Konstanten noch hinzufügen:
Const ErrMsg0 = "Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!"
Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin'"
If GetObject(sWinMan).ExecQuery(sBinSql).Count Then
WScript.Echo ErrMsg0: WScript.Quit 1
End If
Das wäre so oder so sinnvoll und der Einfachheit halber schlage ich vor, dass Du dein Skript entsprechend editierst
Gruß Dieter
Hallo rubberman!
Gruß Dieter
(BTW: Irgendwo unterwegs haben wir ColdZero89 wohl verloren. )
Das hat mich auch schon gewundert, dass von ihm noch keine Rückmeldung gekommen ist? Gruß Dieter
Hallo ColdZero89!
Demzufolge würde ich an Deiner Stelle jetzt das letzte Skript von ruberman verwenden. Das nun ein richtig professionelles und sehr gutes Skript ist
Gruß Dieter
ihr habt mich nicht verloren, ne Grippe hat mich flach gelegt trifft es besser.
Na, dann gute BesserungDennoch frage ich mich: Welches Script ist denn nun für mich das richtige? Ich meine das fing mal Kurz an und endete Lang x)
Nun, dass Skript das ich Dir zum Testen angeboten hatte, war schonmal eine Erstlösung und die andere Variante war, wie Du sicherlich selbst erkennen konntest, noch nicht ganz ausgereift und getestetDemzufolge würde ich an Deiner Stelle jetzt das letzte Skript von ruberman verwenden. Das nun ein richtig professionelles und sehr gutes Skript ist
Gruß Dieter
Hallo ColdZero89!
Bist Du sicher, dass im TM die soffice.exe und soffice.bin nicht als Prozess läuft? Ansonsten kann ich das absolut nicht nachvollziehen.
Ist in der Taskleiste das OO-Symbol sichtbar?
Gruß Dieter
Bist Du sicher, dass im TM die soffice.exe und soffice.bin nicht als Prozess läuft? Ansonsten kann ich das absolut nicht nachvollziehen.
Ist in der Taskleiste das OO-Symbol sichtbar?
Gruß Dieter
Hallo ColdZero89!
Über Batch mit einem Argument aufrufen so:
oder von der Commandozeile dann so:
Gruß Dieter
Über Batch mit einem Argument aufrufen so:
@cscript //nologo "C:\Pfad\ConvertToXls.vbs" "C:\Pfad\*.csv" |
oder von der Commandozeile dann so:
C:\Pfad\ConvertToXls.vbs "C:\Pfad\*.csv" |
Gruß Dieter
Hallo ColdZero89!
Du kannst sowohl einen Dateinamen 'C:\pfad\xy.csv', als auch alle Csv's in einem ordner mit 'C:\pfad\*.csv' als Argument übergeben.
Gruß Dieter
ah ok... heißt das Script ist darauf ausgelegt die genaue Dateiangabe zu bekommen.
JainDu kannst sowohl einen Dateinamen 'C:\pfad\xy.csv', als auch alle Csv's in einem ordner mit 'C:\pfad\*.csv' als Argument übergeben.
Ich makiere den Beitrag als gelöst, ihr könnt ja weiterhin eure Spielerrein über dieses Script ziehen lassen
Wir haben soweit ausgespieltGruß Dieter
Hallo
Ich frage mich schon, warum Du das Skript über Batch erzeugst?
Destotrotz ist es kein Wunder, weil Du in dem dem Fall alle Batch-Steuerzeichen (&>|()...) entsprechend maskieren musst, damit Batch weiß, dass es diese Zeichen ignorieren soll
Gruß Dieter
Ich frage mich schon, warum Du das Skript über Batch erzeugst?
Destotrotz ist es kein Wunder, weil Du in dem dem Fall alle Batch-Steuerzeichen (&>|()...) entsprechend maskieren musst, damit Batch weiß, dass es diese Zeichen ignorieren soll
Gruß Dieter
Hallo Zero!
Schau Dir mal an, was in dem Script im Temp-Verzeichnis steht. Oder besser noch starte die Batch auf der Comandozeil mit echo On
Nimm als beispiel dies '"%Mail%"' im Makro-Text. Da wird eine Variable aufgelöst. In unserem Skript muss aber alles 1:1 in das Skript geschrieben werden und nichts in irgendeiner weise durch Batch aufgelöst oder sonstig bearbeitet werden
Gruß Dieter
Schau Dir mal an, was in dem Script im Temp-Verzeichnis steht. Oder besser noch starte die Batch auf der Comandozeil mit echo On
Nimm als beispiel dies '"%Mail%"' im Makro-Text. Da wird eine Variable aufgelöst. In unserem Skript muss aber alles 1:1 in das Skript geschrieben werden und nichts in irgendeiner weise durch Batch aufgelöst oder sonstig bearbeitet werden
Gruß Dieter
Hallo Dieter!
Was das Maskieren angeht: Betroffen sind (wegen der enthaltenen Zeichen "
Grüße
bastla
Nimm als beispiel dies '"%Mail%"' im Makro-Text. Da wird eine Variable aufgelöst. In unserem Skript muss aber alles 1:1 in das Skript geschrieben werden und nichts in irgendeiner weise durch Batch aufgelöst oder sonstig bearbeitet werden
Einspruch: Die Anführungszeichen sind dort, wo sie hingehören, und der Pfad dazwischen kommt (aufgelöst) aus der CMD-Variablen %Mail% - daher alles ok.Was das Maskieren angeht: Betroffen sind (wegen der enthaltenen Zeichen "
&
", "<
" und ">
") ja nur die Zeilen 65, 66, 81, 98, 106, 167, 193 und 205 - also halb so wild ... Grüße
bastla
Hallo bastla!
Ok, das war jetze im Eifer des Gefechts etwas daneben gegriffen
Gruß Dieter
Ok, das war jetze im Eifer des Gefechts etwas daneben gegriffen
Gruß Dieter
Hallo Zero!
Maskieren geht mit ^
Gruß Dieter
Maskieren geht mit ^
Wieso heißt das eigentlich Maskieren? (meine Interpretation: Man setzt einem Zeichen damit eine Maske auf, damit das - in dem falle - Batch es nicht lesen will/kann/möchte. Richtig?)
Damit Batch es ignoriert und als normales Zeichen liestGruß Dieter
Hallo bastla!
Gruß Dieter
- man könnte auch sagen: Damit das Zeichen nicht interpretiert wird ...
Jepp, hört sich zumindest besser anGruß Dieter
Hallo Zero!
Jepp, da hat Batch noch äh bissl was verschluckt und zwar:
Anstatt:
Denke mal mit Prozentzeichen verdoppeln, sollte es gehen
Gruß Dieter
bastla ist zu schnell für mich
Jepp, da hat Batch noch äh bissl was verschluckt und zwar:
sChars = Array("\", "/", "25", " ", "0") |
sChars = Array("\", "/", "%", "%25", " ", "%20") |
Gruß Dieter
bastla ist zu schnell für mich
Hallo Zero!
Gruß Dieter
Ich danke euch echt vielmals Script funktoniert nun 1a.
GottseidankP.S.: Ach du musst dich nur kürzer fassen Dieter ;P
Gute Idee, werde ich mir merkenGruß Dieter