Перетворити XLS в CSV в командному рядку


104

Як я міг конвертувати XLS-файл у файл CSV у командному рядку Windows.

На апараті встановлено Microsoft Office 2000. Я відкритий для установки OpenOffice, якщо це неможливо за допомогою Microsoft Office.

Відповіді:


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
Якщо хтось цікавився, параметр 6 у функції oBook.SaveAs є константою для формату CSV.
Скотт

Працює чудово, і не тільки для файлів xls, але й для xlsx. За словами Ендрю, шляхи до файлів повинні бути або абсолютними, або в каталозі "data" користувача (я не впевнений, що саме називається англійською мовою). Я досі не зрозумів, як це вирішити, я не роблю багато vbscript! :)
планг

3
Я розмістив нижче трохи змінену версію, яка краще обробляє шляхи до файлів. Дякую Скотфу!
планг

7
Код перетворює лише активний робочий аркуш. Щоб вибрати інший робочий аркуш, додайте наступний рядок після oExcel.Workbooks.Openрядка з потрібним показником робочого аркуша (починається з 1): oBook.Worksheets(1).Activate
humbads

1
Слід зазначити, що цей функціонал не лише на xls чи xlsx, але і на будь-якому файлі, який може відкрити сам Excel.
користувач1318135

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

Чи є спосіб зберегти цей файл як набір символів Unicode?
rjv

2
Цю відповідь я поклав разом із відповіддю @ user565869 в Суть із простими інструкціями. Дивіться: Сценарій для перетворення файлу Excel у CSV
10GritSandpaper

1
Це приємно зібрано разом @ 10GritSandpaper
amrrs

Чи є спосіб використання; як роздільник замість,? Я спробував змінити oBook.SaveAs dest_file, csv_format, Local: = True, але я отримав помилку, що слід очікувати після: Коли я додав, "Local: = True" більше помилок, але все-таки використовується замість; як роздільник. Можливо, хтось із вас може мені допомогти.
suckerp

27

Невелике розширення у жорстокому скрипті VB від ScottF: цей пакетний файл прокрутить файли .xlsx у каталозі та скине їх у * .csv файли:

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

Примітка. Ви можете змінити розширення .xlsx на .xls та ім'я сценарію ExcelToCSV на XlsToCsv


1
@ Rieaux: Що стосується вашого коментаря як редагування: якщо це дає файлам подвійне розширення, другий простий пакетний файл може перейменувати їх. Це, однак, переходить до нового питання; будь ласка, спробуйте, і якщо ви не можете змусити його працювати, опублікуйте тут нове запитання на SU.

ця автоматизація врятувала мені життя. :) Дякую u
Pushker Yadav

1
Я поставив цю відповідь разом із відповіддю @plang у Суть із простими інструкціями. Дивіться: Сценарій для перетворення файлу Excel в CSV
10GritSandpaper

@ 10GritSandpaper Використання Excel 2007. Сценарій у вашому посиланні не працював для мене.
Boris_yo

Ви можете змінити "%% i.csv" на "%% ~ ni.csv", щоб видалити розширення файлу ".xls" у файлах csv.
Шаохуа Лі

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-specifc: support.microsoft.com/kb/320369
Joel

Ось декілька порад щодо 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:\ && DIR YOURDOC.csv /s. Виявляється, за замовчуванням файл був збережений у Мої документи. Отже, вам потрібно вкласти більше сценарію, якщо ви хочете зберегти файл у тій самій папці, в якій ви працюєте (якщо не "Мої документи").
Іссі

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, який виводить це повідомлення, повідомте мені, якщо вам потрібна допомога зробити той, який викреслює перший рядок файл ви передаєте його.
Кріс Рудд

Мені потрібна була більш потужна версія в powerhell, яка може правильно обробляти дати, може обробляти заголовки, які не в першому рядку, та кілька інших речей (це насправді аналізує окремі клітинки, а не довіряє excel). Якщо люди виявлять потребу в цьому, я опублікую його, але оскільки на це відповідь, і ми будемо змінювати мови, я не хочу публікувати дублікати.
Кріс Рудд

5

Чому б не написати своє?

Я бачу, що у вас є хоча б певний досвід роботи C # /. NET. Я б створив додаток для консолі Windows і використав би безкоштовний зчитувач Excel для читання у ваших файлах Excel. Я без будь-яких проблем використовував програму для читання даних Excel, доступну в CodePlex (одна приємна річ: цей читач не вимагає встановлення Excel). Ви можете викликати консольну програму з командного рядка.

Якщо ви опинитесь тут за застряглим повідомленням, і я впевнений, що вам допоможуть.


Насправді я ніколи не писав жодного C #. Але я думаю, що я дам йому тріщину з програмою зчитування даних Excel.
Джоель

3
Трохи надмірності ви не думаєте. Запахи NIH.
Містер Хлопчик

1
Я не думаю, що зчитувач даних Excel - це NIH. Перш за все це написав хтось інший. По-друге, це вирішило проблему краще, ніж повноцінний Excel.
Justin Dearing

4

Це можна зробити за допомогою Alacon - утиліти командного рядка для бази даних Alasql . Він працює з Node.js, тому вам потрібно встановити Node.js, а потім пакет Alasql .

Для перетворення файлу Excel у CVS (від 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 встановіть alasql -g), тоді ви можете використовувати просто> alasql "SELECT ... INTO CSV (...)
OF

2

Є вбудований постачальник даних Excel OLEDB в Windows; Ви можете використовувати це для "запиту" на лист Excel через ADO.NET і записувати результати у файл CSV. Потрібна невелика кількість кодування, але вам не потрібно нічого встановлювати на апарат.


Занижена відповідь. Навіщо комусь встановлювати сторонній файл .DLL, коли Windows має вбудований функціонал?
Джефф Грісвальд

2

Спираючись на те, що запропонував Jon of All Trades, наступне (~ n) усунуло набридливу проблему подвійного розширення: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"


1

Я спробував рішення ScottF VB і змусив його працювати. Однак я хотів перетворити файл Excel з декількома вкладками (робочу книгу) в єдиний .csv-файл.

Це не спрацювало, лише одна вкладка (та, яка виділяється, коли я відкриваю її через excel) скопійована.

Хтось знає про сценарій, який може перетворити файл Excel з декількома вкладками в один .csv файл?


0

Відповідь Скотта Ф - найкраще, що я знайшов в Інтернеті. Я доповнив його код, щоб задовольнити мої потреби. Я додав:

On Error Resume Next <- Для обліку відсутніх файлів xls в пакетній обробці вгорі. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Перед рядком SaveAs, щоб переконатися, що мої дані збережені у форматі тексту, щоб уникнути excel від видалення нульових знаків та усунення коми в рядках чисел у моїх даних тобто (1200 до 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

Створіть на робочому столі файл TXT під назвою "xls2csv.vbs" та вставте код:

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"). Це створить перетворений файл CSV під назвою "test.xls.csv". Потім перейменуйте його на "test.csv". Зроблено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.