Ubah XLS ke CSV pada baris perintah

104

Bagaimana saya bisa mengonversi file XLS ke file CSV di baris perintah windows.

Mesin telah menginstal Microsoft Office 2000. Saya terbuka untuk menginstal OpenOffice jika tidak memungkinkan menggunakan Microsoft Office.

Joel
sumber

Jawaban:

125

Buka Notepad, buat file bernama XlsToCsv.vbs dan tempel ini di:

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"

Kemudian dari baris perintah, buka folder tempat Anda menyimpan file .vbs dan jalankan:

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

Ini membutuhkan Excel untuk diinstal pada mesin yang Anda gunakan.

ScottF
sumber
20
Jika ada yang bertanya-tanya, parameter 6 dalam fungsi oBook.SaveAs adalah konstanta untuk format CSV.
ScottF
Bekerja dengan baik, dan tidak hanya untuk file xls, tetapi juga xlsx. Seperti yang dikatakan oleh Andrew, jalur file harus absolut, atau dalam direktori "data" pengguna (Saya tidak yakin apa nama persisnya dalam bahasa Inggris). Saya masih belum menemukan cara mengatasinya, saya tidak melakukan banyak vbscript! :)
plang
3
Saya telah memposting di bawah ini versi yang sedikit dimodifikasi yang menangani jalur file dengan lebih baik. Terima kasih ScottF!
plang
7
Kode hanya mengubah lembar kerja aktif. Untuk memilih lembar kerja lain, tambahkan baris berikut setelah oExcel.Workbooks.Openbaris dengan indeks lembar kerja yang diinginkan (dimulai pada 1): oBook.Worksheets(1).Activate
humbads
1
Perlu dicatat bahwa ini berfungsi tidak hanya pada xls atau xlsx, tetapi pada file apa pun yang dapat dibuka oleh Excel sendiri.
pengguna1318135
81

Versi jawaban ScottF yang sedikit dimodifikasi, yang tidak memerlukan jalur file absolut:

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

Saya telah mengganti nama skrip ExcelToCsv, karena skrip ini tidak terbatas pada xls sama sekali. xlsx Bekerja dengan baik, seperti yang kita harapkan.

Diuji dengan Office 2010.

plang
sumber
Saya menggunakan ini (dengan sedikit adaptasi) untuk mengubah dari XML ke XLS. Namun, saya tidak ingin memiliki kotak pesan peringatan kompatibilitas dari Excel selama konversi ini. Tahukah Anda bagaimana cara menonaktifkan peringatan ini?
jpnavarini
Apakah ada cara untuk menyimpan file ini sebagai kumpulan karakter Unicode?
rjv
2
Saya menggabungkan jawaban ini dengan jawaban @ user565869 dalam Intisari dengan instruksi sederhana. Lihat: Script untuk mengonversi File Excel ke CSV
10GritSandpaper
1
Itu bagus disatukan @ 10GritSandpaper
amrrs
Apakah ada cara untuk menggunakan; sebagai pembatas, bukan,? Saya mencoba mengubah oBook.SaveAs dest_file, csv_format, Lokal: = Benar tetapi saya mendapatkan kesalahan bahwa pernyataan diharapkan setelah: Ketika saya menambahkan, "Lokal: = Benar" tidak ada lagi kesalahan tetapi masih, digunakan sebagai pengganti; sebagai pembatas. Mungkin salah satu dari Anda bisa membantu saya.
Suckerp
27

Ekspansi kecil pada skrip VB keren ScottF: file batch ini akan mengulang melalui file .xlsx dalam direktori dan membuangnya ke file * .csv:

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

Catatan: Anda dapat mengubah ekstensi .xlsx menjadi .xls dan nama skrip ExcelToCSV menjadi XlsToCsv

Michael Freidgeim
sumber
1
@Rieaux: Mengenai comment-as-an-edit: jika ini memberi file ekstensi ganda, file batch sederhana kedua dapat mengganti namanya. Namun, ini beralih ke pertanyaan baru; silakan mencobanya dan, jika Anda tidak dapat membuatnya bekerja, kirim pertanyaan baru di sini di SU.
otomatisasi ini menyelamatkan hidup saya. :) Terima kasih
Pushker Yadav
1
Saya menyatukan jawaban ini dengan jawaban @plang dalam Intisari dengan instruksi sederhana. Lihat: Script untuk mengonversi File Excel ke CSV
10GritSandpaper
@ 10GritSandpaper Menggunakan Excel 2007. Skrip di tautan Anda tidak berfungsi untuk saya.
Boris_yo
Anda dapat mengubah "%% i.csv" menjadi "%% ~ ni.csv" untuk menghapus ekstensi file ".xls" di file csv.
Shaohua Li
18

