Convertir XLS en CSV en ligne de commande

104

Comment puis-je convertir un fichier XLS en fichier CSV sur la ligne de commande Windows.

Microsoft Office 2000 est installé sur la machine. Je suis ouvert à l'installation d'OpenOffice si ce n'est pas possible avec Microsoft Office.

Joël
la source

Réponses:

125

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.

ScottF
la source
20
Au cas où quelqu'un se poserait la question, le paramètre 6 de la fonction oBook.SaveAs est la constante du format CSV.
ScottF
Fonctionne très bien, et pas seulement pour les fichiers xls, mais aussi xlsx. Comme l'a dit Andrew, les chemins de fichiers doivent être soit absolus, soit dans le répertoire "data" de l'utilisateur (je ne sais pas quel est le nom exact en anglais). Je n'ai toujours pas trouvé comment résoudre ça, je ne fais pas beaucoup de vbscript! :)
plang
3
J'ai posté ci-dessous une version légèrement modifiée qui gère mieux les chemins de fichiers. Merci ScottF!
plang
7
Le code convertit uniquement la feuille de calcul active. Pour sélectionner une autre feuille de calcul, ajoutez la ligne suivante après la oExcel.Workbooks.Openligne avec l'index souhaité de la feuille de calcul (commence à 1): oBook.Worksheets(1).Activate
humbads
1
Il convient de noter que cela fonctionne non seulement sur xls ou xlsx, mais sur tout fichier qu'Excel lui-même peut ouvrir.
user1318135
81

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.

plang
la source
J'utilise ceci (avec quelques adaptations) pour convertir de XML en XLS. Cependant, je ne souhaite pas avoir la boîte de message d'avertissement de compatibilité d'Excel lors de cette conversion. Savez-vous comment puis-je désactiver cet avertissement?
jpnavarini
Existe-t-il un moyen d'enregistrer ce fichier en tant que jeu de caractères Unicode?
rjv
2
J'ai mis cette réponse avec la réponse de @ user565869 dans un Gist avec des instructions simples. Voir: Script pour convertir un fichier Excel en CSV
10GritSandpaper
1
C'est bien mis en place @ 10GritSandpaper
amrrs
Y a-t-il un moyen d'utiliser; comme délimiteur au lieu de,? J'ai essayé de changer oBook.SaveAs dest_file, csv_format, Local: = True mais j'obtiens une erreur indiquant qu'une déclaration est attendue après le: Quand j'ai ajouté, "Local: = True" plus d'erreurs mais toujours le, est utilisé à la place de; comme délimiteur. Peut-être que l'un de vous peut m'aider.
suckerp
27

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

Michael Freidgeim
la source
1
@Rieaux: Concernant votre commentaire en tant qu'édition: si cela donne aux fichiers une double extension, un deuxième fichier batch simple peut les renommer. Cela dérive cependant vers une nouvelle question; veuillez essayer et, si vous ne parvenez pas à le faire fonctionner, postez une nouvelle question ici sur SU.
cette automatisation m'a sauvé la vie. :) Merci
Pushker Yadav
1
J'ai mis cette réponse avec la réponse de @plang dans un résumé avec des instructions simples. Voir: Script pour convertir un fichier Excel en CSV
10GritSandpaper
@ 10GritSandpaper Utilisation d'Excel 2007. Le script de votre lien n'a pas fonctionné pour moi.
Boris_yo
Vous pouvez remplacer «%% i.csv» par «%% ~ ni.csv» pour supprimer l'extension de fichier «.xls» dans les fichiers csv.
Shaohua Li
18

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?

TU
la source
Cela semble être une bonne approche. Malheureusement, je n'ai pas pu le faire. Je ne connais pas PowerShell, donc quand j'ai rencontré une erreur, je ne savais pas quoi faire. Je n'ai pas trouvé de solution spécifique à PowerShell: support.microsoft.com/kb/320369
Joel
Voici quelques conseils pour powershell et excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
VOUS
J'ai fait un essai de ceci et j'ai rencontré des problèmes aussi. Une chose que j'ai rencontrée était la difficulté avec la $Excel.Workbooks.Openméthode. Il n'a pas pu trouver le fichier spécifié. J'ai contourné ce problème en utilisant Get-Itemle fichier et en le redirigeant vers une ForEach-Objectboucle (ce que je finirai par faire dans ma mise en œuvre finale de toute façon) pour les deux lignes commençant par $Workbook.
Iszi
Cela a résolu ce problème, mais je n'ai pas pu trouver le résultat "YOURDOC.csv" - ce n'était pas dans le même dossier que "YOUDOC.XLS". Je suis retourné à l'ancien et fidèle CMD et je l'ai fait 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).
Iszi
8

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
Christian Lemer
la source
8

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
Chris Rudd
la source
1
Existe-t-il un moyen de faire un encodage UTF-8?
StuBob du
Comment ignorer l'écriture de l'en-tête dans le fichier csv cible. Je ne comprends absolument pas le script ci-dessus, mais je l'utilise dans mon automatisation. Merci.
TharunRaja
@TharunRaja Le script ouvre le fichier dans Excel, puis effectue un "enregistrer sous" en CSV, comme si vous l'aviez fait à la main, sauf qu'il le cache en arrière-plan. Parce que le script lui-même ne fait pas la conversion et que vous l'automatisez, ma suggestion serait d'appeler un deuxième script sur les fichiers csv que cela génère, m'envoyer un message si vous avez besoin d'aide pour en créer un qui supprime la première ligne d'un fichier vous le passez.
Chris Rudd
Moi-même, j'avais besoin d'une version plus puissante de PowerShell qui peut traiter correctement les dates, peut gérer les en-têtes qui ne sont pas sur la première ligne, et quelques autres choses (elle analyse en fait les cellules individuelles plutôt que de faire confiance à Excel). Si les gens en expriment le besoin, je le posterai, mais comme cela est essentiellement répondu et que nous changerions de langue, je ne veux pas publier de doublons.
Chris Rudd
5

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.

Jay Riggs
la source
En fait, je n'ai jamais écrit de C #. Mais je pense que je vais essayer avec le lecteur de données Excel.
Joel
3
Un peu exagéré ne pensez-vous pas. Odeurs de NIH.
Mr. Boy le
1
Je ne pense pas que le lecteur de données Excel soit NIH. Tout d'abord, quelqu'un d'autre l'a écrit. Deuxièmement, il a résolu le problème mieux qu'Excel à part entière.
Justin Dearing
4

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).

agershun
la source
1
Hou la la! Alasql est vraiment puissant.
Lukasz Wiktor
Si vous installez AlaSQL globalement (npm install alasql -g), vous pouvez utiliser simplement> alasql "SELECT ... INTO CSV (...) FROM XLS (...)"
agershun
2

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.

Tim Robinson
la source
Réponse sous-estimée. Pourquoi quelqu'un installerait-il un fichier .DLL tiers alors que Windows dispose de la fonctionnalité intégrée?
Geoff Griswald
2

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"

Charles Crous
la source
1

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?

user1132593
la source
0

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.

Jeffrey O
la source
2
Je pense que vous devriez envisager de publier la version finale du code avec des commentaires.
locale par défaut
0

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
drzaus
la source
0

:: 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
p4n1
la source
0

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é.

Arvy
la source