在命令行上将XLS转换为CSV

问题描述:

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

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

打开记事本,创建一个名为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安装在您所在的机器上。

+17

如果有人想知道,oBook.SaveAs函数中的参数6是CSV格式的常量 – ScottF 2009-12-07 14:23:49

+4

需要完全解析XP实例上的路径名称 – Andrew 2011-03-23 06:25:59

+0

Works只是很好,不仅对于xls文件,还包括xlsx。正如Andrew所说,文件路径必须是绝对的,或者在用户“数据”目录中(我不确定英文中的确切名称是什么)。我还没有想出如何解决这个问题,我没有做太多的VBScript! :) – plang 2012-05-31 14:09:10

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

这里测试的一个文章,解释如何使用它

How Can I Use Windows PowerShell to Automate Microsoft Excel?

+0

这看起来像一个不错的办法。不幸的是,我无法完成它。我对PowerShell并不熟悉,所以当我遇到一个错误时,我不知道该怎么做。我找不到PowerShell特定的解决方案:http://support.microsoft.com/kb/320369 – Joel 2009-12-07 08:46:32

+0

这里是一些PowerShell和Excel的提示,http://blogs.technet.com/heyscriptingguy/archive/2006/ 09/08 /我怎么可以使用Windows PowerShell的自动化微软的excel.aspx – YOU 2009-12-07 08:53:38

+0

我做了这个测试运行,并遇到了问题以及。我碰到的一件事是$ $ Excel.Workbooks.Open'方法的困难。它无法找到指定的文件。我通过在文件中使用Get-Item来处理这个问题,并将它传递给一个'ForEach-Object'循环(我最终将在最后的实现中完成这个循环),以'$ Workbook'开头。 – Iszi 2015-02-03 15:12:10

为什么不写自己的?

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

如果你发现自己在这里发帖,我相信你会得到帮助。

+0

其实,我从来没有写过任何C#如初。但我想我会把它与Excel的数据读取器的裂缝。 – Joel 2009-12-07 08:49:18

+3

有点大材小用你不觉得,NIH的气味。 – 2010-09-17 09:56:54

+1

我不认为Excel数据读取器是美国国立卫生研究院。首先别人写的第二,它比全面的Excel更好地解决了这个问题 – 2011-03-24 21:12:33

Windows中内置了Excel OLEDB数据提供程序;您可以使用它通过ADO.NET'查询'Excel表格并将结果写入CSV文件。需要少量编码,但不需要在机器上安装任何东西。

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

On Error Resume Next < - 在我的批处理过程中解决了缺少xls文件的问题。在保存行之前确保我的数据被保存为文本格式,以保持excel不会删除前导零并消除数字字符串中的逗号(可能为空格)。在我的数据即(1,200至1200)。列范围应该调整以满足您的需求(A:J)。

我还删除了回声“完成”,使其非互动。

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

+2

我认为你应该考虑发表带有评论的最终版本的代码。 – 2012-11-03 06:45:15

我试了ScottF VB解决方案,并得到它的工作。不过,我想将一个多选项卡(工作簿)excel文件转换为一个.csv文件。

这不起作用,只有一个选项卡(当我通过excel打开时突出显示的选项卡)被复制。

是否有人知道可以将多选项卡excel文件转换为单个.csv文件的脚本?

稍微修改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

+0

我使用这个(很少改编)将XML从XML转换为XLS。但是,在此转换期间,我不希望从Excel中获得兼容性警告消息框。你知道我怎么能禁用这个警告? – jpnavarini 2012-08-08 14:18:55

+0

嗨,我很抱歉,不知道! :) – plang 2012-08-08 14:28:31

+0

你救了我的一天。不错的工作 – 2015-08-06 18:44:48

上ScottF的常规VB脚本一个小扩张:此批处理文件将通过目录中的文件的.xlsx循环将它们放到*的.csv文件:

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

注意:您可以更改扩展名的.xlsx为.xls andname脚本ExcelToCSV来XlsToCsv

+1

@Rieaux:关于你的评论作为一个编辑:如果这给了该文件是双扩展名,第二个简单的批处理文件可以重命名它们。尽管如此,这却成了一个新的问题。请尝试一下,如果您无法工作,请在SU上发布一个新问题。 – 2013-09-30 20:20:37

+0

这个自动化拯救了我的生命。 :)谢谢你 – 2015-08-06 18:45:13

+0

我把这个答案和@plang的答案一起用简单的指令写在Gist中。请参阅:在你的链接使用Excel 2007中的脚本我没有工作(https://gist.github.com/tonyerskine/77250575b166bec997f33a679a0dfbe4) – 10GritSandpaper 2017-01-06 16:44:04

我有一个需要提取从不同的工作表数CVS,所以这里的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 

建立在什么所有交易的乔恩,下述(〜N)去除恼人的双扩展问题: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

你可以用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语言结构(有关示例,请参见User Manual)。

这是一个版本,将处理多个文件从窗口拖放。通过

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 
+0

有没有办法做UTF-8编码? – StuBob 2017-09-27 17:54:08

+0

如何跳过在目标csv文件中写入标题。我绝对不理解上面的脚本,但我在自动化中使用它。谢谢。 – TharunRaja 2017-11-22 14:58:17

+0

@TharunRaja脚本打开Excel中的文件,然后再执行“另存为”,以CSV,就像如果你手工完成它,除了它隐藏在后台。因为脚本本身并没有进行转换,而且您正在自动执行转换,所以我的建议是在输出的csv文件上调用第二个脚本,如果需要帮助的话,请发出一条消息,以便删除第一行你通过它的文件。 – 2017-11-26 02:41:45