명령 줄에서 XLS를 CSV로 변환


104

Windows 명령 줄에서 XLS 파일을 CSV 파일로 어떻게 변환 할 수 있습니까?

컴퓨터에 Microsoft Office 2000이 설치되어 있습니다. Microsoft Office를 사용할 수없는 경우 OpenOffice를 설치할 수 있습니다.

답변:


125

메모장을 열고 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를 많이하지 않고 있습니다! :)
plang

3
파일 경로를 더 잘 처리하는 약간 수정 된 버전 아래에 게시했습니다. 감사합니다 ScottF!
계획은

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

이 파일을 유니 코드 문자 세트로 저장하는 방법이 있습니까?
rjv

2
나는이 답변을 간단한 지침으로 요점에 @ user565869의 답변과 함께 넣었습니다. 참조 : 스크립트 CSV로 엑셀 파일을 변환
10GritSandpaper

1
@ 10GritSandpaper
amrrs

사용하는 방법이 있습니까? 대신 구분 기호로,? 나는 oBook.SaveAs dest_file, csv_format, Local : = True를 변경하려고 시도했지만 다음에 문이 예상된다는 오류가 발생합니다. 구분자로. 당신 중 한 명이 나를 도울 수있을 것입니다.
suckerp

27

ScottF의 멋진 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

1
나는이 대답을 간단한 지침으로 요점에 @plang의 대답과 함께 넣었습니다. 참조 : 스크립트 CSV로 엑셀 파일을 변환
10GritSandpaper

@ 10GritSandpaper Excel 2007을 사용하고 있습니다. 링크의 스크립트가 작동하지 않았습니다.
Boris_yo

"%% 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

나는 이것을 테스트 실행했고 문제도 만났다. 내가 만난 한 가지는 $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

다른 워크 시트에서 여러 cv를 추출해야했기 때문에 워크 시트 이름을 지정할 수있는 수정 된 버전의 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

다음은 창에서 여러 파일을 끌어서 놓을 수있는 버전입니다. 위의 작품을 바탕으로

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을 신뢰하는 대신 개별 셀을 구문 분석합니다). 사람들이 그것에 대한 필요성을 표현하면 나는 그것을 게시 할 것이지만 이것은 본질적으로 대답되고 우리는 언어를 변경하기 때문에 중복을 게시하고 싶지 않습니다.
Chris Rudd

5

직접 작성해 보지 않겠습니까?

귀하의 프로필에서 최소한 C # /. NET 경험이있는 것으로 보입니다. Windows 콘솔 응용 프로그램을 만들고 무료 Excel 리더를 사용하여 Excel 파일을 읽습니다. CodePlex에서 제공 하는 Excel 데이터 리더 를 아무 문제없이 사용했습니다 (한 가지 좋은 점 :이 리더는 Excel을 설치할 필요가 없습니다). 명령 줄에서 콘솔 애플리케이션을 호출 할 수 있습니다.

여기에 게시 된 게시물을 발견하면 도움을받을 수있을 것입니다.


사실 저는 C #을 작성한 적이 없습니다. 하지만 Excel 데이터 리더로 균열을 줄 것이라고 생각합니다.
Joel

3
약간 과잉이라고 생각하지 않습니다. NIH 냄새.
미스터 보이

1
Excel 데이터 리더가 NIH라고 생각하지 않습니다. 우선 다른 누군가가 그것을 썼습니다. 둘째, 그것은 완전한 엑셀보다 문제를 더 잘 해결했습니다.
Justin Dearing 2011 년

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 솔루션을 사용해 보았고 작동했습니다. 그러나 다중 탭 (통합 문서) 엑셀 파일을 단일 .csv 파일로 변환하고 싶었습니다.

이것은 작동하지 않았고 하나의 탭 (Excel을 통해 열 때 강조 표시된 탭) 만 복사되었습니다.

멀티탭 엑셀 파일을 단일 .csv 파일로 변환 할 수있는 스크립트를 알고있는 사람이 있습니까?


0

Scott F의 대답은 내가 인터넷에서 찾은 최고입니다. 나는 내 요구를 충족시키기 위해 그의 코드를 추가했습니다. 나는 추가했다 :

On Error Resume Next <-맨 위의 일괄 처리에서 누락 된 xls 파일을 설명합니다. oBook.Application.Columns ( "A : J"). NumberFormat = "@" <-내 데이터의 선행 0을 삭제하고 내 데이터의 숫자 문자열에서 쉼표를 제거하는 것을 방지하기 위해 내 데이터가 텍스트 형식으로 저장되도록 SaveAs 줄 앞에 즉 (1,200 ~ 1200). 필요에 따라 컬럼 범위를 조정해야합니다 (A : J).

또한 Echo "done"을 제거하여 비대화 형으로 만들었습니다.

그런 다음 작업을 통해 매시간 자동화 된 데이터를 처리하기 위해 스크립트를 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"로 이름을 바꿉니다. 끝난.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.