Converter o XLS para CSV na linha de comandos

Como poderia converter um ficheiro XLS para um ficheiro CSV na linha de comandos do windows.

A máquina tem o Microsoft Office 2000 instalado. Estou aberto a instalar o OpenOffice se não for possível usar o Microsoft Office.

Author: Joel, 2009-12-07

13 answers

Abrir o bloco de notas, criar um ficheiro chamado XlsToCsv.VBS e cole isto em:

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"

Depois, a partir de uma linha de comando, vá para a pasta que você salvou .o ficheiro vbs entra e corre:

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

Isto requer que o Excel seja instalado na máquina em que você está.

 101
Author: ScottF, 2017-02-08 22:14:47

Uma versão ligeiramente modificada da resposta ScottF, que não necessita de caminhos absolutos de ficheiros:

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

Eu renomeei o script ExcelToCsv, uma vez que este script não está limitado a xls em tudo. o xlsx funciona muito bem, como seria de esperar.

Testado no Office 2010.

 64
Author: plang, 2012-05-31 14:25:40

Uma pequena expansão no script groovy VB da ScottF: este ficheiro em lote irá circular através do .arquivos xlsx em um diretório e despejá-los em *.ficheiros csv:

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

Nota: Pode alterar a extensão .xlsx to .xls nome do programa ExcelToCSV para XlsToCsv

 17
Author: Michael Freidgeim, 2016-06-24 01:21:35
Que tal com PowerShell?

O código deve ser parecido com este, mas não testado apesar de

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

Aqui está um post explicando como usá-lo

Como posso usar o Windows PowerShell para automatizar o Microsoft Excel?

 13
Author: YOU, 2009-12-07 08:57:13

Tive a necessidade de extrair vários cvs de diferentes folhas de trabalho, por isso aqui está uma versão modificada do Código plang que lhe permite especificar o nome da folha de trabalho.

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
 6
Author: Christian Lemer, 2013-05-10 23:30:02
Porque não escreves tu? Vejo pelo seu perfil que tem pelo menos alguma experiência em C#/. NET. Eu criaria uma aplicação Windows console e usaria um leitor Excel livre para ler em seus arquivos Excel. Eu usei O leitor de dados do Excel disponível no CodePlex sem qualquer problema (uma coisa boa: Este leitor não requer que o Excel seja instalado). Você pode ligar para a sua aplicação de console a partir da linha de comando. Se ficar preso aqui, tenho a certeza que o fará. ajudar.
 5
Author: Jay Riggs, 2009-12-07 06:38:41

Aqui está uma versão que irá lidar com vários ficheiros arrastados e largados do windows. Com base nas obras acima referidas, por

Christian Lemer
plang
ScottF

Abrir o bloco de notas, criar um ficheiro chamado XlsToCsv.VBS e cole isto em:

'* 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
 5
Author: Chris Rudd, 2016-04-22 23:51:17
Com base no que o Jon de todos os ofícios forneceu, o seguinte (~n) removeu a questão da extensão dupla chata: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"
 2
Author: Charles Crous, 2014-12-02 21:05:25

Podes fazê - lo com o utilitário Alacon-command-line para a base de dados Alasql. Funciona com o nodo.js, então você precisa instalar o nó .js e depois alasql Pacote.

Para converter o ficheiro Excel para CVS (ot TSV), poderá indicar:

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

Por omissão, o Alasql converte dados de "Sheet1", mas pode alterá-los com parâmetros:

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

O Alacon suporta outros tipos de conversões (CSV, TSV, TXT, XLSX, XLS) e Construções de linguagem SQL (ver utilizador Manual para exemplos).

 2
Author: agershun, 2014-12-21 16:24:55

Existe um fornecedor de dados do Excel OLEDB incorporado no Windows; você pode usar isto para' pesquisar ' a folha do Excel via ADO.NET e escreve os resultados num ficheiro CSV. Há uma pequena quantidade de codificação necessária, mas você não deve precisar instalar nada na máquina.

 1
Author: Tim Robinson, 2009-12-07 08:02:03
Tentei a solução VB do ScottF e pus a funcionar. No entanto, eu queria converter um arquivo Multi-tab(workbook) excel em um único .ficheiro csv.

Isto não funcionou, apenas uma página(a que está realçada quando a abro através do excel) foi copiada.

É qualquer um ciente de um script que pode converter um arquivo Multi-tab excel em um único .ficheiro csv?

 1
Author: user1132593, 2012-03-16 13:49:09
A resposta do Scott F é a melhor que encontrei na internet. Acrescentei ao código dele para satisfazer as minhas necessidades. Eu acrescentei:

Em caso de erro, prosseguir oBook.Aplicacao.Colunas ("A:J").Number format = "@" Também removi o Eco "feito" para torná-lo não interactivo.

Adicionei então o script num ficheiro cmd em lote para o tratamento de dados automatizados numa base horária através de uma tarefa.

 0
Author: Jeffrey O, 2012-11-03 06:45:01

Todas estas respostas ajudaram-me a construir o seguinte programa que irá converter automaticamente os ficheiros XLS* para CSV e vice-versa, largando um ou mais ficheiros no programa (ou através da linha de comandos). Peço desculpa pela formatação janky.

' https://stackoverflow.com/questions/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
Author: drzaus, 2018-08-10 17:29:35