Converter XLS para CSV na linha de comando

104

Como posso converter um arquivo XLS em um arquivo CSV na linha de comando do Windows.

A máquina possui o Microsoft Office 2000 instalado. Estou aberto para instalar o OpenOffice se não for possível usando o Microsoft Office.

Joel
fonte

Respostas:

125

Abra o Bloco de notas, crie um arquivo chamado XlsToCsv.vbs e cole-o 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"

Em seguida, em uma linha de comando, vá para a pasta em que salvou o arquivo .vbs e execute:

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

Isso requer que o Excel esteja instalado na máquina em que você está.

ScottF
fonte
20
Caso alguém esteja se perguntando, o parâmetro 6 na função oBook.SaveAs é a constante para o formato CSV.
ScottF
Funciona muito bem, e não apenas para arquivos xls, mas também xlsx. Como disse Andrew, os caminhos dos arquivos devem ser absolutos ou estar no diretório "data" do usuário (não tenho certeza de qual é o nome exato em inglês). Ainda não descobri como resolver isso, não estou fazendo muito vbscript! :)
plang
3
Eu postei abaixo uma versão ligeiramente modificada que trata melhor os caminhos de arquivos. Obrigado ScottF!
plang
7
O código converte apenas a planilha ativa. Para selecionar outra planilha, adicione a seguinte linha após a oExcel.Workbooks.Openlinha com o índice desejado da planilha (começa em 1): oBook.Worksheets(1).Activate
humbads
1
Deve-se notar que isso funciona não apenas em xls ou xlsx, mas em qualquer arquivo que o próprio Excel possa abrir.
user1318135
81

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

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

Mudei o nome do script para ExcelToCsv, pois ele não se limita a xls. xlsx Funciona muito bem, como poderíamos esperar.

Testado com Office 2010.

plang
fonte
Estou usando isso (com algumas adaptações) para converter de XML em XLS. No entanto, não quero ver a caixa de mensagem de aviso de compatibilidade do Excel durante essa conversão. Você sabe como posso desativar este aviso?
jpnavarini
Existe alguma maneira de salvar este arquivo como conjunto de caracteres Unicode?
rjv
2
Eu coloquei esta resposta junto com a resposta de @ user565869 em um Síntese com instruções simples. Veja: Script para converter arquivo Excel para CSV
10GritSandpaper
1
Excelente montagem @ 10GritSandpaper
amrrs
Existe uma maneira de usar; como um delimitador em vez de,? Tentei alterar oBook.SaveAs dest_file, csv_format, Local: = True, mas recebo um erro informando que uma instrução é esperada após: Quando eu adicionei, "Local: = True" sem mais erros, mas ainda o, é usado em vez de; como delimitador. Talvez um de vocês possa me ajudar.
suckerp
27

Uma pequena expansão no elegante script VB da ScottF: este arquivo em lote fará um loop pelos arquivos .xlsx em um diretório e os despejará em arquivos * .csv:

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

Nota: Você pode alterar a extensão .xlsx para .xls e o nome do script ExcelToCSV para XlsToCsv

Michael Freidgeim
fonte
1
@Rieaux: Com relação ao seu comentário como uma edição: se isso dá aos arquivos uma extensão dupla, um segundo arquivo em lote simples pode renomeá-los. Porém, isso está se transformando em uma nova questão; por favor, experimente e, se você não conseguir fazer funcionar, poste uma nova pergunta aqui no SU.
esta automação salvou minha vida. :) Obrigado
Pushker Yadav
1
Eu coloquei esta resposta junto com a resposta de @plang em um Gist com instruções simples. Veja: Script para converter arquivo Excel em CSV
10GritSandpaper
@ 10GritSandpaper Usando Excel 2007. O script em seu link não funcionou para mim.
Boris_yo
Você pode alterar "%% i.csv" para "%% ~ ni.csv" para remover a extensão de arquivo ".xls" nos arquivos csv.
Shaohua Li
18

Que tal com o PowerShell?

O código deve ser semelhante a este, mas não testado

$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á uma postagem explicando como usá-lo

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

VOCÊS
fonte
Parece uma boa abordagem. Infelizmente, não consegui fazer isso funcionar. Não estou familiarizado com o PowerShell, então quando encontrei um erro, não sabia o que fazer. Não consegui encontrar uma solução específica do PowerShell: support.microsoft.com/kb/320369
Joel
Aqui estão algumas dicas para PowerShell e Excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
VOCÊ
Fiz um teste e também encontrei problemas. Uma coisa que encontrei foi dificuldade com o $Excel.Workbooks.Openmétodo. Não foi possível encontrar o arquivo especificado. Eu contornei isso usando Get-Itemno arquivo e canalizando-o para um ForEach-Objectloop (algo que vou acabar fazendo na minha implementação final de qualquer maneira) para as duas linhas começando $Workbook.
Iszi
Isso resolveu o problema, mas não consegui encontrar o "YOURDOC.csv" resultante - ele não estava na mesma pasta de "YOUDOC.XLS". Voltei para o antigo e confiável CMD e o fiz CD /D C:\ && DIR YOURDOC.csv /s. Acontece que o arquivo foi salvo em Meus Documentos por padrão. Portanto, você precisa inserir mais informações no script se quiser salvar o arquivo na mesma pasta em que está trabalhando (se não for em Meus Documentos).
Iszi
8

Tive a necessidade de extrair vários cvs de planilhas diferentes, então aqui está uma versão modificada do código plang que permite especificar o nome da planilha.

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

Aqui está uma versão que irá lidar com vários arquivos arrastados e soltos das janelas. Com base nas obras acima por

Christian Lemer
plang
ScottF

