XLS'yi komut satırında CSV'ye dönüştürün


104

Bir XLS dosyasını Windows komut satırında bir CSV dosyasına nasıl dönüştürebilirim.

Makinede Microsoft Office 2000 yüklüdür. Microsoft Office kullanarak mümkün değilse OpenOffice'i kurmaya açığım.

Yanıtlar:


125

Not Defteri'ni açın, XlsToCsv.vbs adlı bir dosya oluşturun ve şunu yapıştırın:

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"

Ardından bir komut satırından .vbs dosyasını kaydettiğiniz klasöre gidin ve çalıştırın:

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

Bu, Excel'in kullandığınız makineye yüklenmesini gerektirir.


20
Herhangi birinin merak etmesi durumunda, oBook.SaveAs işlevindeki 6 parametresi, CSV formatı için sabittir.
ScottF

Sadece xls dosyaları için değil, aynı zamanda xlsx için de gayet iyi çalışıyor. Andrew'un söylediği gibi, dosya yolları ya mutlak olmalı ya da kullanıcı "veri" dizininde olmalıdır (İngilizce'de tam adın ne olduğundan emin değilim). Hala bunu nasıl çözeceğimi bulamadım, çok fazla vbscript yapmıyorum! :)
plang

3
Dosya yollarını daha iyi işleyen biraz değiştirilmiş bir sürümün altında yayınladım. Teşekkürler ScottF!
plang

7
Kod, yalnızca etkin çalışma sayfasını dönüştürür. Başka bir çalışma sayfası seçmek için, çalışma sayfasının oExcel.Workbooks.Openistenen diziniyle satırdan sonra aşağıdaki satırı ekleyin (1'den başlar):oBook.Worksheets(1).Activate
humbads

1
Bu işlevselliğin sadece xls veya xlsx'te değil, Excel'in kendisinin açabileceği herhangi bir dosyada da çalıştığına dikkat edilmelidir.
user1318135

81

Mutlak dosya yolları gerektirmeyen, biraz değiştirilmiş bir ScottF cevabı sürümü:

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

ExcelToCsv komut dosyasını yeniden adlandırdım çünkü bu komut dosyası xls ile sınırlı değil. xlsx beklediğimiz gibi gayet iyi çalışıyor.

Office 2010 ile test edilmiştir.


Bunu (birkaç uyarlamayla) XML'den XLS'ye dönüştürmek için kullanıyorum. Ancak, bu dönüştürme sırasında Excel'den uyumluluk uyarı mesajı kutusunu almak istemiyorum. Bu uyarıyı nasıl devre dışı bırakabileceğimi biliyor musunuz?
jpnavarini

Bu dosyayı Unicode karakter kümesi olarak kaydetmenin bir yolu var mı?
rjv

2
Bu yanıtı @ user565869'un cevabı ile basit talimatlarla bir Özet içinde bir araya getirdim. Bkz: Excel Dosyasını CSV'ye dönüştürmek için komut dosyası
10GritSandpaper

1
Bu güzel bir araya geldi @ 10GritSandpaper
amrrs

Kullanmanın bir yolu var mı; yerine sınırlayıcı olarak? OBook.SaveAs dest_file, csv_format, Local: = True değiştirmeyi denedim, ancak şundan sonra bir ifadenin beklendiğine dair bir hata alıyorum: "Local: = True" ekledim, artık hata yok ama yine de yerine, kullanılıyor; sınırlayıcı olarak. Belki biriniz bana yardım edebilirsiniz.
suckerp

27

ScottF'nin harika VB komut dosyasında küçük bir genişletme: Bu toplu iş dosyası, bir dizindeki .xlsx dosyaları arasında döngü oluşturacak ve bunları * .csv dosyalarına dökecektir:

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

Not: .xlsx uzantısını .xls ve ExcelToCSV komut dosyasının adını XlsToCsv olarak değiştirebilirsiniz.


1
@Rieaux: Düzenleme olarak yorumunuzla ilgili olarak: Bu, dosyalara çift uzantı verirse, ikinci bir basit toplu iş dosyası onları yeniden adlandırabilir. Yine de bu yeni bir soruya doğru sürükleniyor; lütfen deneyin ve işe yaramazsa, SU'ya buraya yeni bir soru gönderin.

bu otomasyon hayatımı kurtardı. :) Teşekkür ederim
Pushker Yadav

1
Bu yanıtı @plang'ın cevabı ile basit talimatlarla bir Özet içinde bir araya getirdim. Bakınız: Excel Dosyasını CSV'ye dönüştürmek için komut dosyası
10GritSandpaper

