Convierta XLS a CSV en la línea de comando

104

¿Cómo podría convertir un archivo XLS en un archivo CSV en la línea de comandos de Windows?

La máquina tiene Microsoft Office 2000 instalado. Estoy abierto a instalar OpenOffice si no es posible usar Microsoft Office.

Joel
fuente

Respuestas:

125

Abra el Bloc de notas, cree un archivo llamado XlsToCsv.vbs y péguelo en:

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"

Luego, desde una línea de comando, vaya a la carpeta en la que guardó el archivo .vbs y ejecute:

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

Sin embargo, esto requiere que Excel esté instalado en la máquina en la que se encuentra.

ScottF
fuente
20
En caso de que alguien se lo pregunte, el parámetro 6 en la función oBook.SaveAs es la constante para el formato CSV.
ScottF
Funciona bien, y no solo para archivos xls, sino también xlsx. Como dijo Andrew, las rutas de los archivos deben ser absolutas o estar en el directorio de "datos" del usuario (no estoy seguro de cuál es el nombre exacto en inglés). Todavía no he descubierto cómo resolver eso, ¡no estoy haciendo mucho vbscript! :)
plang
3
He publicado a continuación una versión ligeramente modificada que maneja mejor las rutas de archivo. ¡Gracias ScottF!
plang
7
El código convierte solo la hoja de trabajo activa. Para seleccionar otra hoja de trabajo, agregue la siguiente línea después de la oExcel.Workbooks.Openlínea con el índice deseado de la hoja de trabajo (comienza en 1): oBook.Worksheets(1).Activate
humbads
1
Cabe señalar que esta función no solo en xls o xlsx, sino en cualquier archivo que Excel pueda abrir.
user1318135
81

Una versión ligeramente modificada de la respuesta de ScottF, que no requiere rutas de archivo absolutas:

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

He cambiado el nombre del script ExcelToCsv, ya que este script no se limita a xls en absoluto. xlsx Funciona bien, como era de esperar.

Probado con Office 2010.

plang
fuente
Estoy usando esto (con pocas adaptaciones) para convertir de XML a XLS. Sin embargo, no quiero tener el cuadro de mensaje de advertencia de compatibilidad de Excel durante esta conversión. ¿Sabes cómo puedo desactivar esta advertencia?
jpnavarini
¿Hay alguna forma de guardar este archivo como conjunto de caracteres Unicode?
rjv
2
Puse esta respuesta junto con la respuesta de @ user565869 en un Gist con instrucciones simples. Ver: Script para convertir el archivo de Excel a CSV
10GritSandpaper
1
Eso es bueno juntos @ 10GritSandpaper
amrrs
¿Hay alguna forma de usar? como delimitador en lugar de,? Intenté cambiar oBook.SaveAs dest_file, csv_format, Local: = True pero obtengo un error que indica que se espera una declaración después de: Cuando agregué, "Local: = True" no hay más errores pero aún se usa, en lugar de; como delimitador. Quizás alguno de ustedes pueda ayudarme.
suckerp
27

Una pequeña expansión en el maravilloso script VB de ScottF: este archivo por lotes recorrerá los archivos .xlsx en un directorio y los volcará en archivos * .csv:

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

Nota: Puede cambiar la extensión .xlsx a .xls y el nombre del script ExcelToCSV a XlsToCsv

Michael Freidgeim
fuente
1
@Rieaux: Con respecto a su comentario-como-edición: si esto le da a los archivos una extensión doble, un segundo archivo por lotes simple puede cambiarles el nombre. Sin embargo, esto está derivando hacia una nueva pregunta; Pruébelo y, si no puede hacerlo funcionar, publique una nueva pregunta aquí en SU.
esta automatización me salvó la vida. :) Gracias
Pushker Yadav
1
Puse esta respuesta junto con la respuesta de @plang en un Gist con instrucciones simples. Ver: Script para convertir un archivo de Excel a CSV
10GritSandpaper
@ 10GritSandpaper Usando Excel 2007. El script en su enlace no funcionó para mí.
Boris_yo
Puede cambiar "%% i.csv" a "%% ~ ni.csv" para eliminar la extensión de archivo ".xls" en los archivos csv.
Shaohua Li
18

