Antworten:
Öffnen Sie den Editor, erstellen Sie eine Datei mit dem Namen XlsToCsv.vbs und fügen Sie diese ein in:
if WScript.Arguments.Count < 2 Then
WScript.Echo "Error! Please specify the source path and the destination. Usage: XlsToCsv SourcePath.xls Destination.csv"
Wscript.Quit
End If
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))
oBook.SaveAs WScript.Arguments.Item(1), 6
oBook.Close False
oExcel.Quit
WScript.Echo "Done"
Wechseln Sie dann über eine Befehlszeile zu dem Ordner, in dem Sie die .vbs-Datei gespeichert haben, und führen Sie Folgendes aus:
XlsToCsv.vbs [sourcexlsFile].xls [destinationcsvfile].csv
Dies erfordert jedoch, dass Excel auf dem Computer installiert ist, auf dem Sie sich befinden.
oExcel.Workbooks.Open
Zeile mit dem gewünschten Index des Arbeitsblatts hinzu (beginnt bei 1): oBook.Worksheets(1).Activate
Eine leicht modifizierte Version der ScottF-Antwort, für die keine absoluten Dateipfade erforderlich sind:
if WScript.Arguments.Count < 2 Then
WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file>"
Wscript.Quit
End If
csv_format = 6
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.SaveAs dest_file, csv_format
oBook.Close False
oExcel.Quit
Ich habe das Skript ExcelToCsv umbenannt, da dieses Skript überhaupt nicht auf xls beschränkt ist. xlsx Funktioniert einwandfrei, wie wir es erwarten konnten.
Getestet mit Office 2010.
Eine kleine Erweiterung von ScottFs groovigem VB-Skript: Diese Batch-Datei durchläuft die XLSX-Dateien in einem Verzeichnis und speichert sie in * CSV-Dateien:
FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%i.csv"
Hinweis: Sie können die Erweiterung .xlsx in .xls und den Namen des Skripts ExcelToCSV in XlsToCsv ändern
Wie wäre es mit PowerShell?
Der Code sollte so aussehen, aber nicht getestet werden
$xlCSV = 6
$Excel = New-Object -Com Excel.Application
$Excel.visible = $False
$Excel.displayalerts=$False
$WorkBook = $Excel.Workbooks.Open("YOUDOC.XLS")
$Workbook.SaveAs("YOURDOC.csv",$xlCSV)
$Excel.quit()
Hier ist ein Beitrag, der erklärt, wie man es benutzt
Wie kann ich Windows PowerShell verwenden, um Microsoft Excel zu automatisieren?
$Excel.Workbooks.Open
Methode. Die angegebene Datei konnte nicht gefunden werden. Ich habe dies umgangen, indem ich Get-Item
die Datei ForEach-Object
für die beiden Zeilen verwendet und an eine Schleife weitergeleitet habe (was ich ohnehin in meiner endgültigen Implementierung tun werde) $Workbook
.
CD /D C:\ && DIR YOURDOC.csv /s
. Es stellte sich heraus, dass die Datei standardmäßig in Eigene Dateien gespeichert wurde. Sie müssen also mehr in das Skript einfügen, wenn Sie die Datei in demselben Ordner speichern möchten, in dem Sie arbeiten (sofern es sich nicht um Eigene Dateien handelt).
Ich musste mehrere Lebensläufe aus verschiedenen Arbeitsblättern extrahieren. Hier ist eine modifizierte Version des Plang-Codes, mit der Sie den Namen des Arbeitsblatts angeben können.
if WScript.Arguments.Count < 3 Then
WScript.Echo "Please specify the sheet, the source, the destination files. Usage: ExcelToCsv <sheetName> <xls/xlsx source file> <csv destination file>"
Wscript.Quit
End If
csv_format = 6
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(1))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(2))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.Sheets(WScript.Arguments.Item(0)).Select
oBook.SaveAs dest_file, csv_format
oBook.Close False
oExcel.Quit
Hier ist eine Version, die mehrere Dateien verarbeitet, die per Drag & Drop aus Windows gezogen werden. Basierend auf den oben genannten Arbeiten von
Christian Lemer
plang
ScottF
Öffnen Sie den Editor, erstellen Sie eine Datei mit dem Namen XlsToCsv.vbs und fügen Sie diese ein in:
'* Usage: Drop .xl* files on me to export each sheet as CSV
'* Global Settings and Variables
Dim gSkip
Set args = Wscript.Arguments
For Each sFilename In args
iErr = ExportExcelFileToCSV(sFilename)
' 0 for normal success
' 404 for file not found
' 10 for file skipped (or user abort if script returns 10)
Next
WScript.Quit(0)
Function ExportExcelFileToCSV(sFilename)
'* Settings
Dim oExcel, oFSO, oExcelFile
Set oExcel = CreateObject("Excel.Application")
Set oFSO = CreateObject("Scripting.FileSystemObject")
iCSV_Format = 6
'* Set Up
sExtension = oFSO.GetExtensionName(sFilename)
if sExtension = "" then
ExportExcelFileToCSV = 404
Exit Function
end if
sTest = Mid(sExtension,1,2) '* first 2 letters of the extension, vb's missing a Like operator
if not (sTest = "xl") then
if (PromptForSkip(sFilename,oExcel)) then
ExportExcelFileToCSV = 10
Exit Function
end if
End If
sAbsoluteSource = oFSO.GetAbsolutePathName(sFilename)
sAbsoluteDestination = Replace(sAbsoluteSource,sExtension,"{sheet}.csv")
'* Do Work
Set oExcelFile = oExcel.Workbooks.Open(sAbsoluteSource)
For Each oSheet in oExcelFile.Sheets
sThisDestination = Replace(sAbsoluteDestination,"{sheet}",oSheet.Name)
oExcelFile.Sheets(oSheet.Name).Select
oExcelFile.SaveAs sThisDestination, iCSV_Format
Next
'* Take Down
oExcelFile.Close False
oExcel.Quit
ExportExcelFileToCSV = 0
Exit Function
End Function
Function PromptForSkip(sFilename,oExcel)
if not (VarType(gSkip) = vbEmpty) then
PromptForSkip = gSkip
Exit Function
end if
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
sPrompt = vbCRLF & _
"A filename was received that doesn't appear to be an Excel Document." & vbCRLF & _
"Do you want to skip this and all other unrecognized files? (Will only prompt this once)" & vbCRLF & _
"" & vbCRLF & _
"Yes - Will skip all further files that don't have a .xl* extension" & vbCRLF & _
"No - Will pass the file to excel regardless of extension" & vbCRLF & _
"Cancel - Abort any further conversions and exit this script" & vbCRLF & _
"" & vbCRLF & _
"The unrecognized file was:" & vbCRLF & _
sFilename & vbCRLF & _
"" & vbCRLF & _
"The path returned by the system was:" & vbCRLF & _
oFSO.GetAbsolutePathName(sFilename) & vbCRLF
sTitle = "Unrecognized File Type Encountered"
sResponse = MsgBox (sPrompt,vbYesNoCancel,sTitle)
Select Case sResponse
Case vbYes
gSkip = True
Case vbNo
gSkip = False
Case vbCancel
oExcel.Quit
WScript.Quit(10) '* 10 Is the error code I use to indicate there was a user abort (1 because wasn't successful, + 0 because the user chose to exit)
End Select
PromptForSkip = gSkip
Exit Function
End Function
Warum nicht selbst schreiben?
Ich sehe aus Ihrem Profil, dass Sie mindestens einige C # /. NET-Erfahrungen haben. Ich würde eine Windows-Konsolenanwendung erstellen und einen kostenlosen Excel-Reader verwenden, um Ihre Excel-Datei (en) einzulesen. Ich habe den von CodePlex erhältlichen Excel Data Reader problemlos verwendet (eine nette Sache: Für diesen Reader muss Excel nicht installiert sein). Sie können Ihre Konsolenanwendung über die Befehlszeile aufrufen.
Wenn Sie hier festsitzen und ich bin sicher, Sie werden Hilfe bekommen.
Sie können dies mit Alacon tun - dem Befehlszeilenprogramm für die Alasql- Datenbank. Es funktioniert mit Node.js, daher müssen Sie Node.js und dann das Alasql- Paket installieren .
Um eine Excel-Datei in CVS (ot TSV) zu konvertieren, können Sie Folgendes eingeben:
> node alacon "SELECT * INTO CSV('mydata.csv', {headers:true}) FROM XLS('mydata.xls', {headers:true})"
Standardmäßig konvertiert Alasql Daten aus "Sheet1", aber Sie können sie mit folgenden Parametern ändern:
{headers:false, sheetid: 'Sheet2', range: 'A1:C100'}
Alacon unterstützt andere Arten von Konvertierungen (CSV, TSV, TXT, XLSX, XLS) und SQL-Sprachkonstruktionen (Beispiele finden Sie im Benutzerhandbuch ).
In Windows ist ein Excel OLEDB-Datenprovider integriert. Sie können dies verwenden, um die Excel-Tabelle über ADO.NET abzufragen und die Ergebnisse in eine CSV-Datei zu schreiben. Es ist eine kleine Menge an Codierung erforderlich, aber Sie sollten nichts auf dem Computer installieren müssen.
Aufbauend auf dem, was Jon of All Trades bereitgestellt hat, wurde mit dem folgenden (~ n) das lästige Problem der doppelten Erweiterung behoben:
FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"
Ich habe die ScottF VB-Lösung ausprobiert und zum Laufen gebracht. Ich wollte jedoch eine Excel-Datei mit mehreren Registerkarten (Arbeitsmappe) in eine einzelne CSV-Datei konvertieren.
Dies hat nicht funktioniert, nur eine Registerkarte (die beim Öffnen über Excel hervorgehoben wird) wurde kopiert.
Ist jemandem ein Skript bekannt, das eine Excel-Datei mit mehreren Registerkarten in eine einzelne CSV-Datei konvertieren kann?
Die Antwort von Scott F ist die beste, die ich im Internet gefunden habe. Ich habe seinen Code erweitert, um meine Anforderungen zu erfüllen. Ich fügte hinzu:
On Error Resume Next <- Um fehlende XLS-Dateien in meiner Stapelverarbeitung oben zu berücksichtigen. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Vor der SaveAs-Zeile, um sicherzustellen, dass meine Daten als Text formatiert gespeichert werden, damit Excel keine führenden Nullen löscht und Kommas in Zahlenfolgen in meinen Daten entfernt dh (1.200 bis 1200). Der Spaltenbereich sollte an Ihre Bedürfnisse angepasst werden (A: J).
Ich habe auch das Echo "erledigt" entfernt, um es nicht interaktiv zu machen.
Anschließend habe ich das Skript in eine Cmd-Batch-Datei eingefügt, um automatisierte Daten stündlich über eine Aufgabe zu verarbeiten.
Alle diese Antworten haben mir geholfen, das folgende Skript zu erstellen, das XLS * -Dateien automatisch in CSV konvertiert und umgekehrt , indem eine oder mehrere Dateien im Skript (oder über die Befehlszeile) abgelegt werden. Entschuldigung für die ruckelige Formatierung.
' /programming/1858195/convert-xls-to-csv-on-command-line
' https://gist.github.com/tonyerskine/77250575b166bec997f33a679a0dfbe4
' https://stackoverflow.com/a/36804963/1037948
'* Global Settings and Variables
Set args = Wscript.Arguments
For Each sFilename In args
iErr = ConvertExcelFormat(sFilename)
' 0 for normal success
' 404 for file not found
' 10 for file skipped (or user abort if script returns 10)
Next
WScript.Quit(0)
Function ConvertExcelFormat(srcFile)
if IsEmpty(srcFile) OR srcFile = "" Then
WScript.Echo "Error! Please specify at least one source path. Usage: " & WScript.ScriptName & " SourcePath.xls*|csv"
ConvertExcelFormat = -1
Exit Function
'Wscript.Quit
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
srcExt = objFSO.GetExtensionName(srcFile)
' the 6 is the constant for 'CSV' format, 51 is for 'xlsx'
' https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlfileformat-enumeration-excel
' https://www.rondebruin.nl/mac/mac020.htm
Dim outputFormat, srcDest
If LCase(Mid(srcExt, 1, 2)) = "xl" Then
outputFormat = 6
srcDest = "csv"
Else
outputFormat = 51
srcDest = "xlsx"
End If
'srcFile = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
srcFile = objFSO.GetAbsolutePathName(srcFile)
destFile = Replace(srcFile, srcExt, srcDest)
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(srcFile)
' preserve formatting? https://stackoverflow.com/a/8658845/1037948
'oBook.Application.Columns("A:J").NumberFormat = "@"
oBook.SaveAs destFile, outputFormat
oBook.Close False
oExcel.Quit
WScript.Echo "Conversion complete of '" & srcFile & "' to '" & objFSO.GetFileName(destFile) & "'"
End Function
:: Für UTF-8 funktioniert für Microsoft Office 2016 und höher!
Versuchen Sie diesen Code:
if WScript.Arguments.Count < 2 Then
WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file>"
Wscript.Quit
End If
csv_format = 62
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.SaveAs dest_file, csv_format
oBook.Close False
oExcel.Quit
Erstellen Sie auf Ihrem Desktop eine TXT-Datei mit dem Namen "xls2csv.vbs" und fügen Sie den Code ein:
Dim vExcel
Dim vCSV
Set vExcel = CreateObject("Excel.Application")
Set vCSV = vExcel.Workbooks.Open(Wscript.Arguments.Item(0))
vCSV.SaveAs WScript.Arguments.Item(0) & ".csv", 6
vCSV.Close False
vExcel.Quit
Ziehen Sie eine XLS-Datei darauf (wie "test.xls"). Es wird eine konvertierte CSV-Datei mit dem Namen "test.xls.csv" erstellt. Benennen Sie es dann in "test.csv" um. Getan.