Abra o Bloco de notas, crie um arquivo chamado XlsToCsv.vbs e cole-o 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
Chris Rudd
fonte
1
Existe uma maneira de fazer a codificação UTF-8?
StuBob
Como pular a gravação de cabeçalho no arquivo csv de destino. Eu absolutamente não entendo o script acima, mas estou usando-o na minha automação. Obrigado.
TharunRaja de
@TharunRaja O script abre o arquivo no Excel e, em seguida, "salva como" em CSV, como se você tivesse feito à mão, exceto que o oculta no fundo. Como o script em si não está fazendo a conversão e você está automatizando-o, minha sugestão seria chamar um segundo script nos arquivos csv que isso gera, me envie uma mensagem se precisar de ajuda para fazer um que retire a primeira linha de um arquivo você passa.
Chris Rudd
Eu mesmo precisava de uma versão mais poderosa do PowerShell que pudesse processar datas corretamente, que pudesse lidar com cabeçalhos que não estão na primeira linha e algumas outras coisas (na verdade, analisa as células individuais em vez de confiar no Excel). Se as pessoas expressarem uma necessidade, eu postarei, mas uma vez que isso foi essencialmente respondido e estaríamos mudando de idioma, não quero postar duplicatas.
Chris Rudd de
5

Por que não escrever o seu próprio?

Vejo pelo seu perfil que você tem pelo menos alguma experiência em C # / .net. Eu criaria um aplicativo de console do Windows e usaria um leitor de Excel grátis para ler seu (s) arquivo (s) Excel. Eu usei o Excel Data Reader disponível no CodePlex sem nenhum problema (uma coisa boa: este leitor não requer a instalação do Excel). Você pode chamar seu aplicativo de console a partir da linha de comando.

Se você ficar preso poste aqui e tenho certeza que conseguirá ajuda.

Jay Riggs
fonte
Na verdade, eu nunca escrevi nenhum C #. Mas acho que vou tentar com o Excel Data Reader.
Joel
3
Um pouco exagero, você não acha. Cheiros de NIH.
Mr. Boy
1
Não acho que o Excel Data Reader seja o NIH. Em primeiro lugar, outra pessoa o escreveu. Em segundo lugar, resolveu o problema melhor do que o Excel totalmente desenvolvido.
Justin Dearing
4

Você pode fazer isso com Alacon - utilitário de linha de comando para banco de dados Alasql . Ele funciona com Node.js, então você precisa instalar o Node.js e, em seguida, o pacote Alasql .

Para converter o arquivo Excel em CVS (ou TSV), você pode inserir:

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

Por padrão, o Alasql converte os dados da "Planilha1", mas você pode alterá-los com os parâmetros:

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

Alacon suporta outros tipos de conversões (CSV, TSV, TXT, XLSX, XLS) e construções de linguagem SQL (consulte o Manual do Usuário para exemplos).

agershun
fonte
1
Uau! O Alasql é realmente poderoso.
Lukasz Wiktor
Se você instalar AlaSQL globalmente (npm install alasql -g), então você pode usar simplesmente> alasql "SELECT ... INTO CSV (...) FROM XLS (...)"
agershun
2

Existe um provedor de dados OLEDB do Excel integrado ao Windows; você pode usar isso para 'consultar' a planilha do Excel via ADO.NET e gravar os resultados em um arquivo CSV. Há uma pequena quantidade de codificação necessária, mas você não deve precisar instalar nada na máquina.

Tim Robinson
fonte
Resposta subestimada. Por que alguém instalaria um arquivo .DLL de terceiros quando o Windows tem essa funcionalidade incorporada?
Geoff Griswald
2

Com base no que Jon of All Trades forneceu, o seguinte (~ n) removeu o incômodo problema de extensão dupla: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

Charles Crous
fonte
1

Tentei a solução ScottF VB e fiz com que funcionasse. No entanto, eu queria converter um arquivo Excel de várias guias (pasta de trabalho) em um único arquivo .csv.

Isso não funcionou, apenas uma guia (a que fica em destaque quando eu abro via excel) foi copiada.

Alguém conhece um script que pode converter um arquivo Excel com várias guias em um único arquivo .csv?

user1132593
fonte
0

A resposta de Scott F é a melhor que encontrei na internet. Eu acrescentei ao código dele para atender às minhas necessidades. Eu adicionei:

On Error Resume Next <- Para compensar a falta de arquivos xls em meu processamento em lote na parte superior. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Antes da linha SaveAs para garantir que meus dados sejam salvos formatados como texto para evitar que o Excel exclua zeros à esquerda e elimine vírgulas em strings de números em meus dados ou seja (1.200 a 1.200). O intervalo da coluna deve ser ajustado para atender às suas necessidades (A: J).

Também removi o eco "pronto" para torná-lo não interativo.

Em seguida, adicionei o script a um arquivo em lote cmd para processar dados automatizados de hora em hora por meio de uma tarefa.

Jeffrey O
fonte
2
Acho que você deve considerar a publicação da versão final do código com comentários.
localidade padrão
0

Todas essas respostas me ajudaram a construir o script a seguir, que converterá automaticamente arquivos XLS * em CSV e vice-versa , colocando um ou mais arquivos no script (ou via linha de comando). Desculpas pela formatação tosca.

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

:: Para UTF-8 funciona para Microsoft Office 2016 e superior!

Experimente este código:

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

Crie um arquivo TXT em sua área de trabalho com o nome "xls2csv.vbs" e cole o código:

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

Arraste um arquivo XLS para ele (como "test.xls"). Isso criará um arquivo CSV convertido denominado "test.xls.csv". Em seguida, renomeie-o para "test.csv". Feito.

Arvy
fonte