web-dev-qa-db-fra.com

Convertir XLS en CSV en ligne de commande

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

Microsoft Office 2000 est installé sur la machine. Je suis ouvert à l'installation d'OpenOffice s'il est impossible d'utiliser Microsoft Office.

88
Joel

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

Pour cela, Excel doit être installé sur la machine sur laquelle vous vous trouvez.

103
ScottF

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 limité à xls du tout. xlsx fonctionne très bien, comme on pouvait s'y attendre.

Testé avec Office 2010.

66
plang

Une petite extension du script groovy VB de ScottF: ce fichier de commandes parcourt les fichiers .xlsx d'un répertoire et les exporte dans des fichiers * .csv:

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

Remarque: vous pouvez modifier l'extension .xlsx en .xls et le nom du script ExcelToCSV en XlsToCsv.

19
user565869

Que diriez-vous de 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 post expliquant comment l'utiliser

Comment utiliser Windows PowerShell pour automatiser Microsoft Excel?

14
YOU

Voici une version qui gérera plusieurs fichiers glissés et déposés depuis Windows . Basé sur les travaux ci-dessus de

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
6
Chris Rudd

J'avais besoin d'extraire plusieurs CVs 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
6
Christian Lemer

Pourquoi ne pas écrire le vôtre?

Je vois dans votre profil que vous avez au moins une expérience de 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 sans problème chez CodePlex (bon à savoir: 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é ici, je suis sûr que vous obtiendrez de l'aide.

5
Jay Riggs

Vous pouvez le faire avec Alacon - utilitaire de ligne de commande pour Alasql database. Cela fonctionne avec Node.js, vous devez donc installer Node.js puis Alasql package.

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 les paramètres suivants:

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

Alacon prend en charge d'autres types de conversions (CSV, TSV, TXT, XLSX, XLS) et des constructions en langage SQL (voir Manuel de l'utilisateur pour des exemples).

3
agershun

En se basant sur ce que Jon of All Trades a fourni, les éléments suivants (~ n) ont résolu le problème embêtant de la double extension: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

2
Charles Crous

J'ai essayé la solution ScottF VB et je l'ai mise au travail. 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 connaît-il un script capable de convertir un fichier Excel à plusieurs onglets en un seul fichier .csv?

1
user1132593

Il existe un fournisseur de données OLEDB Excel 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 code est requise, mais vous ne devriez rien installer sur la machine.

1
Tim Robinson

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.

' https://stackoverflow.com/questions/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
0
drzaus

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 comptabiliser un fichier xls manquant dans le traitement par lots en haut . oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Avant la ligne SaveAs, assurez-vous que mes données sont enregistrées sous forme de texte afin d'empêcher Excel de supprimer les zéros en tête et les virgules des chaînes de nombres de 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'écho "done" pour le rendre non interactif.

J'ai ensuite ajouté le script dans un fichier de commandes cmd pour le traitement de données automatisées heure par heure via une tâche.

0
Jeffrey O