Konwertuj XLS na CSV w wierszu poleceń

104

Jak mogę przekonwertować plik XLS na plik CSV w wierszu poleceń systemu Windows.

Na urządzeniu jest zainstalowany pakiet Microsoft Office 2000. Jestem otwarty na zainstalowanie OpenOffice, jeśli nie jest to możliwe przy użyciu pakietu Microsoft Office.

Joel
źródło

Odpowiedzi:

125

Otwórz Notatnik, utwórz plik o nazwie XlsToCsv.vbs i wklej to w:

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"

Następnie z wiersza poleceń przejdź do folderu, w którym zapisałeś plik .vbs i uruchom:

XlsToCsv.vbs [sourcexlsFile].xls [destinationcsvfile].csv

Wymaga to jednak zainstalowania programu Excel na komputerze, na którym się znajdujesz.

ScottF
źródło
20
Na wypadek gdyby ktoś się zastanawiał, parametr 6 w funkcji oBook.SaveAs jest stałą dla formatu CSV.
ScottF
Działa dobrze i nie tylko w przypadku plików xls, ale także xlsx. Jak powiedział Andrew, ścieżki plików muszą być albo bezwzględne, albo znajdować się w katalogu „data” użytkownika (nie jestem pewien, jaka jest dokładna nazwa w języku angielskim). Nadal nie wymyśliłem, jak to rozwiązać, nie robię dużo vbscript! :)
plang
3
Poniżej zamieściłem nieco zmodyfikowaną wersję, która lepiej obsługuje ścieżki plików. Dzięki ScottF!
plang
7
Kod konwertuje tylko aktywny arkusz. Aby wybrać inny arkusz roboczy, dodaj następujący wiersz po oExcel.Workbooks.Openwierszu z żądanym indeksem arkusza (zaczyna się od 1): oBook.Worksheets(1).Activate
humbads
1
Należy zauważyć, że działa to nie tylko na xls lub xlsx, ale na każdym pliku, który sam Excel może otworzyć.
user1318135
81

Nieznacznie zmodyfikowana wersja odpowiedzi ScottF, która nie wymaga bezwzględnych ścieżek plików:

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

Zmieniłem nazwę skryptu na ExcelToCsv, ponieważ ten skrypt w ogóle nie ogranicza się do xls. xlsx działa dobrze, jak mogliśmy się spodziewać.

Przetestowano z pakietem Office 2010.

plang
źródło
Używam tego (z kilkoma dostosowaniami) do konwersji z XML na XLS. Jednak nie chcę, aby podczas tej konwersji w programie Excel było wyświetlane ostrzeżenie o zgodności. Czy wiesz, jak mogę wyłączyć to ostrzeżenie?
jpnavarini
Czy istnieje sposób, aby zapisać ten plik jako zestaw znaków Unicode?
rjv
2
Umieściłem tę odpowiedź razem z odpowiedzią @ user565869 w streszczeniu z prostymi instrukcjami. Zobacz: Skrypt do konwersji pliku Excel do CSV
10GritSandpaper
1
To miło zebrane @ 10GritSandpaper
amrrs,
Czy jest sposób na użycie; jako separator zamiast,? Próbowałem zmienić oBook.SaveAs dest_file, csv_format, Local: = True, ale pojawia się błąd, że po: Kiedy dodałem, „Local: = True” nie ma więcej błędów, ale nadal zamiast; jako separator. Może ktoś z was może mi pomóc.
frajer,
27

Małe rozszerzenie o świetnym skrypcie VB firmy ScottF: ten plik wsadowy przejdzie przez pliki .xlsx w katalogu i zrzuci je do plików * .csv:

FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%i.csv"

Uwaga: możesz zmienić rozszerzenie .xlsx na .xls i nazwę skryptu ExcelToCSV na XlsToCsv

Michael Freidgeim
źródło
1
@Rieaux: Odnośnie twojego komentarza jako edycji: jeśli daje to plikom podwójne rozszerzenie, drugi prosty plik wsadowy może zmienić ich nazwę. To jednak prowadzi do nowego pytania; spróbuj, a jeśli nie możesz tego zrobić, opublikuj nowe pytanie tutaj na SU.
ta automatyzacja uratowała mi życie. :) Dziękuję
Pushker Yadav
1
Umieściłem tę odpowiedź razem z odpowiedzią @plang w streszczeniu z prostymi instrukcjami. Zobacz: Skrypt do konwersji pliku Excel do CSV
10GritSandpaper
@ 10GritSandpaper Używając programu Excel 2007. Skrypt w twoim łączu nie działa dla mnie.
Boris_yo
Możesz zmienić „%% i.csv” na „%% ~ ni.csv”, aby usunąć rozszerzenie „.xls” z plików csv.
Shaohua Li
18

