Respuestas:
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.
oExcel.Workbooks.Open
línea con el índice deseado de la hoja de trabajo (comienza en 1): oBook.Worksheets(1).Activate
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.
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
¿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?
$Excel.Workbooks.Open
método. No pudo encontrar el archivo especificado. Resolví esto usando Get-Item
en el archivo y conectándolo a un ForEach-Object
bucle (algo que terminaré haciendo en mi implementación final de todos modos) para las dos líneas que comienzan con $Workbook
.
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).
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
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
¿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.
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).
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.
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"
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?
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.
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
:: ¡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
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.