¿Qué tal con PowerShell?

El código debería verse así, aunque no probado

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

Aquí hay una publicación que explica cómo usarlo.

¿Cómo puedo usar Windows PowerShell para automatizar Microsoft Excel?


fuente
Parece un buen enfoque. Desafortunadamente, no pude hacerlo funcionar. No estoy familiarizado con PowerShell, así que cuando me encontré con un error no sabía qué hacer. No pude encontrar una solución específica de PowerShell: support.microsoft.com/kb/320369
Joel
Aquí hay algunos consejos para powershell y excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
USTED
Hice una prueba de funcionamiento de esto y también encontré problemas. Una cosa que encontré fue dificultad con el $Excel.Workbooks.Openmétodo. No pudo encontrar el archivo especificado. Resolví esto usando Get-Itemen el archivo y conectándolo a un ForEach-Objectbucle (algo que terminaré haciendo en mi implementación final de todos modos) para las dos líneas que comienzan con $Workbook.
Iszi
Eso solucionó ese problema, pero luego no pude encontrar el "YOURDOC.csv" resultante; no estaba en la misma carpeta que "YOUDOC.XLS". Volví a CMD antiguo y confiable y lo hice CD /D C:\ && DIR YOURDOC.csv /s. Resulta que el archivo se guardó en Mis documentos de forma predeterminada. Por lo tanto, debe incluir más en el script si desea guardar el archivo en la misma carpeta en la que está trabajando (si no es Mis documentos).
Iszi
8

Tenía la necesidad de extraer varios cvs de diferentes hojas de trabajo, por lo que aquí hay una versión modificada del código plang que le permite especificar el nombre de la hoja de trabajo.

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

Aquí hay una versión que manejará múltiples archivos arrastrados y soltados desde Windows. Basado en los trabajos anteriores de

Christian Lemer
plang
ScottF

Abra el Bloc de notas, cree un archivo llamado XlsToCsv.vbs y péguelo en:

'* 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
fuente
1
¿Hay alguna forma de realizar la codificación UTF-8?
StuBob
Cómo omitir la escritura del encabezado en el archivo csv de destino. No entiendo en absoluto el script anterior, pero lo estoy usando en mi automatización. Gracias.
TharunRaja
@TharunRaja El script abre el archivo en Excel, luego hace un "guardar como" en CSV, como si lo hubiera hecho a mano, excepto que lo oculta en segundo plano. Debido a que la secuencia de comandos en sí no está realizando la conversión y la está automatizando, mi sugerencia sería llamar a una segunda secuencia de comandos en los archivos csv que genera este mensaje, envíeme un mensaje si necesita ayuda para hacer una que elimine la primera línea de una archivo lo pasas.
Chris Rudd
Yo mismo necesitaba una versión más poderosa en PowerShell que pueda procesar correctamente las fechas, pueda manejar encabezados que no están en la primera línea y algunas otras cosas (en realidad analiza las celdas individuales en lugar de confiar en Excel). Si la gente expresa una necesidad, lo publicaré, pero como esto está esencialmente respondido y estaríamos cambiando de idioma, no quiero publicar duplicados.
Chris Rudd
5

¿Por qué no lo escribes tu mismo?

Veo en su perfil que tiene al menos algo de experiencia en C # / .NET. Crearía una aplicación de consola de Windows y usaría un lector de Excel gratuito para leer sus archivos de Excel. He usado Excel Data Reader disponible en CodePlex sin ningún problema (una cosa buena: este lector no requiere que Excel esté instalado). Puede llamar a su aplicación de consola desde la línea de comandos.

