【问题标题】:Convert XLS to CSV on command line在命令行上将 XLS 转换为 CSV
【发布时间】:2010-12-23 21:53:22
【问题描述】:

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

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

【问题讨论】:

    标签: windows excel csv


    【解决方案1】:

    在您的桌面上创建一个名为“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”。完成。

    【讨论】:

      【解决方案2】:

      :: 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
      

      【讨论】:

        【解决方案3】:

        所有这些答案帮助我构建了以下脚本,该脚本将自动将 XLS* 文件转换为 CSV 反之亦然,方法是在脚本上放置一个或多个文件(或通过命令行)。抱歉格式不正确。

        ' 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
        

        【讨论】:

          【解决方案4】:

          打开记事本,创建一个名为 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。

          【讨论】:

          • 如果有人想知道,oBook.SaveAs 函数中的参数 6 是 CSV 格式的常量。
          • 工作得很好,不仅适用于 xls 文件,也适用于 xlsx。正如安德鲁所说,文件路径必须是绝对的,或者在用户“数据”目录中(我不确定英文的确切名称是什么)。我还没有想出如何解决这个问题,我没有做太多的vbscript! :)
          • 我在下面发布了一个稍微修改过的版本,它可以更好地处理文件路径。谢谢 ScottF!
          • 代码只转换活动工作表。要选择另一个工作表,请在 oExcel.Workbooks.Open 行之后添加以下行以及所需的工作表索引(从 1 开始):oBook.Worksheets(1).Activate
          • 需要注意的是,此功能不仅适用于 xls 或 xlsx,还适用于 Excel 本身可以打开的任何文件。
          【解决方案5】:

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

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

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

          【讨论】:

          • @Rieaux:关于您的评论编辑:如果这给文件一个双扩展名,第二个简单的批处理文件可以重命名它们。不过,这正在引发一个新问题;请试一试,如果您无法使其正常工作,请在 SU 上发布一个新问题。
          • 这种自动化救了我的命。 :) 谢谢你
          • 我将这个答案与@plang 的答案放在一个要点中,并附有简单的说明。见:Script to convert Excel File to CSV
          • @10GritSandpaper 使用 Excel 2007。链接中的脚本对我不起作用。
          • 您可以将“%%i.csv”更改为“%%~ni.csv”以删除 csv 文件中的“.xls”文件扩展名。
          【解决方案6】:

          这是一个可以处理多个文件从窗口拖放的版本。 基于以上作品由

          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
          

          【讨论】:

          • 有没有办法进行 UTF-8 编码?
          • 如何在目标 csv 文件中跳过写入标题。我绝对不理解上面的脚本,但我在自动化中使用它。谢谢。
          • @TharunRaja 该脚本在 excel 中打开文件,然后“另存为”到 CSV,就像您手动完成一样,只是它将文件隐藏在后台。因为脚本本身没有进行转换,并且您正在自动化它,所以我的建议是在输出的 csv 文件上调用第二个脚本,如果您需要帮助制作一个去除第一行的脚本,请给我留言文件你传递它。
          • 我自己我需要一个更强大的 powershell 版本,它可以正确处理日期,可以处理不在第一行的标题以及其他一些事情(它实际上解析单个单元格而不是信任优秀)。如果人们表达了对它的需求,我会发布它,但由于这基本上得到了回答,而且我们将更改语言,我不想发布重复的内容。
          【解决方案7】:

          您可以使用 Alacon - Alasql 数据库的命令行实用程序来完成此操作。它适用于 Node.js,因此您需要安装 Node.jsAlasql 包。

          要将 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)。

          【讨论】:

          • 哇! Alasql真的很强大。
          • 如果你全局安装 AlaSQL (npm install alasql -g) 那么你可以简单地使用 > alasql "SELECT... INTO CSV(...) FROM XLS(...)"
          【解决方案8】:

          基于 Jon of All Trades 提供的内容,以下 (~n) 删除了令人讨厌的双重扩展问题: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"

          【讨论】:

            【解决方案9】:

            我需要从不同的工作表中提取几个 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
            

            【讨论】:

              【解决方案10】:

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

              On Error Resume Next oBook.Application.Columns("A:J").NumberFormat = "@"

              我还删除了 Echo “完成”以使其非交互。

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

              【讨论】:

              • 我认为您应该考虑使用 cmets 发布代码的最终版本。
              【解决方案11】:

              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 的兼容性警告消息框。您知道如何禁用此警告吗?
              • 有没有办法将此文件保存为 Unicode 字符集?
              • 我将这个答案与@user565869 的答案放在一个要点中,并附有简单的说明。见:Script to convert Excel File to CSV
              • 这很好@10GritSandpaper
              • 有没有办法使用;作为分隔符而不是 ,?我尝试更改 oBook.SaveAs dest_file, csv_format, Local:=True 但我收到一个错误,即在 : 当我添加时,“Local:=True”不再出现错误,但仍然使用 , 而不是 ;作为分隔符。也许你们中的一个可以帮助我。
              【解决方案12】:

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

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

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

              【讨论】:

                【解决方案13】:

                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?

                【讨论】:

                • 这看起来是个好方法。不幸的是,我无法进行下去。我不熟悉 PowerShell,所以当我遇到错误时,我不知道该怎么做。我找不到特定于 PowerShell 的解决方案:support.microsoft.com/kb/320369
                • 这里有一些关于powershell和excel的技巧,blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
                • 我对此进行了测试,也遇到了问题。我遇到的一件事是$Excel.Workbooks.Open 方法的困难。它找不到指定的文件。我通过在文件上使用Get-Item 并将其传送到ForEach-Object 循环(无论如何我最终将在我的最终实现中做的事情)为以$Workbook 开头的两行来解决这个问题。
                • 解决了这个问题,但后来我找不到生成的“YOURDOC.csv”——它与“YOUDOC.XLS”不在同一个文件夹中。我回到旧的和可信赖的 CMD 并做了CD /D C:\ &amp;&amp; DIR YOURDOC.csv /s。原来该文件默认保存到我的文档中。因此,如果要将文件保存到您正在使用的同一文件夹(如果不是“我的文档”),则需要在脚本中添加更多内容。
                【解决方案14】:

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

                【讨论】:

                • 被低估的答案。既然 Windows 内置了功能,为什么还要安装第三方 .DLL 文件?
                【解决方案15】:

                为什么不自己写呢?

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

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

                【讨论】:

                • 实际上,我从来没有写过任何 C#。但我想我会用 Excel 数据阅读器试一试。
                • 你不觉得有点矫枉过正。 NIH 的味道。
                • 我不认为 Excel 数据阅读器是 NIH。首先是别人写的。其次,它比完整的 Excel 更好地解决了这个问题。
                猜你喜欢
                • 1970-01-01
                • 2011-06-14
                • 1970-01-01
                • 2012-01-21
                • 2014-06-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多