Converti XLS in CSV sulla riga di comando


104

Come posso convertire un file XLS in un file CSV sulla riga di comando di Windows.

Sulla macchina è installato Microsoft Office 2000. Sono disponibile all'installazione di OpenOffice se non è possibile utilizzare Microsoft Office.

Risposte:


125

Apri Blocco note, crea un file chiamato XlsToCsv.vbs e incollalo 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"

Quindi da una riga di comando, vai alla cartella in cui hai salvato il file .vbs ed esegui:

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

Tuttavia, ciò richiede che Excel sia installato sulla macchina in cui ti trovi.


20
Nel caso qualcuno se lo stesse chiedendo, il parametro 6 nella funzione oBook.SaveAs è la costante per il formato CSV.
ScottF

Funziona perfettamente, e non solo per i file xls, ma anche per xlsx. Come detto da Andrew, i percorsi dei file devono essere assoluti o nella directory "data" dell'utente (non sono sicuro di quale sia il nome esatto in inglese). Non ho ancora capito come risolverlo, non sto facendo molto vbscript! :)
plang

3
Ho postato di seguito una versione leggermente modificata che gestisce meglio i percorsi dei file. Grazie ScottF!
Plang

7
Il codice converte solo il foglio di lavoro attivo. Per selezionare un altro foglio di lavoro, aggiungi la seguente riga dopo la oExcel.Workbooks.Openriga con l'indice desiderato del foglio di lavoro (inizia da 1): oBook.Worksheets(1).Activate
humbads

1
Va notato che questo funziona non solo su xls o xlsx, ma su qualsiasi file che Excel stesso può aprire.
user1318135

81

Una versione leggermente modificata della risposta ScottF, che non richiede percorsi di file assoluti:

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

Ho rinominato lo script ExcelToCsv, poiché questo script non è limitato a xls. xlsx Funziona perfettamente, come potremmo aspettarci.

Testato con Office 2010.


Sto usando questo (con pochi adattamenti) per convertire da XML a XLS. Tuttavia, non voglio avere la finestra di messaggio di avviso di compatibilità da Excel durante questa conversione. Sai come posso disabilitare questo avviso?
jpnavarini

C'è un modo per salvare questo file come set di caratteri Unicode?
rjv

2
Ho messo questa risposta insieme alla risposta di @ user565869 in un Gist con semplici istruzioni. Vedi: Script per convertire file Excel in CSV
10GritSandpaper

1
È bello mettere insieme @ 10GritSandpaper
amrrs

C'è un modo per usare; come delimitatore invece di,? Ho provato a modificare oBook.SaveAs dest_file, csv_format, Local: = True ma ottengo un errore che indica che un'istruzione è prevista dopo: Quando ho aggiunto, "Local: = True" non ci sono più errori ma ancora viene utilizzato il, invece di; come delimitatore. Forse uno di voi mi può aiutare.
suckerp

27

Una piccola espansione sul fantastico script VB di ScottF: questo file batch eseguirà il ciclo dei file .xlsx in una directory e li scaricherà in file * .csv:

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

Nota: è possibile modificare l'estensione .xlsx in .xls e il nome dello script ExcelToCSV in XlsToCsv


1
@Rieaux: Per quanto riguarda il tuo commento come una modifica: se questo dà ai file una doppia estensione, un secondo semplice file batch può rinominarli. Questo però sta scivolando in una nuova domanda; per favore provalo e, se non riesci a farlo funzionare, pubblica una nuova domanda qui su SU.

questa automazione mi ha salvato la vita. :) Grazie
Pushker Yadav

1
Ho messo questa risposta insieme alla risposta di @plang in un Gist con semplici istruzioni. Vedi: Script per convertire file Excel in CSV
10GritSandpaper

@ 10GritSandpaper Using Excel 2007. Lo script nel tuo link non ha funzionato per me.
Boris_yo

È possibile modificare "%% i.csv" in "%% ~ ni.csv" per rimuovere l'estensione ".xls" nei file csv.
Shaohua Li

18

Che ne dici di PowerShell?

Il codice dovrebbe essere simile a questo, ma non testato

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

Ecco un post che spiega come usarlo

Come posso utilizzare Windows PowerShell per automatizzare Microsoft Excel?


Sembra un buon approccio. Sfortunatamente, non sono riuscito a farlo funzionare. Non ho familiarità con PowerShell, quindi quando ho riscontrato un errore non sapevo cosa fare. Non sono riuscito a trovare una soluzione specifica per PowerShell: support.microsoft.com/kb/320369
Joel

Ecco alcuni suggerimenti per PowerShell ed Excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
YOU

Ho fatto un test di questo e ho anche riscontrato problemi. Una cosa in cui mi sono imbattuto è stata la difficoltà con il $Excel.Workbooks.Openmetodo. Non è stato possibile trovare il file specificato. Ho aggirato questo problema utilizzando Get-Itemsul file e collegandolo a un ForEach-Objectciclo (qualcosa che finirò comunque per fare nella mia implementazione finale) per le due righe che iniziano con $Workbook.
Iszi

Questo ha risolto il problema, ma non sono riuscito a trovare il "YOURDOC.csv" risultante - non era nella stessa cartella di "YOUDOC.XLS". Sono tornato al vecchio e fidato CMD e l'ho fatto CD /D C:\ && DIR YOURDOC.csv /s. Risulta che il file è stato salvato in I miei documenti per impostazione predefinita. Quindi, è necessario inserirne di più nello script se si desidera salvare il file nella stessa cartella in cui si sta lavorando (se diversa da Documenti).
Iszi

8

Avevo bisogno di estrarre diversi CV da diversi fogli di lavoro, quindi ecco una versione modificata del codice plang che ti consente di specificare il nome del foglio di lavoro.

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

