Преобразование XLS в CSV в командной строке

Как я мог преобразовать файл XLS в файл CSV в командной строке Windows.

На машине установлен Microsoft Office 2000. Я готов установить OpenOffice, если это невозможно с помощью Microsoft Office.


person Joel    schedule 07.12.2009    source источник


Ответы (15)


Откройте Блокнот, создайте файл с именем 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.

person ScottF    schedule 07.12.2009
comment
Если кому-то интересно, параметр 6 в функции oBook.SaveAs является константой для формата CSV. - person ScottF; 07.12.2009
comment
Прекрасно работает, и не только для файлов xls, но и xlsx. Как сказал Эндрю, пути к файлам должны быть либо абсолютными, либо в каталоге пользовательских данных (я не уверен, какое точное имя на английском языке). Я до сих пор не понял, как это решить, я не очень много пишу vbscript! :) - person plang; 31.05.2012
comment
Ниже я разместил немного измененную версию, которая лучше обрабатывает пути к файлам. Спасибо, ScottF! - person plang; 31.05.2012
comment
Я использую это (с небольшими изменениями) для преобразования из XML в XLS. Однако я не хочу, чтобы во время этого преобразования в Excel появлялось окно с предупреждением о совместимости. Вы знаете, как отключить это предупреждение? - person jpnavarini; 08.08.2012
comment
Код преобразует только активный лист. Чтобы выбрать другой рабочий лист, добавьте следующую строку после строки oExcel.Workbooks.Open с желаемым индексом рабочего листа (начинается с 1): oBook.Worksheets(1).Activate - person humbads; 30.10.2013
comment
Прекрасно работает. Есть ли способ сохранить форматирование исходных ячеек в окончательном файле csv? (в моем случае содержимое некоторых ячеек файла Excel пересекается, и я бы хотел, чтобы оно пересекалось также в csv) - person Stefano Lombardi; 29.05.2014
comment
Вы спасатель! - person Mark Kram; 29.05.2015
comment
Можно ли конвертировать все файлы в папке из XLSX в XLSB? - person Firee; 30.11.2015
comment
Если кто-то хочет связать этот vbs с процессом Python, обратитесь к заголовку stackoverflow.com/questions/19112944/ - person fatih_dur; 04.10.2016
comment
Следует отметить, что этот функционал не только на xls или xlsx, но и на любом файле, который может открыть сам Excel. - person user1318135; 23.08.2017

Слегка измененная версия ответа 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.

person plang    schedule 31.05.2012
comment
Я использую это (с небольшими изменениями) для преобразования из XML в XLS. Однако я не хочу, чтобы во время этого преобразования в Excel появлялось окно с предупреждением о совместимости. Вы знаете, как отключить это предупреждение? - person jpnavarini; 08.08.2012
comment
Есть ли способ сохранить этот файл как набор символов Unicode? - person rjv; 30.06.2016
comment
Я поместил этот ответ вместе с ответом @ user565869 в Gist с простыми инструкциями. См. Скрипт для преобразования файла Excel в CSV. - person 10GritSandpaper; 06.01.2017
comment
Приятно собрать @ 10GritSandpaper - person amrrs; 06.11.2017
comment
Есть ли способ использовать; в качестве разделителя вместо,? Я попытался изменить oBook.SaveAs dest_file, csv_format, Local: = True, но я получаю сообщение об ошибке, что оператор ожидается после: Когда я добавил, Local: = True больше нет ошибок, но по-прежнему используется, вместо; как разделитель. Может быть, кто-нибудь из вас сможет мне помочь. - person suckerp; 05.07.2019
comment
у меня ошибка: Unable to get the Open property of the Workbooks, я в O365 - person Hasan A Yousef; 07.10.2020

Небольшое расширение отличного сценария VB от ScottF: этот командный файл будет перебирать файлы .xlsx в каталоге и выгружать их в файлы * .csv:

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

Примечание. Вы можете изменить расширение .xlsx на .xls, а имя скрипта ExcelToCSV на XlsToCsv.

person Community    schedule 28.06.2012
comment
@Rieaux: Что касается вашего комментария как редактирования: если это дает файлам двойное расширение, второй простой командный файл может их переименовать. Однако здесь возникает новый вопрос; пожалуйста, попробуйте и, если вы не можете заставить его работать, опубликуйте новый вопрос здесь, на SU. - person ; 01.10.2013
comment
эта автоматизация спасла мне жизнь. :) Спасибо - person Pushker Yadav; 06.08.2015
comment
Я собрал этот ответ вместе с ответом @plang в Gist с простыми инструкциями. См. Скрипт для преобразования файла Excel в CSV. - person 10GritSandpaper; 06.01.2017
comment
@ 10GritSandpaper Использование Excel 2007. Скрипт в вашей ссылке у меня не работал. - person Boris_yo; 18.12.2017
comment
Вы можете изменить %% i.csv на %% ~ ni.csv, чтобы удалить расширение файла .xls в файлах csv. - person Shaohua Li; 19.11.2019
comment
@ 10GritSandpaper Спасатель жизни! ???? Большое спасибо - person eriegz; 30.04.2021

Как насчет 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?

