Convertir XLS en CSV en ligne de commande

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

la machine a Microsoft Office 2000 installé. Je suis prêt à installer OpenOffice si ce n'est pas possible avec Microsoft Office.

87
demandé sur Joel 2009-12-07 09:24:21

13 réponses

ouvrir Bloc-Notes, créer un fichier appelé XlsToCsv.VBS et coller ceci 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, allez dans le dossier que vous avez sauvegardé .vbs fichier et de lancer:

XlsToCsv.vbs [sourcexlsFile].xls [destinationcsvfile].csv

pour cela, Excel doit être installé sur la machine sur laquelle vous êtes.

101
répondu ScottF 2017-02-08 22:14:47

une version légèrement modifiée de la réponse ScottF, qui ne nécessite pas de chemins de fichier 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. xlsx fonctionne très bien, comme on pouvait s'y attendre.

Testé avec Office 2010.

64
répondu plang 2012-05-31 14:25:40

une petite extension sur le script groovy VB de ScottF: ce fichier batch passera par le .les fichiers xlsx dans un répertoire et les Dumper dans *.fichiers csv:

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

Note: Vous pouvez changer l'extension .xlsx .xls andname of script ExcelToCSV to XlsToCsv

17
répondu Michael Freidgeim 2016-06-24 01:21:35

et avec PowerShell?

Code devrait être ressemble à cela, pas testé bien que

$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 message expliquant comment l'utiliser

comment utiliser Windows PowerShell pour automatiser Microsoft Excel?

13
répondu YOU 2009-12-07 08:57:13

j'ai eu besoin d'extraire plusieurs cvs de différentes feuilles de travail, donc voici une version modifiée du code de plang qui vous permet de spécifier le nom de la feuille de travail.

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
répondu Christian Lemer 2013-05-10 23:30:02

pourquoi ne pas écrire le vôtre?

je vois que de votre profil vous avez au moins une certaine expérience C#/.NET. Je créerais une application de console de Windows et utiliserais un lecteur Excel gratuit pour lire dans votre(Vos) fichier (s) Excel. J'ai utilisé Excel Data Reader disponible sur CodePlex sans aucun problème (une bonne chose: ce lecteur N'a pas besoin D'Excel pour être installé). Vous pouvez appeler votre application console depuis la ligne de commande.

si vous trouvez-vous coincé poste ici et je suis sûr que vous obtiendrez de l'aide.

5
répondu Jay Riggs 2009-12-07 06:38:41

Voici une version qui traitera plusieurs fichiers glisser-déposer à partir de windows. Basé sur les travaux ci-dessus de

Christian Lemer
plang
ScottF

ouvrir Bloc-Notes, créer un fichier appelé XlsToCsv.VBS et coller ceci 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
5
répondu Chris Rudd 2016-04-22 23:51:17

en se basant sur ce que Jon de tous les métiers a fourni, le suivant (~n) a enlevé la question pesante de la double extension: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

2
répondu Charles Crous 2014-12-02 21:05:25

vous pouvez le faire avec l'utilitaire en ligne de commande Alacon pour la base de données Alasql . Il fonctionne avec le Noeud.js, vous devez donc installer le noeud .js et puis paquet 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 les paramètres:

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

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

2
répondu agershun 2014-12-21 16:24:55

il y a un fournisseur de données Excel OLEDB intégré dans Windows; vous pouvez l'utiliser pour' interroger ' la feuille Excel via ADO.NET et écrivez les résultats dans un fichier CSV. Il y a une petite quantité de codage nécessaire, mais vous ne devriez pas avoir besoin d'installer quoi que ce soit sur la machine.

1
répondu Tim Robinson 2009-12-07 08:02:03

j'ai essayé la solution ScottF VB et je l'ai fait fonctionner. Cependant j'ai voulu convertir un multi-onglet(classeur) fichier excel en un seul .fichier csv.

cela n'a pas fonctionné, un seul onglet(celui qui est surligné lorsque je l'ouvre via excel) a été copié.

est celui qui connaît un script qui peut convertir un fichier excel multi-onglets en un seul .fichier csv?

1
répondu user1132593 2012-03-16 13:49:09

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 manque xls fichiers dans mon traitement par lots dans la partie supérieure. oBook.Application.Colonnes ("A:J").NumberFormat = " @ " < - avant la ligne SaveAs pour s'assurer que mes données sont sauvegardées formatées sous forme de texte pour empêcher excel de supprimer les zéro et d'éliminer les virgules dans chaînes de nombres dans mes données (1200 à 1200). La gamme de colonnes doit être ajustée pour répondre à vos besoins (A: J).

j'ai aussi enlevé L'écho" fait " pour le rendre non interactif.

j'ai ensuite ajouté le script dans un fichier de lot cmd pour traiter les données automatisées sur une base horaire via une tâche.

0
répondu Jeffrey O 2012-11-03 06:45:01

toutes ces réponses m'ont aidé à construire le script suivant qui convertira automatiquement les fichiers XLS* en CSV et vice versa , en laissant tomber un ou plusieurs fichiers sur le script (ou via la ligne de commande). Toutes mes excuses pour le formatage de janky.

' /q/convert-xls-to-csv-on-command-line-21100/"" 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
répondu drzaus 2018-08-10 17:29:35