Respostas:
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á.
oExcel.Workbooks.Open
linha com o índice desejado da planilha (começa em 1): oBook.Worksheets(1).Activate
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.
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
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?
$Excel.Workbooks.Open
método. Não foi possível encontrar o arquivo especificado. Eu contornei isso usando Get-Item
no arquivo e canalizando-o para um ForEach-Object
loop (algo que vou acabar fazendo na minha implementação final de qualquer maneira) para as duas linhas começando $Workbook
.
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).
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
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
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.
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).
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.
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"
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?
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.
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
:: 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
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.