Risposte:
Apri Blocco note, crea un file chiamato XlsToCsv.vbs e incollalo in:
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"
Quindi da una riga di comando, vai alla cartella in cui hai salvato il file .vbs ed esegui:
XlsToCsv.vbs [sourcexlsFile].xls [destinationcsvfile].csv
Tuttavia, ciò richiede che Excel sia installato sulla macchina in cui ti trovi.
oExcel.Workbooks.Open
riga con l'indice desiderato del foglio di lavoro (inizia da 1): oBook.Worksheets(1).Activate
Una versione leggermente modificata della risposta ScottF, che non richiede percorsi di file assoluti:
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
Ho rinominato lo script ExcelToCsv, poiché questo script non è limitato a xls. xlsx Funziona perfettamente, come potremmo aspettarci.
Testato con Office 2010.
Una piccola espansione sul fantastico script VB di ScottF: questo file batch eseguirà il ciclo dei file .xlsx in una directory e li scaricherà in file * .csv:
FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%i.csv"
Nota: è possibile modificare l'estensione .xlsx in .xls e il nome dello script ExcelToCSV in XlsToCsv
Che ne dici di PowerShell?
Il codice dovrebbe essere simile a questo, ma non testato
$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()
Ecco un post che spiega come usarlo
Come posso utilizzare Windows PowerShell per automatizzare Microsoft Excel?
$Excel.Workbooks.Open
metodo. Non è stato possibile trovare il file specificato. Ho aggirato questo problema utilizzando Get-Item
sul file e collegandolo a un ForEach-Object
ciclo (qualcosa che finirò comunque per fare nella mia implementazione finale) per le due righe che iniziano con $Workbook
.
CD /D C:\ && DIR YOURDOC.csv /s
. Risulta che il file è stato salvato in I miei documenti per impostazione predefinita. Quindi, è necessario inserirne di più nello script se si desidera salvare il file nella stessa cartella in cui si sta lavorando (se diversa da Documenti).
Avevo bisogno di estrarre diversi CV da diversi fogli di lavoro, quindi ecco una versione modificata del codice plang che ti consente di specificare il nome del foglio di lavoro.
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
Ecco una versione che gestirà più file trascinati e rilasciati da Windows. Sulla base dei lavori di cui sopra di
Christian Lemer
plang
ScottF
Apri Blocco note, crea un file chiamato XlsToCsv.vbs e incollalo in:
'* 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
Perché non scrivere il tuo?
Vedo dal tuo profilo che hai almeno un po 'di esperienza con C # /. NET. Creerei un'applicazione per console Windows e utilizzerei un lettore Excel gratuito per leggere i tuoi file Excel. Ho usato Excel Data Reader disponibile da CodePlex senza alcun problema (una cosa bella: questo lettore non richiede l'installazione di Excel). È possibile chiamare l'applicazione della console dalla riga di comando.
Se ti trovi bloccato, posta qui e sono sicuro che riceverai aiuto.
Puoi farlo con Alacon - utilità della riga di comando per il database Alasql . Funziona con Node.js, quindi è necessario installare Node.js e quindi il pacchetto Alasql .
Per convertire un file Excel in CVS (o TSV) puoi inserire:
> node alacon "SELECT * INTO CSV('mydata.csv', {headers:true}) FROM XLS('mydata.xls', {headers:true})"
Per impostazione predefinita Alasql converte i dati da "Sheet1", ma puoi modificarli con i parametri:
{headers:false, sheetid: 'Sheet2', range: 'A1:C100'}
Alacon supporta altri tipi di conversioni (CSV, TSV, TXT, XLSX, XLS) e costruzioni in linguaggio SQL (vedere il manuale utente per esempi).
C'è un provider di dati OLEDB di Excel integrato in Windows; puoi usarlo per "interrogare" il foglio Excel tramite ADO.NET e scrivere i risultati in un file CSV. È richiesta una piccola quantità di codice, ma non dovrebbe essere necessario installare nulla sulla macchina.
Basandosi su ciò che ha fornito Jon of All Trades, quanto segue (~ n) ha rimosso il fastidioso problema della doppia estensione:
FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"
Ho provato la soluzione ScottF VB e l'ho fatta funzionare. Tuttavia, volevo convertire un file Excel multi-scheda (cartella di lavoro) in un singolo file .csv.
Questo non ha funzionato, è stata copiata solo una scheda (quella che viene evidenziata quando lo apro tramite Excel).
Qualcuno è a conoscenza di uno script in grado di convertire un file Excel multi-scheda in un singolo file .csv?
La risposta di Scott F è la migliore che ho trovato su Internet. Ho aggiunto il suo codice per soddisfare le mie esigenze. Ho aggiunto:
In caso di errore, riprendi dopo <- Per tenere conto di un file xls mancante nella mia elaborazione batch in alto. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Prima della riga SaveAs per assicurarmi che i miei dati vengano salvati formattati come testo per impedire a Excel di eliminare gli zeri iniziali e di eliminare le virgole nelle stringhe di numeri nei miei dati vale a dire (da 1.200 a 1200). L'intervallo di colonne dovrebbe essere regolato per soddisfare le tue esigenze (A: J).
Ho anche rimosso l'Echo "fatto" per renderlo non interattivo.
Ho quindi aggiunto lo script in un file batch cmd per l'elaborazione dei dati automatizzati su base oraria tramite un'attività.
Tutte queste risposte mi hanno aiutato a costruire il seguente script che convertirà automaticamente i file XLS * in CSV e viceversa , rilasciando uno o più file sullo script (o tramite riga di comando). Mi scuso per la formattazione 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
:: Per UTF-8 funziona per Microsoft Office 2016 e versioni successive!
Prova questo codice:
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
Crea un file TXT sul desktop denominato "xls2csv.vbs" e incolla il codice:
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
Trascina un file XLS su di esso (come "test.xls"). Creerà un file CSV convertito denominato "test.xls.csv". Quindi rinominalo in "test.csv". Fatto.