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.

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.


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.


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


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?


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

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

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.


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


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.


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"


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?


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.


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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.