wake-up-neo.com

Konvertieren Sie XLS in CSV in der Befehlszeile

Wie kann ich eine XLS-Datei in eine CSV-Datei in der Windows-Befehlszeile konvertieren?.

Auf dem Computer ist Microsoft Office 2000 installiert. Ich bin offen für die Installation von OpenOffice, falls dies nicht mit Microsoft Office möglich ist.

88
Joel

Öffnen Sie den Editor, erstellen Sie eine Datei mit dem Namen XlsToCsv.vbs und fügen Sie diese ein:

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 in einer 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.

103
ScottF

Eine etwas 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 in ExcelToCsv umbenannt, da dieses Skript nicht auf xls beschränkt ist. xlsx Funktioniert wie erwartet.

Getestet mit Office 2010.

66
plang

Eine kleine Erweiterung des groovigen VB - Skripts von ScottF: Diese Batchdatei durchläuft die .xlsx-Dateien in einem Verzeichnis und gibt sie in * .csv-Dateien aus:

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

19
user565869

Wie wäre es mit PowerShell?

Code sollte so aussehen, jedoch 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 zur Automatisierung von Microsoft Excel verwenden?

14
YOU

Hier ist eine Version, die mehrere Dateien mit Drag & Drop von Windows ..__ verarbeitet. 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:

'* 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
6
Chris Rudd

Ich musste mehrere CVS aus verschiedenen Arbeitsblättern extrahieren, daher ist hier eine modifizierte Version von Plang-Code, mit der Sie den Arbeitsblattnamen 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
6
Christian Lemer

Warum schreibst du nicht deine eigene?

Ich sehe aus Ihrem Profil, dass Sie zumindest etwas Erfahrung mit C #/.NET haben. Ich würde eine Windows-Konsolenanwendung erstellen und einen kostenlosen Excel-Reader verwenden, um Ihre Excel-Datei (en) einzulesen. Ich habe Excel Data Reader ohne Probleme bei CodePlex verwendet (eine schöne Sache: Dieser Reader erfordert keine Installation von Excel). Sie können Ihre Konsolenanwendung über die Befehlszeile aufrufen.

Wenn Sie sich hier festgefahren haben und ich bin sicher, dass Sie Hilfe bekommen.

5
Jay Riggs

Sie können dies mit Alacon - Befehlszeilenhilfsprogramm für Alasql database tun. Es funktioniert mit Node.js, daher müssen Sie Node.js und dann Alasql package installieren.

Um eine Excel-Datei in CVS (oder 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". Sie können diese jedoch mit Parametern ändern:

{headers:false, sheetid: 'Sheet2', range: 'A1:C100'}

Alacon unterstützt andere Konvertierungstypen (CSV, TSV, TXT, XLSX, XLS) und SQL-Sprachkonstruktionen (siehe Benutzerhandbuch für Beispiele).

3
agershun

Aufbauend auf dem, was Jon of All Trades zur Verfügung gestellt hat, wurde (~ n) das lästige Problem mit der doppelten Erweiterung entfernt: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

2
Charles Crous

Ich habe die ScottF VB -Lösung ausprobiert und sie zum Laufen gebracht. Ich wollte jedoch eine Excel-Datei mit mehreren Registerkarten (Arbeitsmappe) in eine einzelne CSV-Datei konvertieren. 

Das hat nicht funktioniert, nur eine Registerkarte (die, wenn ich sie über Excel öffne, ist hervorgehoben) wurde kopiert.

Kennt jemand ein Skript, das eine Excel-Datei mit mehreren Registerkarten in eine einzelne CSV-Datei konvertieren kann?

1
user1132593

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.

1
Tim Robinson

Alle diese Antworten haben mir dabei geholfen, das folgende Skript zu erstellen, das XLS * -Dateien automatisch in CSV und umgekehrt konvertiert, indem eine oder mehrere Dateien (oder über die Befehlszeile) im Skript abgelegt werden. Entschuldigung für die janky Formatierung.

' https://stackoverflow.com/questions/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
0
drzaus

Scott Fs Antwort ist das Beste, was ich im Internet gefunden habe. Ich habe seinen Code hinzugefügt, um meine Bedürfnisse 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, um zu verhindern, dass Excel führende Nullen löscht und in meinen Datenzeichen keine Kommas (z. B. 1,200 bis 1200) verwendet. Der Säulenbereich sollte an Ihre Bedürfnisse angepasst werden (A: J).

Ich habe auch das Echo "erledigt" entfernt, um es nicht interaktiv zu machen.

Dann fügte ich das Skript in eine cmd-Batchdatei ein, um stundenweise automatisierte Daten über eine Aufgabe zu verarbeiten.

0
Jeffrey O