Как я мог преобразовать файл XLS в файл CSV в командной строке Windows.
На машине установлен Microsoft Office 2000. Я готов установить OpenOffice, если это невозможно с помощью Microsoft Office.
Как я мог преобразовать файл XLS в файл CSV в командной строке Windows.
На машине установлен Microsoft Office 2000. Я готов установить OpenOffice, если это невозможно с помощью Microsoft Office.
Откройте Блокнот, создайте файл с именем 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.
oExcel.Workbooks.Open
с желаемым индексом рабочего листа (начинается с 1): oBook.Worksheets(1).Activate
- person humbads; 30.10.2013
Слегка измененная версия ответа 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.
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.
Как насчет 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?
$Excel.Workbooks.Open
. Не удалось найти указанный файл. Я работал над этим, используя Get-Item
в файле и подключая его к циклу ForEach-Object
(что я все равно буду делать в своей окончательной реализации) для двух строк, начинающихся с $Workbook
.
- person Iszi; 03.02.2015
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
Вот версия, которая будет обрабатывать перетаскивание нескольких файлов из окон. На основании вышеперечисленных работ
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
Почему бы не написать свой собственный?
Я вижу из вашего профиля, что у вас есть хоть какой-то опыт работы с C # /. NET. Я бы создал консольное приложение Windows и использовал бы бесплатную программу чтения Excel для чтения ваших файлов Excel. Я без проблем использовал Excel Data Reader, доступный на CodePlex (одна приятная вещь: для этого ридера не требуется Excel для установки). Вы можете вызвать консольное приложение из командной строки.
Если вы застряли здесь, я уверен, вам помогут.
Вы можете сделать это с помощью 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 (см. Руководство пользователя для примеров).
В Windows встроен поставщик данных Excel OLEDB; вы можете использовать это, чтобы «запросить» лист Excel через ADO.NET и записать результаты в файл CSV. Требуется небольшой объем кода, но вам не нужно ничего устанавливать на машину.
Основываясь на том, что предоставил Jon of All Trades, следующее (~ n) устранило досадную проблему двойного расширения: FOR /f "delims=" %%i IN ('DIR *.xlsx /b') DO ExcelToCSV.vbs "%%i" "%%~ni.csv"
:: Для 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
Я попробовал решение ScottF VB и заставил его работать. Однако я хотел преобразовать файл Excel с несколькими вкладками (книгу) в один файл .csv.
Это не сработало, скопировалась только одна вкладка (та, которая выделяется, когда я открываю ее через excel).
Кто-нибудь знает о сценарии, который может преобразовать файл Excel с несколькими вкладками в один файл .csv?
Создайте на рабочем столе файл 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. Сделанный.
Ответ Скотта Ф. - лучшее, что я нашел в Интернете. Я дополнил его код, чтобы удовлетворить свои потребности. Я добавил:
Далее при ошибке возобновить ‹- Чтобы учесть отсутствующие файлы xls в моей пакетной обработке вверху. oBook.Application.Columns ("A: J"). NumberFormat = "@" ‹- перед строкой SaveAs, чтобы убедиться, что мои данные сохранены в текстовом формате, чтобы Excel не удалял начальные нули и исключал запятые в числовых строках в моих данных, то есть (от 1200 до 1200). Диапазон столбцов следует отрегулировать в соответствии с вашими потребностями (A: J).
Я также удалил Echo «готово», чтобы сделать его не интерактивным.
Затем я добавил сценарий в командный файл cmd для ежечасной обработки автоматизированных данных с помощью задачи.
Все эти ответы помогли мне создать следующий сценарий, который автоматически конвертирует файлы 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