Konvertieren Sie XLS in CSV in der Befehlszeile

103

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, wenn dies mit Microsoft Office nicht möglich ist.

Joel
quelle

Antworten:

124

Ö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.

ScottF
quelle
20
Falls sich jemand wundert, ist der Parameter 6 in der Funktion oBook.SaveAs die Konstante für das CSV-Format.
ScottF
Funktioniert einwandfrei und nicht nur für XLS-Dateien, sondern auch für XLSX. Wie von Andrew gesagt, müssen Dateipfade entweder absolut oder im Benutzerverzeichnis "data" sein (ich bin mir nicht sicher, wie der genaue Name in Englisch lautet). Ich habe immer noch nicht herausgefunden, wie ich das lösen soll, ich mache nicht viel vbscript! :)
Plang
3
Ich habe unten eine leicht modifizierte Version gepostet, die Dateipfade besser handhabt. Danke ScottF!
Plang
7
Der Code konvertiert nur das aktive Arbeitsblatt. Um ein anderes Arbeitsblatt auszuwählen, fügen Sie die folgende Zeile nach der oExcel.Workbooks.OpenZeile mit dem gewünschten Index des Arbeitsblatts hinzu (beginnt bei 1): oBook.Worksheets(1).Activate
Humbads
1
Es sollte beachtet werden, dass dies nicht nur auf xls oder xlsx funktioniert, sondern auf jeder Datei, die Excel selbst öffnen kann.
user1318135
81

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.

plang
quelle
Ich benutze dies (mit wenigen Anpassungen), um von XML nach XLS zu konvertieren. Ich möchte jedoch nicht, dass während dieser Konvertierung das Kompatibilitätswarnfeld von Excel angezeigt wird. Wissen Sie, wie ich diese Warnung deaktivieren kann?
Jpnavarini
Gibt es eine Möglichkeit, diese Datei als Unicode-Zeichensatz zu speichern?
rjv
2
Ich habe diese Antwort zusammen mit der Antwort von @ user565869 in einem Gist mit einfachen Anweisungen zusammengestellt. Siehe: Skript zum Konvertieren einer Excel-Datei in CSV
10GritSandpaper
1
Das ist schön zusammengestellt @ 10GritSandpaper
amrrs
Gibt es eine Möglichkeit zu verwenden; als Trennzeichen statt? Ich habe versucht, oBook.SaveAs dest_file, csv_format, Local: = True zu ändern, aber ich erhalte die Fehlermeldung, dass eine Anweisung nach dem folgenden Ergebnis erwartet wird: als Trennzeichen. Vielleicht kann einer von euch mir helfen.
Suckerp
27

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

Michael Freidgeim
quelle
1
@Rieaux: In Bezug auf Ihren Kommentar als Bearbeitung: Wenn dies den Dateien eine doppelte Erweiterung verleiht, kann eine zweite einfache Batchdatei sie umbenennen. Dies führt jedoch zu einer neuen Frage; Bitte probieren Sie es aus und wenn Sie es nicht zum Laufen bringen können, stellen Sie hier auf SU eine neue Frage.
Diese Automatisierung hat mir das Leben gerettet. :) Danke u
Pushker Yadav
1
Ich habe diese Antwort zusammen mit @plangs Antwort in einem Gist mit einfachen Anweisungen zusammengestellt. Siehe: Skript zum Konvertieren von Excel-
Dateien
@ 10GritSandpaper Verwenden von Excel 2007. Das Skript in Ihrem Link hat bei mir nicht funktioniert.
Boris_yo
Sie können "%% i.csv" in "%% ~ ni.csv" ändern, um die Dateierweiterung ".xls" in den CSV-Dateien zu entfernen.
Shaohua Li
18

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?