A co z PowerShell?

Kod powinien wyglądać tak, ale nie testowany

$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()

Oto post wyjaśniający, jak go używać

Jak używać programu Windows PowerShell do automatyzacji programu Microsoft Excel?

TY
źródło
To wygląda na dobre podejście. Niestety nie mogłem tego uruchomić. Nie znam PowerShell, więc kiedy napotkałem błąd, nie wiedziałem, co robić. Nie mogłem znaleźć rozwiązania specyficznego dla PowerShell: support.microsoft.com/kb/320369
Joel
Oto kilka wskazówek dotyczących programu PowerShell i programu Excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/ ...
TY
Zrobiłem to testowo i również napotkałem problemy. Jedna rzecz, na którą natknąłem się, to trudności z $Excel.Workbooks.Openmetodą. Nie mógł znaleźć określonego pliku. Obejrzałem to, używając Get-Itempliku i umieszczając go w ForEach-Objectpętli (coś, co i tak zrobię w mojej ostatecznej implementacji) dla dwóch linii zaczynających się od $Workbook.
Iszi
To rozwiązało problem, ale nie mogłem znaleźć wynikowego pliku „YOURDOC.csv” - nie znajdował się on w tym samym folderze co „YOUDOC.XLS”. Wróciłem do starego i zaufanego CMD i to zrobiłem CD /D C:\ && DIR YOURDOC.csv /s. Okazuje się, że plik został domyślnie zapisany w folderze Moje dokumenty. Musisz więc umieścić więcej w skrypcie, jeśli chcesz zapisać plik w tym samym folderze, w którym pracujesz (jeśli jest inny niż Moje dokumenty).
Iszi
8

Musiałem wyodrębnić kilka CV z różnych arkuszy, więc tutaj jest zmodyfikowana wersja kodu plang, która pozwala określić nazwę arkusza.

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
źródło
8

Oto wersja, która poradzi sobie z przeciąganiem i upuszczaniem wielu plików z systemu Windows. W oparciu o powyższe prace autorstwa

Christian Lemer
plang
ScottF

Otwórz Notatnik, utwórz plik o nazwie XlsToCsv.vbs i wklej to w:

'* 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
źródło
1
Czy istnieje sposób na kodowanie UTF-8?
StuBob
Jak pominąć zapis nagłówka w docelowym pliku CSV. Absolutnie nie rozumiem powyższego skryptu, ale używam go w mojej automatyzacji. Dziękuję Ci.
TharunRaja
@TharunRaja Skrypt otwiera plik w programie Excel, a następnie „zapisze jako” do CSV, tak jak gdybyś zrobił to ręcznie, ale ukrywa go w tle. Ponieważ sam skrypt nie wykonuje konwersji, a ty ją automatyzujesz, sugerowałbym wywołanie drugiego skryptu w plikach csv, które generuje. Napisz do mnie wiadomość, jeśli potrzebujesz pomocy przy tworzeniu takiego, który usuwa pierwszą linię z plik przekazujesz.
Chris Rudd
Ja potrzebowałem mocniejszej wersji w PowerShell, która może poprawnie przetwarzać daty, poradzi sobie z nagłówkami, które nie znajdują się w pierwszej linii, i kilka innych rzeczy (w rzeczywistości analizuje poszczególne komórki, zamiast ufać excelowi). Jeśli ludzie wyrażą taką potrzebę, opublikuję to, ale ponieważ jest to zasadniczo odpowiedź i będziemy zmieniać języki, nie chcę publikować duplikatów.
Chris Rudd
5

Dlaczego nie napisać własnego?

Widzę z twojego profilu, że masz przynajmniej pewne doświadczenie w C # / .NET. Utworzyłbym aplikację konsoli Windows i użył darmowego czytnika Excela do odczytu plików Excela. Użyłem programu Excel Data ReaderBez problemu dostępnego w CodePlex (jedna fajna rzecz: ten czytnik nie wymaga instalacji Excela). Możesz wywołać aplikację konsoli z wiersza poleceń.

Jeśli utkniesz, napisz tutaj i na pewno otrzymasz pomoc.