Bagaimana dengan PowerShell?

Kode harus terlihat seperti ini, meskipun tidak diuji

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

Berikut adalah postingan yang menjelaskan cara menggunakannya

Bagaimana Saya Dapat Menggunakan Windows PowerShell untuk Mengotomatiskan Microsoft Excel?

KAMU
sumber
Ini sepertinya pendekatan yang bagus. Sayangnya, saya tidak bisa mewujudkannya. Saya tidak terbiasa dengan PowerShell, jadi ketika saya mengalami kesalahan, saya tidak tahu apa yang harus dilakukan. Saya tidak dapat menemukan solusi khusus PowerShell: support.microsoft.com/kb/320369
Joel
Berikut adalah beberapa tip untuk PowerShell dan Excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
ANDA
Saya melakukan uji coba ini dan mengalami masalah juga. Satu hal yang saya hadapi adalah kesulitan dengan $Excel.Workbooks.Openmetode ini. Itu tidak dapat menemukan file yang ditentukan. Saya bekerja di sekitar ini dengan menggunakan Get-Itempada file dan menyalurkannya ke ForEach-Objectloop (sesuatu yang pada akhirnya akan saya lakukan dalam implementasi terakhir saya) untuk dua baris yang dimulai dengan $Workbook.
Iszi
Itu memperbaiki masalah itu, tetapi kemudian saya tidak dapat menemukan "YOURDOC.csv" yang dihasilkan - itu tidak ada di folder yang sama dengan "YOUDOC.XLS". Saya kembali ke CMD lama & tepercaya dan melakukannya CD /D C:\ && DIR YOURDOC.csv /s. Ternyata file tersebut disimpan ke My Documents secara default. Jadi, Anda perlu memasukkan lebih banyak ke dalam skrip jika Anda ingin menyimpan file ke folder yang sama dengan tempat Anda bekerja (jika selain My Documents).
Iszi
8

Saya perlu mengekstrak beberapa cv dari lembar kerja yang berbeda, jadi berikut ini adalah versi modifikasi dari kode plang yang memungkinkan Anda menentukan nama lembar kerja.

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
sumber
8

Ini adalah versi yang akan menangani banyak file yang diseret dan dilepaskan dari windows. Berdasarkan karya di atas oleh

Christian Lemer
plang
ScottF

Buka Notepad, buat file bernama XlsToCsv.vbs dan tempel ini di:

'* 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
sumber
1
Apakah ada cara untuk melakukan Pengkodean UTF-8?
StuBob
Cara melewatkan penulisan header di file csv target. Saya benar-benar tidak memahami skrip di atas, tetapi saya menggunakannya dalam otomatisasi saya. Terima kasih.
TharunRaja
@TharunRaja Skrip membuka file di excel, lalu melakukan "save as" ke CSV, sama seperti jika Anda melakukannya dengan tangan kecuali menyembunyikannya di latar belakang. Karena skrip itu sendiri tidak melakukan konversi, dan Anda mengotomatiskannya, saran saya adalah memanggil skrip kedua pada file csv output ini, kirimi saya pesan jika Anda perlu bantuan membuat yang menghapus baris pertama dari a mengajukan Anda lulus itu.
Chris Rudd
Saya sendiri membutuhkan versi yang lebih kuat di PowerShell yang dapat memproses tanggal dengan benar, dapat menangani header yang tidak ada di baris pertama, dan beberapa hal lainnya (ini sebenarnya mem-parsing sel individu daripada mempercayai excel). Jika orang-orang menyatakan kebutuhannya, saya akan mempostingnya tetapi karena ini pada dasarnya dijawab dan kami akan mengubah bahasa, saya tidak ingin memposting duplikat.
Chris Rudd
5

Mengapa tidak menulis sendiri?

Saya melihat dari profil Anda, Anda memiliki setidaknya beberapa pengalaman C # /. NET. Saya akan membuat aplikasi konsol Windows dan menggunakan pembaca Excel gratis untuk membaca file Excel Anda. Saya telah menggunakan Excel Data Reader yang tersedia dari CodePlex tanpa masalah (satu hal yang menyenangkan: pembaca ini tidak memerlukan Excel untuk diinstal). Anda dapat memanggil aplikasi konsol Anda dari baris perintah.