Si se encuentra atascado, publique aquí y estoy seguro de que obtendrá ayuda.

Jay Riggs
fuente
De hecho, nunca he escrito ningún C #. Pero creo que lo intentaré con Excel Data Reader.
Joel
3
Un poco exagerado, ¿no crees? Huele a NIH.
Mr. Boy
1
No creo que Excel Data Reader sea NIH. Primero que nada, alguien más lo escribió. En segundo lugar, resolvió el problema mejor que Excel completo.
Justin Dearing
4

Puede hacerlo con Alacon, utilidad de línea de comandos para la base de datos Alasql . Funciona con Node.js, por lo que debe instalar Node.js y luego el paquete Alasql .

Para convertir un archivo de Excel a CVS (ot TSV) puede ingresar:

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

De forma predeterminada, Alasql convierte los datos de "Sheet1", pero puede cambiarlos con los parámetros:

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

Alacon admite otro tipo de conversiones (CSV, TSV, TXT, XLSX, XLS) y construcciones de lenguaje SQL (consulte el Manual del usuario para ver ejemplos).

agershun
fuente
1
¡Guauu! Alasql es realmente poderoso.
Lukasz Wiktor
Si instala AlaSQL globalmente (npm install alasql -g) entonces puede usar simplemente> alasql "SELECT ... INTO CSV (...) FROM XLS (...)"
agershun
2

Hay un proveedor de datos OLEDB de Excel integrado en Windows; puede usar esto para 'consultar' la hoja de Excel a través de ADO.NET y escribir los resultados en un archivo CSV. Se requiere una pequeña cantidad de codificación, pero no debería necesitar instalar nada en la máquina.

Tim Robinson
fuente
Respuesta subestimada. ¿Por qué alguien instalaría un archivo .DLL de terceros cuando Windows tiene la funcionalidad incorporada?
Geoff Griswald
2

Sobre la base de lo que Jon of All Trades ha proporcionado, lo siguiente (~ n) eliminó el molesto problema de la doble extensión: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

Charles Crous
fuente
1

Probé la solución ScottF VB y la hice funcionar. Sin embargo, quería convertir un archivo de Excel de varias pestañas (libro de trabajo) en un solo archivo .csv.

Esto no funcionó, solo se copió una pestaña (la que está resaltada cuando la abro a través de Excel).

¿Alguien conoce un script que pueda convertir un archivo de Excel de múltiples pestañas en un solo archivo .csv?

usuario1132593
fuente
0

La respuesta de Scott F es la mejor que he encontrado en Internet. Agregué a su código para satisfacer mis necesidades. Yo añadí:

En caso de error, reanudar siguiente <- Para tener en cuenta los archivos xls que faltan en mi procesamiento por lotes en la parte superior. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Antes de la línea SaveAs para asegurarme de que mis datos se guarden formateados como texto para evitar que Excel elimine los ceros iniciales y las comas en cadenas de números en mis datos es decir (1200 a 1200). El rango de la columna debe ajustarse para satisfacer sus necesidades (A: J).

También eliminé el eco "hecho" para que no sea interactivo.

Luego agregué el script en un archivo por lotes de cmd para procesar datos automatizados cada hora a través de una tarea.

Jeffrey O
fuente
2
Creo que debería considerar publicar la versión final del código con comentarios.
configuración regional predeterminada
0

Todas estas respuestas me ayudaron a construir el siguiente script que convertirá automáticamente los archivos XLS * a CSV y viceversa , colocando uno o más archivos en el script (o mediante la línea de comandos). Disculpas por el formato 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
drzaus
fuente
0

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

Prueba 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
fuente
0

Cree un archivo TXT en su escritorio llamado "xls2csv.vbs" y pegue el 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

Arrastre un archivo XLS a él (como "test.xls"). Creará un archivo CSV convertido llamado "test.xls.csv". Luego, cámbiele el nombre a "test.csv". Hecho.

Arvy
fuente