person YOU    schedule 07.12.2009
comment
Похоже, это хороший подход. К сожалению, у меня не получилось. Я не знаком с PowerShell, поэтому, столкнувшись с ошибкой, не знал, что делать. Мне не удалось найти решение для PowerShell: support.microsoft.com/kb/320369 - person Joel; 07.12.2009
comment
Вот несколько советов для PowerShell и Excel: blogs.technet.com/heyscriptingguy/archive/2006/09/08/ - person YOU; 07.12.2009
comment
Я сделал тестовый прогон и тоже столкнулся с проблемами. Одна вещь, с которой я столкнулся, - это трудности с методом $Excel.Workbooks.Open. Не удалось найти указанный файл. Я работал над этим, используя Get-Item в файле и подключая его к циклу ForEach-Object (что я все равно буду делать в своей окончательной реализации) для двух строк, начинающихся с $Workbook. - person Iszi; 03.02.2015
comment
Это устранило эту проблему, но потом я не смог найти полученный YOURDOC.csv - он не находился в той же папке, что и YOUDOC.XLS. Я вернулся к старому и надежному CMD и сделал CD /D C:\ && DIR YOURDOC.csv /s. Оказывается, файл по умолчанию был сохранен в «Мои документы». Итак, вам нужно добавить в сценарий больше, если вы хотите сохранить файл в той же папке, в которой вы работаете (если она отличается от «Мои документы»). - person Iszi; 03.02.2015

Мне нужно было извлечь несколько резюме из разных листов, поэтому вот модифицированная версия кода 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
person Christian Lemer    schedule 10.05.2013

Вот версия, которая будет обрабатывать перетаскивание нескольких файлов из окон. На основании вышеперечисленных работ

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
person Chris Rudd    schedule 22.04.2016
comment
Есть ли способ сделать кодировку UTF-8? - person StuBob; 27.09.2017
comment
Как пропустить запись заголовка в целевой CSV-файл. Я абсолютно не понимаю приведенный выше сценарий, но я использую его в своей автоматизации. Спасибо. - person TharunRaja; 22.11.2017
comment
@TharunRaja Скрипт открывает файл в excel, затем выполняет сохранение в CSV, как если бы вы делали это вручную, только он скрывает его в фоновом режиме. Поскольку сам скрипт не выполняет преобразование, а вы его автоматизируете, я предлагаю вызвать второй скрипт для файлов csv, которые он выводит, и сообщить мне, если вам нужна помощь в создании того, который удаляет первую строку из файл вы его передаете. - person Chris Rudd; 26.11.2017
comment
Лично мне нужна была более мощная версия в PowerShell, которая может правильно обрабатывать даты, может обрабатывать заголовки, которые не находятся в первой строке, и несколько других вещей (она фактически анализирует отдельные ячейки, а не доверяет Excel). Если люди выражают потребность в этом, я опубликую это, но, поскольку на это по существу ответят, и мы будем менять языки, я не хочу публиковать дубликаты. - person Chris Rudd; 14.05.2019

Почему бы не написать свой собственный?

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

Если вы застряли здесь, я уверен, вам помогут.

person Jay Riggs    schedule 07.12.2009
comment
На самом деле я никогда не писал на C #. Но я думаю, что попробую с помощью Excel Data Reader. - person Joel; 07.12.2009
comment
Немного перебор, не правда ли? Запахи NIH. - person Mr. Boy; 17.09.2010
comment
Я не думаю, что Excel Data Reader - это NIH. Прежде всего это написал кто-то другой. Во-вторых, он решил проблему лучше, чем полноценный Excel. - person Justin Dearing; 25.03.2011

Вы можете сделать это с помощью 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 (см. Руководство пользователя для примеров).

person agershun    schedule 21.12.2014
comment
Вау! Alasql действительно мощный. - person Lukasz Wiktor; 29.08.2018
comment
Если вы устанавливаете AlaSQL глобально (npm install alasql -g), вы можете просто использовать ›alasql SELECT ... INTO CSV (...) FROM XLS (...) - person agershun; 30.08.2018

В Windows встроен поставщик данных Excel OLEDB; вы можете использовать это, чтобы «запросить» лист Excel через ADO.NET и записать результаты в файл CSV. Требуется небольшой объем кода, но вам не нужно ничего устанавливать на машину.

person Tim Robinson    schedule 07.12.2009
comment
Недооцененный ответ. Зачем кому-либо устанавливать сторонний файл .DLL, если в Windows есть встроенная функциональность? - person Geoff Griswald; 04.12.2019

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

person Charles Crous    schedule 02.12.2014

:: Для 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
person p4n1    schedule 19.11.2019

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

Это не сработало, скопировалась только одна вкладка (та, которая выделяется, когда я открываю ее через excel).

Кто-нибудь знает о сценарии, который может преобразовать файл Excel с несколькими вкладками в один файл .csv?

person user1132593    schedule 16.03.2012

Создайте на рабочем столе файл 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. Сделанный.

person Arvy    schedule 21.03.2020

Ответ Скотта Ф. - лучшее, что я нашел в Интернете. Я дополнил его код, чтобы удовлетворить свои потребности. Я добавил:

Далее при ошибке возобновить ‹- Чтобы учесть отсутствующие файлы xls в моей пакетной обработке вверху. oBook.Application.Columns ("A: J"). NumberFormat = "@" ‹- перед строкой SaveAs, чтобы убедиться, что мои данные сохранены в текстовом формате, чтобы Excel не удалял начальные нули и исключал запятые в числовых строках в моих данных, то есть (от 1200 до 1200). Диапазон столбцов следует отрегулировать в соответствии с вашими потребностями (A: J).

Я также удалил Echo «готово», чтобы сделать его не интерактивным.

Затем я добавил сценарий в командный файл cmd для ежечасной обработки автоматизированных данных с помощью задачи.

person Jeffrey O    schedule 28.12.2011
comment
Думаю, вам стоит подумать о публикации финальной версии кода с комментариями. - person default locale; 03.11.2012

Все эти ответы помогли мне создать следующий сценарий, который автоматически конвертирует файлы 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
person drzaus    schedule 10.08.2018