在命令行上将XLS转换为CSV


103

如何在Windows命令行上将XLS文件转换为CSV文件。

本机安装了Microsoft Office 2000。如果无法使用Microsoft Office,我愿意安装OpenOffice。

Answers:


124

打开记事本,创建一个名为XlsToCsv.vbs的文件并将其粘贴到:

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"

然后从命令行转到保存.vbs文件的文件夹并运行:

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

但是,这需要在您使用的计算机上安装Excel。


20
如果有人想知道,oBook.SaveAs函数中的参数6是CSV格式的常数。
ScottF

效果很好,不仅适用于xls文件,而且适用于xlsx。正如安德鲁所说,文件路径必须是绝对路径,或在用户“数据”目录中(我不确定英文的确切名称是什么)。我仍然没有想出如何解决这个问题,我没有做太多的vbscript!:)
plang 2012年

3
我在下面发布了一个稍作修改的版本,该版本可以更好地处理文件路径。谢谢斯科特!
计划

7
该代码仅转换活动工作表。要选择另一个工作表,请在oExcel.Workbooks.Open具有所需工作表索引的行之后添加以下行(从1开始): oBook.Worksheets(1).Activate
humbads 2013年

1
应当指出,此功能不仅适用于xls或xlsx,而且适用于Excel本身可以打开的任何文件。
user1318135

81

ScottF答案的略微修改版本,不需要绝对文件路径:

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

我已将脚本重命名为ExcelToCsv,因为此脚本完全不限于xls。如我们所料,xlsx可以正常工作。

经过Office 2010测试。


我正在使用它(很少修改)将XML转换为XLS。但是,我不希望在此转换过程中出现来自Excel的兼容性警告消息框。您知道如何禁用此警告吗?
jpnavarini 2012年

有什么方法可以将此文件另存为Unicode字符集?
rjv

2
我通过简单的说明将这个答案与@ user565869的答案一起放在了Gist中。请参阅:将Excel文件转换为CSV的脚本
10GritSandpaper

1
放在一起@ 10GritSandpaper很不错
amrrs

有没有一种使用方法; 作为分隔符而不是?我尝试更改oBook.SaveAs dest_file,csv_format,Local:= True,但是我收到一个错误,提示您应在之后声明:添加时,“ Local:= True”不再使用其他错误,而是使用代替了;作为分隔符。也许你们中的一位可以帮助我。
suckerp

27

ScottF的groovy VB脚本的一个小扩展:该批处理文件将循环遍历目录中的.xlsx文件,并将它们转储为* .csv文件:

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

注意:您可以将扩展名.xlsx更改为.xls,并将脚本ExcelToCSV的名称更改为XlsToCsv


1
@Rieaux:关于您的“编辑时评论”:如果这给文件提供了双扩展名,则第二个简单的批处理文件可以重命名它们。但是,这正在浮出一个新的问题。请尝试一下,如果您无法使用它,请在此处在SU上发布一个新问题。

这种自动化挽救了我的生命。:)谢谢你
Pushker Yadav 2015年

1
我通过简单的说明将这个答案与@plang的答案放到了Gist中。请参阅:将Excel文件转换为CSV的脚本
10GritSandpaper

@ 10GritSandpaper使用Excel2007。您链接中的脚本对我不起作用。
Boris_yo

您可以将“ %% i.csv”更改为“ %%〜ni.csv”,以删除csv文件中的“ .xls”文件扩展名。
李少华

18

如何使用PowerShell?

代码应如下所示,但未经测试

$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()

这是一篇说明如何使用它的帖子

如何使用Windows PowerShell自动化Microsoft Excel?


这看起来是个好方法。不幸的是,我无法继续前进。我不熟悉PowerShell,所以当我遇到错误时,我不知道该怎么办。我找不到特定于PowerShell的解决方案:support.microsoft.com/kb/320369
Joel

下面是PowerShell和Excel中一些小技巧,blogs.technet.com/heyscriptingguy/archive/2006/09/08/...
YOU

我对此进行了测试,也遇到了问题。我遇到的一件事是该$Excel.Workbooks.Open方法的困难。找不到指定的文件。我通过Get-Item在文件上使用并将其管道输送到以ForEach-Object开头的两行循环到循环中(无论如何最终要在我的最终实现中完成)来解决此问题$Workbook
Iszi 2015年

那解决了这个问题,但是后来我找不到结果“ YOURDOC.csv”-它与“ YOUDOC.XLS”不在同一个文件夹中。我回到了值得信赖的古老的CMD那里CD /D C:\ && DIR YOURDOC.csv /s。原来该文件默认情况下已保存到“我的文档”中。因此,如果要将文件保存到工作所在的同一文件夹(如果不是“我的文档”),则需要在脚本中添加更多内容。
Iszi 2015年

8

我需要从不同的工作表中提取多个简历,因此这是Plang代码的修改版本,允许您指定工作表名称。

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

8

