コマンドラインでXLSをCSVに変換する


103

WindowsコマンドラインでXLSファイルをCSVファイルに変換するにはどうすればよいですか。

マシンにはMicrosoft Office 2000がインストールされています。Microsoft Officeを使用できない場合は、OpenOfficeをインストールできます。

回答:


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、2009

xlsファイルだけでなく、xlsxでも問題なく機能します。Andrewが言ったように、ファイルパスは絶対パスか、ユーザーの "data"ディレクトリにある必要があります(英語での正確な名前はわかりません)。私はまだそれを解決する方法を理解していません、私はあまりvbscriptをしていません!:)
2012年

3
ファイルパスをより適切に処理するわずかに変更されたバージョンを以下に投稿しました。ScottF、ありがとう!
2012年

7
コードはアクティブなワークシートのみを変換します。別のワークシートを選択するには、後に次の行を追加します。oExcel.Workbooks.Openワークシートの所望のインデックスと行(1から開始): oBook.Worksheets(1).Activate
humbads

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

このスクリプトはxlsに限定されていないため、スクリプトの名前をExcelToCsvに変更しました。予想通り、xlsxは問題なく動作します。

Office 2010でテスト済み。


XMLからXLSに変換するためにこれを使用しています(いくつかの変更を加えています)。ただし、この変換中にExcelからの互換性警告メッセージボックスを表示したくありません。この警告を無効にする方法を知っていますか?
jpnavarini 2012

このファイルをUnicode文字セットとして保存する方法はありますか?
rjv 2016年

2
この回答を@ user565869の回答と一緒に、簡単な説明を含む要旨にまとめました。参照:ExcelファイルをCSVに変換するスクリプト
10GritSandpaper 2017年

1
@ 10GritSandpaper
amrrsをまとめると、

使用する方法はありますか?の代わりに区切り文字として、oBook.SaveAs dest_file、csv_format、Local:= Trueを変更しようとしましたが、次の後にステートメントが予期されるというエラーが表示されます。区切り文字として。たぶん、あなたの1人が私を助けてくれるでしょう。
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:編集としてのコメントに関して:これによりファイルに二重の拡張子が付けられる場合、2番目の単純なバッチファイルでファイル名を変更できます。ただし、これは新しい質問に流れ込んでいます。試してみて、うまくいかない場合は、SUに新しい質問を投稿してください。

この自動化によって私の命が救われました。:)ありがとうございます
Pushker Yadav

1
この回答を@plangの回答と一緒に要旨にまとめ、簡単な指示を付けました。参照:ExcelファイルをCSVに変換するスクリプト
10GritSandpaper 2017年

@ 10GritSandpaper Excel 2007を使用しています。リンクのスクリプトが機能しませんでした。
Boris_yo 2017

「%% i.csv」を「%%〜ni.csv」に変更して、csvファイルの「.xls」ファイル拡張子を削除できます。
Shaohua Li

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

これを試してみたところ、問題が発生しました。私が遭遇した1つのことは、$Excel.Workbooks.Open方法の難しさでした。指定されたファイルが見つかりませんでした。で始まる2行Get-Itemのファイルを使用してForEach-Objectループにパイプすることでこれを回避しました(とにかく最終的な実装で最終的に行うことになるものです)$Workbook
Iszi

これで問題は解決しましたが、結果の「YOURDOC.csv」が見つかりませんでした。「YOUDOC.XLS」と同じフォルダにありませんでした。私は古くて信頼できるCMDに戻って行ったCD /D C:\ && DIR YOURDOC.csv /s。ファイルがデフォルトでマイドキュメントに保存されたことがわかります。そのため、作業中の同じフォルダー(マイドキュメント以外の場合)にファイルを保存する場合は、スクリプトにさらに追加する必要があります。
Iszi

8

さまざまなワークシートからいくつかのCVを抽出する必要があったので、ここにワークシート名を指定できるように変更されたバージョンのプランコードがあります。

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

これは、ウィンドウからドラッグアンドドロップされた複数のファイルを処理するバージョンです。上記に基づいて

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 2017

ターゲットcsvファイルのヘッダーの書き込みをスキップする方法。上記のスクリプトは完全に理解できませんが、自動化で使用しています。ありがとうございました。
TharunRaja 2017年

