Réponses:
Ouvrez le Bloc-notes, créez un fichier appelé XlsToCsv.vbs et collez-le dans:
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"
Ensuite, à partir d'une ligne de commande, accédez au dossier dans lequel vous avez enregistré le fichier .vbs et exécutez:
XlsToCsv.vbs [sourcexlsFile].xls [destinationcsvfile].csv
Cela nécessite cependant qu'Excel soit installé sur la machine sur laquelle vous vous trouvez.
oExcel.Workbooks.Open
ligne avec l'index souhaité de la feuille de calcul (commence à 1): oBook.Worksheets(1).Activate
Une version légèrement modifiée de la réponse ScottF, qui ne nécessite pas de chemins de fichiers absolus:
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
J'ai renommé le script ExcelToCsv, car ce script n'est pas du tout limité à xls. xlsx Fonctionne très bien, comme on pouvait s'y attendre.
Testé avec Office 2010.
Une petite extension sur le groovy VB script de ScottF: ce fichier batch va parcourir les fichiers .xlsx dans un répertoire et les vider dans des fichiers * .csv:
FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%i.csv"
Remarque: vous pouvez changer l'extension .xlsx en .xls et le nom du script ExcelToCSV en XlsToCsv
Et avec PowerShell?
Le code devrait ressembler à ceci, mais pas testé
$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()
Voici un article expliquant comment l'utiliser
Comment puis-je utiliser Windows PowerShell pour automatiser Microsoft Excel?
$Excel.Workbooks.Open
méthode. Il n'a pas pu trouver le fichier spécifié. J'ai contourné ce problème en utilisant Get-Item
le fichier et en le redirigeant vers une ForEach-Object
boucle (ce que je finirai par faire dans ma mise en œuvre finale de toute façon) pour les deux lignes commençant par $Workbook
.
CD /D C:\ && DIR YOURDOC.csv /s
. Il s'avère que le fichier a été enregistré par défaut dans Mes documents. Donc, vous devez en mettre plus dans le script si vous souhaitez enregistrer le fichier dans le même dossier dans lequel vous travaillez (s'il est différent de Mes documents).
J'avais besoin d'extraire plusieurs cv de différentes feuilles de calcul, voici donc une version modifiée du code plang qui vous permet de spécifier le nom de la feuille de calcul.
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
Voici une version qui gérera plusieurs fichiers glisser-déposer à partir de Windows. Basé sur les travaux ci-dessus par
Christian Lemer
plang
ScottF
Ouvrez le Bloc-notes, créez un fichier appelé XlsToCsv.vbs et collez-le dans:
'* 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
Pourquoi ne pas écrire le vôtre?
Je vois de votre profil que vous avez au moins une certaine expérience C # /. NET. Je créerais une application console Windows et utiliserais un lecteur Excel gratuit pour lire vos fichiers Excel. J'ai utilisé Excel Data Reader disponible sur CodePlex sans aucun problème (une bonne chose: ce lecteur ne nécessite pas l'installation d'Excel). Vous pouvez appeler votre application console à partir de la ligne de commande.
Si vous vous trouvez coincé, postez ici et je suis sûr que vous obtiendrez de l'aide.
Vous pouvez le faire avec Alacon - utilitaire de ligne de commande pour la base de données Alasql . Cela fonctionne avec Node.js, vous devez donc installer Node.js , puis le package Alasql .
Pour convertir un fichier Excel en CVS (ot TSV), vous pouvez entrer:
> node alacon "SELECT * INTO CSV('mydata.csv', {headers:true}) FROM XLS('mydata.xls', {headers:true})"
Par défaut, Alasql convertit les données de "Sheet1", mais vous pouvez les modifier avec des paramètres:
{headers:false, sheetid: 'Sheet2', range: 'A1:C100'}
Alacon prend en charge d'autres types de conversions (CSV, TSV, TXT, XLSX, XLS) et les constructions de langage SQL (voir le manuel de l' utilisateur pour des exemples).
Il existe un fournisseur de données Excel OLEDB intégré à Windows; vous pouvez l'utiliser pour «interroger» la feuille Excel via ADO.NET et écrire les résultats dans un fichier CSV. Une petite quantité de codage est nécessaire, mais vous ne devriez rien installer sur la machine.
S'appuyant sur ce que Jon of All Trades a fourni, le (~ n) suivant a supprimé le problème de double extension:
FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"
J'ai essayé la solution ScottF VB et je l'ai fait fonctionner. Cependant, je voulais convertir un fichier Excel à plusieurs onglets (classeur) en un seul fichier .csv.
Cela n'a pas fonctionné, un seul onglet (celui qui est mis en évidence lorsque je l'ouvre via Excel) a été copié.
Quelqu'un a-t-il connaissance d'un script capable de convertir un fichier Excel à onglets multiples en un seul fichier .csv?
La réponse de Scott F est la meilleure que j'ai trouvée sur Internet. J'ai ajouté son code pour répondre à mes besoins. J'ai ajouté:
On Error Resume Next <- Pour tenir compte d'un fichier xls manquant dans mon traitement par lots en haut. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Avant la ligne SaveAs pour m'assurer que mes données sont enregistrées au format texte pour empêcher Excel de supprimer les zéros non significatifs et d'éliminer les virgules dans les chaînes numériques dans mes données c'est-à-dire (1 200 à 1 200). La plage de colonnes doit être ajustée pour répondre à vos besoins (A: J).
J'ai également supprimé l'Echo "done" pour le rendre non interactif.
J'ai ensuite ajouté le script dans un fichier batch cmd pour traiter des données automatisées sur une base horaire via une tâche.
Toutes ces réponses m'ont aidé à construire le script suivant qui convertira automatiquement les fichiers XLS * en CSV et vice versa , en déposant un ou plusieurs fichiers sur le script (ou via la ligne de commande). Toutes mes excuses pour le formatage 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
:: Pour UTF-8 fonctionne pour Microsoft Office 2016 et supérieur!
Essayez ce code:
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
Créez un fichier TXT sur votre bureau nommé "xls2csv.vbs" et collez le code:
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
Faites-y glisser un fichier XLS (comme "test.xls"). Il créera un fichier CSV converti nommé "test.xls.csv". Ensuite, renommez-le en "test.csv". Terminé.