Jay Riggs
źródło
Właściwie nigdy nie napisałem żadnego C #. Ale myślę, że dam sobie radę z Excel Data Reader.
Joel
3
Nie sądzisz, że trochę przesada. Pachnie NIH.
Mr. Boy
1
Nie sądzę, aby Excel Data Reader był NIH. Przede wszystkim napisał to ktoś inny. Po drugie, rozwiązał problem lepiej niż pełny Excel.
Justin Dearing,
4

Możesz to zrobić za pomocą Alacon - narzędzia wiersza poleceń dla bazy danych Alasql . Działa z Node.js, więc musisz zainstalować Node.js, a następnie pakiet Alasql .

Aby przekonwertować plik Excel do CVS (ot TSV), możesz wpisać:

> node alacon "SELECT * INTO CSV('mydata.csv', {headers:true}) FROM XLS('mydata.xls', {headers:true})"

Domyślnie Alasql konwertuje dane z "Arkusza1", ale możesz to zmienić za pomocą parametrów:

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

Alacon obsługuje inne typy konwersji (CSV, TSV, TXT, XLSX, XLS) i konstrukcje języka SQL ( przykłady znajdują się w instrukcji obsługi).

agershun
źródło
1
Łał! Alasql jest naprawdę potężny.
Łukasz Wiktor
Jeśli zainstalujesz AlaSQL globalnie (npm install alasql -g), możesz po prostu użyć> alasql "SELECT ... INTO CSV (...) FROM XLS (...)"
agershun
2

W systemie Windows jest wbudowany dostawca danych Excel OLEDB; możesz użyć tego do „odpytania” arkusza Excela przez ADO.NET i zapisania wyników do pliku CSV. Wymagana jest niewielka ilość kodu, ale nie powinieneś niczego instalować na komputerze.

Tim Robinson
źródło
Niedoceniona odpowiedź. Dlaczego ktoś miałby instalować plik .DLL innej firmy, skoro system Windows ma wbudowaną funkcjonalność?
Geoff Griswald
2

Opierając się na tym, co zapewnił Jon of All Trades, następujące (~ n) usunęły nieznośny problem z podwójnym rozszerzeniem: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

Charles Crous
źródło
1

Wypróbowałem rozwiązanie ScottF VB i uruchomiłem je. Jednak chciałem przekonwertować plik Excel z wieloma kartami (skoroszyt) do pojedynczego pliku .csv.

To nie zadziałało, tylko jedna karta (ta, która jest podświetlona, ​​gdy otwieram ją w programie Excel) została skopiowana.

Czy ktoś jest świadomy istnienia skryptu, który może przekonwertować plik Excel z wieloma kartami na pojedynczy plik .csv?

user1132593
źródło
0

Odpowiedź Scotta F. jest najlepsza, jaką znalazłem w Internecie. Dodałem do jego kodu, aby spełnić moje potrzeby. Dodałem:

Przy błędzie Wznów Dalej <- Aby uwzględnić brakujące pliki xls w moim przetwarzaniu wsadowym u góry. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Przed wierszem SaveAs, aby upewnić się, że moje dane są zapisane w formacie tekstowym, aby program Excel nie usuwał wiodących zer i przecinków w ciągach liczbowych w moich danych tj. (1200 do 1200). Zakres kolumn powinien być dostosowany do twoich potrzeb (A: J).

Usunąłem również Echo „gotowe”, aby nie było interaktywne.

Następnie dodałem skrypt do pliku wsadowego cmd w celu przetwarzania zautomatyzowanych danych co godzinę za pośrednictwem zadania.

Jeffrey O
źródło
2
Myślę, że powinieneś rozważyć opublikowanie ostatecznej wersji kodu z komentarzami.
domyślny język
0

Wszystkie te odpowiedzi pomogły mi skonstruować następujący skrypt, który automatycznie konwertuje pliki XLS * na CSV i odwrotnie , upuszczając jeden lub więcej plików w skrypcie (lub za pomocą wiersza poleceń). Przepraszamy za nieprzyjemne formatowanie.

' /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
źródło
0

:: Dla UTF-8 działa dla Microsoft Office 2016 i nowszych!

Wypróbuj ten kod:

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
źródło
0

Utwórz na pulpicie plik TXT o nazwie „xls2csv.vbs” i wklej kod:

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

Przeciągnij do niego plik XLS (np. „Test.xls”). Utworzy przekonwertowany plik CSV o nazwie „test.xls.csv”. Następnie zmień jego nazwę na „test.csv”. Gotowe.

Arvy
źródło