@TharunRajaスクリプトはファイルをExcelで開き、CSVに「名前を付けて保存」します。これは、バックグラウンドで非表示にすることを除いて、手動で行った場合と同じです。スクリプト自体は変換を実行しておらず、自動化しているため、この出力ではcsvファイルの2番目のスクリプトを呼び出すことをお勧めします。最初の行を削除するヘルプが必要な場合はメッセージを送ってください。あなたがそれを渡すファイル。
クリスラッド

私は、Powershellで日付を正しく処理し、最初の行にないヘッダーを処理できる、より強力なバージョンを必要としていました(実際には、Excelを信頼するのではなく、個々のセルを解析します)。人々がそれの必要性を表明した場合、私はそれを投稿しますが、これは本質的に回答されており、言語を変更することになるので、重複を投稿したくありません。
Chris Rudd、

5

自分で書いてみませんか?

あなたのプロフィールから、少なくともC#/。NETの経験があることがわかりました。Windowsコンソールアプリケーションを作成し、無料のExcelリーダーを使用してExcelファイルを読み取ります。私は問題なくCodePlexから入手できるExcelデータリーダーを使用しました(このリーダーにはExcelのインストールが必要ありません)。コマンドラインからコンソールアプリケーションを呼び出すことができます。

ここで投稿が行き詰まっているのを見つけたら、きっとあなたが助けを得るでしょう。


実際、C#を書いたことはありません。でも、Excelデータリーダーを使って問題を解決すると思います。
ジョエル

3
少しやり過ぎではありませんか。NIHのにおい。
氏Mr. Boy

1
ExcelデータリーダーはNIHではないと思います。まず第一に誰かがそれを書いた。第二に、問題を完全に解決されたExcelよりもよく解決しました。
Justin Dearing

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は本当に強力です。
Lukasz Wiktor

AlaSQLをグローバルにインストールする場合(npm install alasql -g)、単純に使用できます> alasql "SELECT ... INTO CSV(...)FROM XLS(...)"
agershun

2

WindowsにはExcel OLEDBデータプロバイダーが組み込まれています。これを使用して、ADO.NET経由でExcelシートを「クエリ」し、結果をCSVファイルに書き込むことができます。少量のコーディングが必要ですが、マシンに何もインストールする必要はありません。


過小評価された答え。Windowsに機能が組み込まれているのに、なぜサードパーティの.DLLファイルをインストールするのですか?
Geoff Griswald

2

Jon of All Tradesが提供したものに基づいて、次の(〜n)は厄介な二重拡張の問題を削除しました。 FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"


1

ScottF VBソリューションを試してみました。ただし、マルチタブ(ワークブック)のExcelファイルを1つの.csvファイルに変換したいと思いました。

これは機能せず、1つのタブ(Excelで開いたときに強調表示されているタブ)だけがコピーされました。

マルチタブのExcelファイルを単一の.csvファイルに変換できるスクリプトを知っている人はいますか?


0

スコットFの答えは私がインターネットで見つけた中で最高です。私のニーズに合わせて彼のコードを追加しました。追加した:

エラー時に再開次へ <-上部のバッチ処理で欠落しているxlsファイルを説明します。 oBook.Application.Columns( "A:J")。NumberFormat = "@" < -SaveAs行の前に、データがテキストとしてフォーマットされて保存されていることを確認して、先頭のゼロを削除したり、データ内の数値文字列のコンマを削除したりしないようにします。つまり(1,200〜1200)。カラムの範囲は、ニーズに合わせて調整する必要があります(A:J)。

また、インタラクティブではないようにするために、エコーの「完了」を削除しました。

次に、スクリプトをcmdバッチファイルに追加して、タスクを介して1時間ごとに自動データを処理しました。


2
コメント付きのコードの最終バージョンを投稿することを検討する必要があると思います。
デフォルトのロケール

0

これらの答えのすべては、私は自動的にXLS * CSVファイルに変換します次のスクリプト構築に役立っその逆と副のスクリプト(またはコマンドライン経由)に1つまたは複数のファイルをドロップすることで、。ぎこちないフォーマットの謝罪。

' /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」に変更します。できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.