Jika Anda menemukan diri Anda terjebak posting di sini dan saya yakin Anda akan mendapatkan bantuan.

Jay Riggs
sumber
Sebenarnya, saya tidak pernah menulis C #. Tapi saya pikir saya akan mencobanya dengan Pembaca Data Excel.
Yoel
3
Sedikit berlebihan, bukan begitu. Bau NIH.
Tn. Boy
1
Saya tidak berpikir Pembaca Data Excel adalah NIH. Pertama-tama orang lain yang menulisnya. Kedua, ini memecahkan masalah dengan lebih baik daripada Excel sepenuhnya.
Justin Dearing
4

Anda dapat melakukannya dengan Alacon - utilitas baris perintah untuk database Alasql . Ini berfungsi dengan Node.js, jadi Anda perlu menginstal Node.js dan kemudian paket Alasql .

Untuk mengonversi file Excel ke CVS (ot TSV) Anda dapat memasukkan:

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

Secara default, Alasql mengonversi data dari "Sheet1", tetapi Anda dapat mengubahnya dengan parameter:

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

Alacon mendukung jenis konversi lain (CSV, TSV, TXT, XLSX, XLS) dan konstruksi bahasa SQL (lihat Panduan Pengguna untuk mengetahui contoh).

agershun
sumber
1
Wow! Alasql sangat kuat.
Lukasz Wiktor
Jika Anda menginstal AlaSQL secara global (npm install alasql -g) maka Anda dapat menggunakan> alasql "SELECT ... INTO CSV (...) FROM XLS (...)"
agershun
2

Ada penyedia data OLEDB Excel yang terpasang di Windows; Anda dapat menggunakan ini untuk 'menanyakan' lembar Excel melalui ADO.NET dan menulis hasilnya ke file CSV. Ada sedikit pengkodean yang diperlukan, tetapi Anda tidak perlu menginstal apa pun di mesin.

Tim Robinson
sumber
Jawaban yang diremehkan. Mengapa ada orang yang menginstal file .DLL pihak ketiga ketika Windows memiliki fungsionalitas bawaan?
Geoff Griswald
2

Berdasarkan apa yang telah disediakan Jon of All Trades, berikut ini (~ n) menghilangkan masalah ekstensi ganda yang mengganggu: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

Charles Crous
sumber
1

Saya mencoba solusi ScottF VB dan membuatnya berfungsi. Namun saya ingin mengonversi file excel multi-tab (buku kerja) menjadi satu file .csv.

Ini tidak berhasil, hanya satu tab (yang disorot ketika saya membukanya melalui excel) disalin.

Apakah ada yang mengetahui skrip yang dapat mengonversi file excel multi-tab menjadi satu file .csv?

pengguna1132593
sumber
0

Jawaban Scott F adalah yang terbaik yang saya temukan di internet. Saya menambahkan pada kodenya untuk memenuhi kebutuhan saya. Saya tambahkan:

On Error Resume Next <- Untuk memperhitungkan file xls yang hilang dalam pemrosesan batch saya di bagian atas. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Sebelum baris SaveAs untuk memastikan data saya disimpan dalam format teks agar excel tidak menghapus awalan nol dan menghilangkan koma di string angka dalam data saya yaitu (1.200 hingga 1200). Kisaran kolom harus disesuaikan untuk memenuhi kebutuhan Anda (A: J).

Saya juga menghapus Echo "selesai" agar tidak interaktif.

Saya kemudian menambahkan skrip ke dalam file batch cmd untuk memproses data otomatis setiap jam melalui tugas.

Jeffrey O
sumber
2
Saya pikir Anda harus mempertimbangkan untuk memposting versi terakhir kode dengan komentar.
lokasi default
0

Semua jawaban ini membantu saya membuat skrip berikut yang secara otomatis akan mengonversi file XLS * ke CSV dan sebaliknya , dengan meletakkan satu atau lebih file pada skrip (atau melalui baris perintah). Maaf atas format janky.

' /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
sumber
0

:: Untuk UTF-8 bekerja untuk Microsoft Office 2016 dan lebih tinggi!

Coba kode ini:

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
sumber
0

Buat file TXT di desktop Anda dengan nama "xls2csv.vbs" dan tempel kode:

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

Seret file XLS ke sana (seperti "test.xls"). Ini akan membuat file CSV yang dikonversi bernama "test.xls.csv". Kemudian, ganti namanya menjadi "test.csv". Selesai.

Arvy
sumber