@ 10GritSandpaper Excel 2007 Kullanılıyor. Bağlantınızdaki komut dosyası benim için çalışmadı.
Boris_yo

Csv dosyalarındaki ".xls" dosya uzantısını kaldırmak için "%% i.csv" yi "%% ~ ni.csv" olarak değiştirebilirsiniz.
Shaohua Li

18

PowerShell'e ne dersiniz?

Kod böyle görünmeli, yine de test edilmemeli

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

İşte nasıl kullanılacağını açıklayan bir gönderi

Microsoft Excel'i Otomatikleştirmek için Windows PowerShell'i Nasıl Kullanabilirim?


Bu iyi bir yaklaşım gibi görünüyor. Ne yazık ki devam ettiremedim. PowerShell'e aşina değilim, bu yüzden bir hatayla karşılaştığımda ne yapacağımı bilmiyordum. PowerShell'e özel bir çözüm bulamadım: support.microsoft.com/kb/320369
Joel


Bunun bir testini yaptım ve sorunlarla da karşılaştım. Karşılaştığım bir şey, $Excel.Workbooks.Openyöntemle ilgili zorluktu . Belirtilen dosyayı bulamadı. Get-ItemDosyayı kullanarak ve onu bir ForEach-Objectdöngüye bağlayarak (yine de son uygulamamda yapacağım bir şey) ile başlayan iki satır için bu sorunu çözdüm $Workbook.
Iszi

Bu sorunu çözdü, ancak sonuçta ortaya çıkan "YOURDOC.csv" dosyasını bulamadım - "YOUDOC.XLS" ile aynı klasörde değildi. Eski ve güvenilir CMD'ye geri döndüm ve yaptım CD /D C:\ && DIR YOURDOC.csv /s. Dosyanın varsayılan olarak Belgelerim'e kaydedildiği ortaya çıkar. Bu nedenle, dosyayı çalıştığınız aynı klasöre (Belgelerim dışında) kaydetmek istiyorsanız komut dosyasına daha fazlasını eklemeniz gerekir.
Iszi

8

Farklı çalışma sayfalarından birkaç cv çıkarmaya ihtiyacım vardı, işte çalışma sayfası adını belirlemenize izin veren plang kodunun değiştirilmiş bir sürümü.

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

Burada, birden çok dosyayı pencerelerden sürükleyip bırakarak işleyecek bir sürüm. Yukarıdaki çalışmalara göre

Christian Lemer
plang
ScottF

Not Defteri'ni açın, XlsToCsv.vbs adlı bir dosya oluşturun ve şunu yapıştırın:

'* 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
UTF-8 Kodlaması yapmanın bir yolu var mı?
StuBob

Hedef csv dosyasında başlık yazımı nasıl atlanır. Yukarıdaki betiği kesinlikle anlamıyorum ama otomasyonumda kullanıyorum. Teşekkür ederim.
TharunRaja

@TharunRaja Komut dosyası, dosyayı excel'de açar, sonra CSV'ye "farklı kaydet" yapar, tıpkı elle yaptığınız gibi, arka planda gizlemesi dışında. Komut dosyasının kendisi dönüşümü yapmadığı ve siz onu otomatikleştirdiğiniz için, benim önerim bu çıktıların csv dosyalarında ikinci bir komut dosyası çağırmak, bir komut dosyasının ilk satırını çıkaran bir komut dosyası oluşturmak için yardıma ihtiyacınız olursa dosya geçtin.
Chris Rudd

Kendi kendime powershell'de tarihleri ​​doğru bir şekilde işleyebilen, ilk satırda olmayan başlıkları ve birkaç başka şeyi işleyebilen daha güçlü bir versiyona ihtiyacım vardı (aslında excel'e güvenmek yerine tek tek hücreleri ayrıştırıyor). İnsanlar buna bir ihtiyaç duyarlarsa, onu gönderirim, ancak bu esas olarak yanıtlandığından ve dilleri değiştireceğimizden, kopyaları göndermek istemiyorum.
Chris Rudd

5

Neden kendiniz yazmıyorsunuz?

Profilinizden en azından biraz C # /. NET deneyiminiz olduğunu görüyorum. Bir Windows konsolu uygulaması oluşturur ve Excel dosyalarınızı okumak için ücretsiz bir Excel okuyucu kullanırdım. Ben kullandım Excel Veri Okuyucu (: Excel gerektirmez bu okuyucu yüklü olması bir güzel bir şey) sorunsuz CodePlex edinilebilir. Konsol uygulamanızı komut satırından çağırabilirsiniz.