Ecco una versione che gestirà più file trascinati e rilasciati da Windows. Sulla base dei lavori di cui sopra di

Christian Lemer
plang
ScottF

Apri Blocco note, crea un file chiamato XlsToCsv.vbs e incollalo 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

1
C'è un modo per eseguire la codifica UTF-8?
StuBob,

Come saltare la scrittura dell'intestazione nel file CSV di destinazione. Non capisco assolutamente lo script precedente, ma lo sto usando nella mia automazione. Grazie.
TharunRaja,

@TharunRaja Lo script apre il file in excel, quindi fa un "salva con nome" in CSV, proprio come se lo avessi fatto a mano tranne che lo nasconde in background. Poiché lo script stesso non sta eseguendo la conversione e lo stai automatizzando, il mio suggerimento sarebbe di chiamare un secondo script sui file csv che questo output, inviami un messaggio se hai bisogno di aiuto per crearne uno che rimuova la prima riga di un file lo passi.
Chris Rudd

Io stesso avevo bisogno di una versione più potente in PowerShell in grado di elaborare correttamente le date, in grado di gestire intestazioni che non sono sulla prima riga e poche altre cose (in realtà analizza le singole celle piuttosto che fidarsi di Excel). Se le persone ne esprimono la necessità, lo posterò, ma poiché questo è essenzialmente risolto e cambieremo le lingue, non voglio pubblicare duplicati.
Chris Rudd

5

Perché non scrivere il tuo?

Vedo dal tuo profilo che hai almeno un po 'di esperienza con C # /. NET. Creerei un'applicazione per console Windows e utilizzerei un lettore Excel gratuito per leggere i tuoi file Excel. Ho usato Excel Data Reader disponibile da CodePlex senza alcun problema (una cosa bella: questo lettore non richiede l'installazione di Excel). È possibile chiamare l'applicazione della console dalla riga di comando.

Se ti trovi bloccato, posta qui e sono sicuro che riceverai aiuto.


In realtà, non ho mai scritto alcun C # mai. Ma penso che ci proverò con Excel Data Reader.
Joel

3
Un po 'eccessivo, non credi. Profuma di NIH.
Mr. Boy

1
Non credo che Excel Data Reader sia NIH. Prima di tutto l'ha scritto qualcun altro. In secondo luogo, ha risolto il problema meglio di Excel in piena regola.
Justin Dearing

4

Puoi farlo con Alacon - utilità della riga di comando per il database Alasql . Funziona con Node.js, quindi è necessario installare Node.js e quindi il pacchetto Alasql .

Per convertire un file Excel in CVS (o TSV) puoi inserire:

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

Per impostazione predefinita Alasql converte i dati da "Sheet1", ma puoi modificarli con i parametri:

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

Alacon supporta altri tipi di conversioni (CSV, TSV, TXT, XLSX, XLS) e costruzioni in linguaggio SQL (vedere il manuale utente per esempi).


1
Wow! Alasql è davvero potente.
Lukasz Wiktor il

Se installi AlaSQL a livello globale (npm installa alasql -g), puoi usare semplicemente> alasql "SELECT ... INTO CSV (...) FROM XLS (...)"
agershun

2

C'è un provider di dati OLEDB di Excel integrato in Windows; puoi usarlo per "interrogare" il foglio Excel tramite ADO.NET e scrivere i risultati in un file CSV. È richiesta una piccola quantità di codice, ma non dovrebbe essere necessario installare nulla sulla macchina.


Risposta sottovalutata. Perché qualcuno dovrebbe installare un file .DLL di terze parti quando Windows ha la funzionalità integrata?
Geoff Griswald

2

Basandosi su ciò che ha fornito Jon of All Trades, quanto segue (~ n) ha rimosso il fastidioso problema della doppia estensione: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"


1

Ho provato la soluzione ScottF VB e l'ho fatta funzionare. Tuttavia, volevo convertire un file Excel multi-scheda (cartella di lavoro) in un singolo file .csv.

Questo non ha funzionato, è stata copiata solo una scheda (quella che viene evidenziata quando lo apro tramite Excel).

Qualcuno è a conoscenza di uno script in grado di convertire un file Excel multi-scheda in un singolo file .csv?


0

La risposta di Scott F è la migliore che ho trovato su Internet. Ho aggiunto il suo codice per soddisfare le mie esigenze. Ho aggiunto:

In caso di errore, riprendi dopo <- Per tenere conto di un file xls mancante nella mia elaborazione batch in alto. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Prima della riga SaveAs per assicurarmi che i miei dati vengano salvati formattati come testo per impedire a Excel di eliminare gli zeri iniziali e di eliminare le virgole nelle stringhe di numeri nei miei dati vale a dire (da 1.200 a 1200). L'intervallo di colonne dovrebbe essere regolato per soddisfare le tue esigenze (A: J).

Ho anche rimosso l'Echo "fatto" per renderlo non interattivo.

Ho quindi aggiunto lo script in un file batch cmd per l'elaborazione dei dati automatizzati su base oraria tramite un'attività.


2
Penso che dovresti considerare di pubblicare la versione finale del codice con i commenti.
locale predefinito

0

Tutte queste risposte mi hanno aiutato a costruire il seguente script che convertirà automaticamente i file XLS * in CSV e viceversa , rilasciando uno o più file sullo script (o tramite riga di comando). Mi scuso per la formattazione 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

0

:: Per UTF-8 funziona per Microsoft Office 2016 e versioni successive!

Prova questo codice:

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

Crea un file TXT sul desktop denominato "xls2csv.vbs" e incolla il codice:

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

Trascina un file XLS su di esso (come "test.xls"). Creerà un file CSV convertito denominato "test.xls.csv". Quindi rinominalo in "test.csv". Fatto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.