Преобразование 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.

ScottF
источник
20
Если кому-то интересно, параметр 6 в функции oBook.SaveAs является константой для формата CSV.
ScottF
Прекрасно работает, и не только для файлов xls, но и xlsx. Как сказал Эндрю, пути к файлам должны быть либо абсолютными, либо в каталоге «данных» пользователя (я не уверен, каково точное имя на английском языке). Я до сих пор не понял, как это решить, я не очень много пишу 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

Я переименовал скрипт в ExcelToCsv, так как этот скрипт вообще не ограничивается xls. xlsx Работает нормально, как и следовало ожидать.

Протестировано с Office 2010.

удар
источник
Я использую это (с небольшими изменениями) для преобразования из XML в XLS. Однако я не хочу, чтобы во время этого преобразования в Excel появлялось окно с предупреждением о совместимости. Вы знаете, как отключить это предупреждение?
jpnavarini 08
Есть ли способ сохранить этот файл как набор символов Unicode?
rjv
2
Я поместил этот ответ вместе с ответом @ user565869 в Gist с простыми инструкциями. См .: Скрипт для преобразования файла Excel в CSV
10GritSandpaper
1
Приятно собрать @ 10GritSandpaper
amrrs
Есть ли способ использовать; в качестве разделителя вместо,? Я попытался изменить oBook.SaveAs dest_file, csv_format, Local: = True, но я получаю сообщение об ошибке, что оператор ожидается после: Когда я добавил, «Local: = True» больше нет ошибок, но все равно используется, вместо; как разделитель. Может быть, кто-нибудь из вас сможет мне помочь.
suckerp 05
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.
эта автоматизация спасла мне жизнь. :) Спасибо
Пушкер Ядав 06
1
Я собрал этот ответ вместе с ответом @plang в Gist с простыми инструкциями. См .: Скрипт для преобразования файла 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: support.microsoft.com/kb/320369
Джоэл,
Вот несколько советов для powershell и excel, blogs.technet.com/heyscriptingguy/archive/2006/09/08/…
ВЫ,
Я провел тестовый прогон и тоже столкнулся с проблемами. Одна вещь, с которой я столкнулся, - это трудности с этим $Excel.Workbooks.Openметодом. Не удалось найти указанный файл. Я работал над этим, используя Get-Itemфайл и подключая его к ForEach-Objectциклу (что я все равно сделаю в своей окончательной реализации) для двух строк, начинающихся с $Workbook.
Iszi 03
Это устранило эту проблему, но потом я не смог найти получившийся «YOURDOC.csv» - он не находился в той же папке, что и «YOUDOC.XLS». Я вернулся к старому и надежному CMD и сделал CD /D C:\ && DIR YOURDOC.csv /s. Оказывается, файл был сохранен в Мои документы по умолчанию. Итак, вам нужно добавить в сценарий больше, если вы хотите сохранить файл в той же папке, в которой вы работаете (если она отличается от «Мои документы»).
Iszi 03
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

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

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?
Стубоб
Как пропустить запись заголовка в целевой CSV-файл. Я абсолютно не понимаю приведенный выше сценарий, но я использую его в своей автоматизации. Спасибо.
TharunRaja
@TharunRaja Скрипт открывает файл в excel, затем выполняет «сохранить как» в CSV, как если бы вы делали это вручную, но скрывает его в фоновом режиме. Поскольку сам скрипт не выполняет преобразование, а вы его автоматизируете, я предлагаю вызвать второй скрипт для файлов csv, которые он выводит, и сообщить мне, если вам нужна помощь в создании того, который удаляет первую строку из файл вы передаете.
Крис Радд
Лично мне нужна была более мощная версия в PowerShell, которая может правильно обрабатывать даты, может обрабатывать заголовки, которые не находятся в первой строке, и еще несколько вещей (она фактически анализирует отдельные ячейки, а не доверяет Excel). Если люди выражают потребность в этом, я опубликую его, но, поскольку на этот вопрос есть ответ, и мы будем менять языки, я не хочу публиковать дубликаты.
Крис Радд
5

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

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

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

Джей Риггз
источник
На самом деле я никогда не писал на C #. Но я думаю, что попробую с помощью Excel Data Reader.
Джоэл
3
Немного перебор, не правда ли? Запахи NIH.
Мистер Бой
1
Я не думаю, что Excel Data Reader - это NIH. Прежде всего это написал кто-то другой. Во-вторых, он решил проблему лучше, чем полноценный Excel.
Джастин Диринг,
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 ( примеры см. В Руководстве пользователя ).

Agershun
источник
1
Вот Это Да! Alasql действительно мощный.
Лукаш Виктор
Если вы устанавливаете AlaSQL глобально (npm install alasql -g), вы можете просто использовать> alasql «SELECT ... INTO CSV (...) FROM XLS (...)»
Agershun
2

В Windows встроен поставщик данных Excel OLEDB; вы можете использовать это, чтобы «запросить» лист 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?

user1132593
источник
0

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

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

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

Затем я добавил сценарий в командный файл 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
Drzaus
источник
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
p4n1
источник
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. Готово.

Арви
источник