Kendinizi burada sıkışıp kalmış bulursanız ve eminim yardım alırsınız.


Aslında, hiç C # yazmadım. Ama sanırım Excel Veri Okuyucusu ile buna bir göz atacağım.
Joel

3
Biraz abartılı değil mi? NIH kokuyor.
Bay Boy

1
Excel Veri Okuyucusunun NIH olduğunu düşünmüyorum. Her şeyden önce başka biri yazdı. İkincisi, sorunu tam gelişmiş Excel'den daha iyi çözdü.
Justin Dearing

4

Alacon - Alasql veritabanı için komut satırı yardımcı programı ile yapabilirsiniz . Node.js ile çalışır, bu nedenle Node.js ve ardından Alasql paketini kurmanız gerekir .

Excel dosyasını CVS'ye (ot TSV) dönüştürmek için şunu girebilirsiniz:

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

Alasql varsayılan olarak "Sayfa1" deki verileri dönüştürür, ancak bunu parametrelerle değiştirebilirsiniz:

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

Alacon, diğer dönüştürme türlerini (CSV, TSV, TXT, XLSX, XLS) ve SQL dil yapılarını destekler ( örnekler için bkz. Kullanım Kılavuzu ).


1
Vaov! Alasql gerçekten güçlüdür.
Lukasz Wiktor

AlaSQL'i global olarak kurarsanız (npm, alasql -g'yi kurun), o zaman basitçe> alasql "SELECT ... INTO CSV (...)
XLS'den

2

Windows'ta yerleşik bir Excel OLEDB veri sağlayıcısı vardır; Excel sayfasını ADO.NET aracılığıyla 'sorgulamak' ve sonuçları bir CSV dosyasına yazmak için bunu kullanabilirsiniz. Az miktarda kodlama gerekir, ancak makineye herhangi bir şey yüklemenize gerek yoktur.


Yetersiz cevap. Windows yerleşik işlevlere sahipken neden birisi üçüncü taraf bir .DLL dosyası yüklesin?
Geoff Griswald

2

Jon of All Trades'in sağladığı bilgilere dayanarak, aşağıdaki (~ n) sinir bozucu çift uzantı sorununu ortadan kaldırdı: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"


1

ScottF VB çözümünü denedim ve çalışmasını sağladım. Ancak, çoklu sekme (çalışma kitabı) excel dosyasını tek bir .csv dosyasına dönüştürmek istedim.

Bu işe yaramadı, sadece bir sekme (excel ile açtığımda vurgulanan) kopyalandı.

Çok sekmeli bir excel dosyasını tek bir .csv dosyasına dönüştürebilen bir komut dosyasının farkında olan var mı?


0

Scott F'nin cevabı internette bulduğum en iyisi. İhtiyaçlarımı karşılamak için kodunu ekledim. Ekledim:

Hatada Devam Ettirildiğinde <- En üstteki toplu işlemimdeki eksik xls dosyalarını hesaba katmak için. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- sıfırları silmesini ve verilerimdeki sayı dizelerindeki virgülleri ortadan kaldırmasını önlemek için verilerimin metin olarak biçimlendirilmiş olarak kaydedildiğinden emin olmak için SaveAs satırından önce yani (1.200 - 1200). Sütun aralığı ihtiyaçlarınızı karşılayacak şekilde ayarlanmalıdır (A: J).

Ayrıca etkileşimli olmaması için "tamamlandı" yankısını da kaldırdım.

Daha sonra, otomatik verileri bir görev aracılığıyla saatlik olarak işlemek için komut dosyasını bir cmd toplu iş dosyasına ekledim.


2
Kodun son sürümünü yorumlarla birlikte göndermeyi düşünmeniz gerektiğini düşünüyorum.
varsayılan yerel ayar

0

Tüm bu yanıtlar, komut dosyasına bir veya daha fazla dosya bırakarak (veya komut satırı aracılığıyla) XLS * dosyalarını otomatik olarak CSV'ye veya tam tersini yapacak olan aşağıdaki komut dosyasını oluşturmama yardımcı oldu . Kötü biçimlendirme için özür dileriz.

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

:: UTF-8 için Microsoft Office 2016 ve üstü için çalışır!

Bu kodu deneyin:

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

Masaüstünüzde "xls2csv.vbs" adlı bir TXT dosyası oluşturun ve kodu yapıştırın:

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

Bir XLS dosyasını içine sürükleyin ("test.xls" gibi). "Test.xls.csv" adlı dönüştürülmüş bir CSV dosyası oluşturacaktır. Ardından "test.csv" olarak yeniden adlandırın. Bitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.