SIE
quelle
Das sieht nach einem guten Ansatz aus. Leider konnte ich es nicht zum Laufen bringen. Ich bin mit PowerShell nicht vertraut. Als ich auf einen Fehler stieß, wusste ich nicht, was ich tun sollte. Ich konnte keine PowerShell-spezifische Lösung finden: support.microsoft.com/kb/320369
Joel
Hier sind einige Tipps für Powershell und Excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
SIE
Ich habe einen Testlauf durchgeführt und bin auch auf Probleme gestoßen. Eine Sache, auf die ich stieß, war die Schwierigkeit mit der $Excel.Workbooks.OpenMethode. Die angegebene Datei konnte nicht gefunden werden. Ich habe dies umgangen, indem ich Get-Itemdie Datei ForEach-Objectfür die beiden Zeilen verwendet und an eine Schleife weitergeleitet habe (was ich ohnehin in meiner endgültigen Implementierung tun werde) $Workbook.
Iszi
Das Problem wurde behoben, aber dann konnte ich das resultierende "YOURDOC.csv" nicht finden - es befand sich nicht im selben Ordner wie "YOUDOC.XLS". Ich ging zurück zu altem und vertrauenswürdigem CMD und tat es 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).
Iszi
8

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
Christian Lemer
quelle
8

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
Chris Rudd
quelle
1
Gibt es eine Möglichkeit, UTF-8-Codierung durchzuführen?
StuBob
So überspringen Sie das Schreiben von Headern in der Ziel-CSV-Datei. Ich verstehe das obige Skript absolut nicht, aber ich verwende es in meiner Automatisierung. Danke.
TharunRaja
@TharunRaja Das Skript öffnet die Datei in Excel und führt dann ein "Speichern unter" in CSV durch, genau wie wenn Sie es von Hand gemacht hätten, außer dass es im Hintergrund ausgeblendet wird. Da das Skript selbst die Konvertierung nicht durchführt und Sie sie automatisieren, würde ich vorschlagen, ein zweites Skript für die von dieser Ausgabe ausgegebenen CSV-Dateien aufzurufen und mir eine Nachricht zu senden, wenn Sie Hilfe beim Erstellen eines Skripts benötigen, das die erste Zeile von a entfernt Datei, die Sie übergeben.
Chris Rudd
Ich selbst brauchte eine leistungsstärkere Version in Powershell, die Datumsangaben korrekt verarbeiten kann, Header verarbeiten kann, die nicht in der ersten Zeile stehen, und einige andere Dinge (sie analysiert tatsächlich die einzelnen Zellen, anstatt Excel zu vertrauen). Wenn Leute ein Bedürfnis danach äußern, werde ich es veröffentlichen, aber da dies im Wesentlichen beantwortet wird und wir die Sprache wechseln würden, möchte ich keine Duplikate veröffentlichen.
Chris Rudd
5

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.

Jay Riggs
quelle
Eigentlich habe ich noch nie ein C # geschrieben. Aber ich denke, ich werde es mit dem Excel Data Reader versuchen.
Joel
3
Ein bisschen übertrieben, findest du nicht? Riecht nach NIH.
Mr. Boy
1
Ich glaube nicht, dass der Excel Data Reader NIH ist. Zuerst hat es jemand anderes geschrieben. Zweitens löste es das Problem besser als vollwertiges Excel.
Justin Dearing
4

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 ).

Agershun
quelle
1
Beeindruckend! Alasql ist wirklich mächtig.
Lukasz Wiktor
Wenn Sie AlaSQL global installieren (npm install alasql -g), können Sie einfach> alasql "SELECT ... IN CSV (...) FROM XLS (...)"
agershun
2

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.

Tim Robinson
quelle
Unterschätzte Antwort. Warum sollte jemand eine DLL-Datei eines Drittanbieters installieren, wenn in Windows die Funktionalität integriert ist?
Geoff Griswald
2

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"

Charles Crous
quelle
1

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?

user1132593
quelle
0

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.

Jeffrey O.
quelle
2
Ich denke, Sie sollten in Betracht ziehen, die endgültige Version des Codes mit Kommentaren zu veröffentlichen.
Standardgebietsschema
0

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
drzaus
quelle
0

:: 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
p4n1
quelle
0

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.

Arvy
quelle