这是一个可以处理多个文件从Windows拖放的版本。基于以上工作

Christian Lemer
plang
ScottF

打开记事本,创建一个名为XlsToCsv.vbs的文件并将其粘贴到:

'* 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

1
有没有办法进行UTF-8编码?
StuBob

如何跳过在目标csv文件中写入标题。我绝对不理解上面的脚本,但是我在自动化中使用它。谢谢。
TharunRaja

@TharunRaja脚本在excel中打开文件,然后将其另存为CSV,就像您手工完成一样,只是将其隐藏在后台。由于脚本本身并未进行转换,而您正在使它自动化,因此我的建议是在输出的csv文件上调用第二个脚本,如果需要帮助,请告知我,以使该脚本删除第一行文件通过。
克里斯·路德

我自己需要一个功能更强大的Powershell版本,该版本可以正确处理日期,可以处理不在第一行的标头以及其他一些内容(它实际上解析单个单元格而不是信任excel)。如果人们表达了对它的需求,我会发布它,但是由于这基本上可以解决,我们将更改语言,所以我不想发布重复的东西。
克里斯·路德

5

为什么不自己写?

我从您的个人资料中看到,您至少具有一些C#/。NET经验。我将创建一个Windows控制台应用程序,并使用免费的Excel阅读器读取您的Excel文件。我已经使用了CodePlex的Excel Data Reader,没有任何问题(一件好事:此阅读器不需要安装Excel)。您可以从命令行调用控制台应用程序。

如果您发现自己的帖子停留在这里,我相信您会得到帮助。


实际上,我从未写过任何C#。但是我想我会用Excel Data Reader来解决它。
乔尔

3
你觉得有点过大了。NIH的气味。
男孩先生2010年

1
我认为Excel Data Reader不是NIH。首先是别人写的。其次,它比完全使用Excel更好地解决了问题。
贾斯汀·迪林

4

您可以使用Alacon - Alasql数据库的命令行实用程序来完成此操作。它与Node.js一起使用,因此您需要先安装Node.js,然后再安装Alasql软件包。

要将Excel文件转换为CVS(ot TSV),可以输入:

> node alacon "SELECT * INTO CSV('mydata.csv', {headers:true}) FROM XLS('mydata.xls', {headers:true})"

默认情况下,Alasql会从“ Sheet1”转换数据,但您可以使用参数进行更改:

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

Alacon支持其他类型的转换(CSV,TSV,TXT,XLSX,XLS)和SQL语言构造(有关示例,请参见用户手册)。


1
哇!Alasql非常强大。
卢卡斯·威克多

如果您全局安装AlaSQL(npm install alasql -g),则可以简单地使用> alasql“ SELECT ... INTO CSV(...)FROM XLS(...)”
agershun

2

Windows内置了一个Excel OLEDB数据提供程序。您可以使用它通过ADO.NET“查询” Excel工作表并将结果写入CSV文件。只需要少量的编码,但是您不需要在计算机上安装任何东西。


被低估的答案。Windows具有内置功能时,为什么有人会安装第三方.DLL文件?
杰夫·格里斯瓦尔德

2

在所有交易的乔恩提供的内容的基础上,以下(〜n)消除了讨厌的双重扩展问题: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"


1

我尝试了ScottF VB解决方案并使它正常工作。但是我想将多选项卡(工作簿)excel文件转换为单个.csv文件。

这不起作用,仅复制了一个标签页(当我通过excel打开它时突出显示的标签页)。

有谁知道一种可以将多选项卡excel文件转换为单个.csv文件的脚本吗?


0

Scott F的答案是我在互联网上找到的最好的答案。我确实添加了他的代码以满足我的需求。我补充说:

错误恢复上的下一个 <-要在顶部的批处理中解决缺少的xls文件。 oBook.Application.Columns(“ A:J”)。NumberFormat =“ @” <-在SaveAs行之前,以确保将我的数据保存为文本格式,以防止excel删除数据中的前导零并消除数字字符串中的逗号即(1,200至1200)。列的范围应进行调整以满足您的需要(A:J)。

我还删除了“回声”,使它不具有交互性。

然后,我将脚本添加到cmd批处理文件中,以通过任务每小时处理一次自动数据。


2
我认为您应该考虑发布带有注释的代码最终版本。
默认语言环境

0

所有这些答案都帮助我构建了以下脚本,该脚本通过将一个或多个文件拖放到脚本中(或通过命令行)来自动将XLS *文件转换为CSV ,反之亦然。不好意思的格式道歉。

' /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

0

::对于UTF-8,适用于Microsoft Office 2016及更高版本!

试试这个代码:

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

0

在名为“ xls2csv.vbs”的桌面上创建一个TXT文件,然后粘贴代码:

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

将XLS文件拖到其中(例如“ test.xls”)。它将创建一个名为“ test.xls.csv”的转换后的CSV文件。然后,将其重命名为“ test.csv”。做完了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.