Как я мог преобразовать файл 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
Слегка измененная версия ответа 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.
Небольшое расширение отличного сценария 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
.
CD /D C:\ && DIR YOURDOC.csv /s
. Оказывается, файл был сохранен в Мои документы по умолчанию. Итак, вам нужно добавить в сценарий больше, если вы хотите сохранить файл в той же папке, в которой вы работаете (если она отличается от «Мои документы»).
Мне нужно было извлечь несколько резюме из разных листов, поэтому вот модифицированная версия кода 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, доступную на 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"
Я попробовал решение ScottF VB и заставил его работать. Однако я хотел преобразовать файл Excel с несколькими вкладками (книгу) в один файл .csv.
Это не сработало, скопировалась только одна вкладка (та, которая выделяется, когда я открываю ее через excel).
Кто-нибудь знает о сценарии, который может преобразовать файл Excel с несколькими вкладками в один файл .csv?
Ответ Скотта Ф. - лучшее, что я нашел в Интернете. Я добавил в его код, чтобы удовлетворить свои потребности. Я добавил:
On Error Resume Next <- Чтобы учесть отсутствующие файлы xls в моей пакетной обработке вверху. oBook.Application.Columns ("A: J"). NumberFormat = "@" <- Перед строкой SaveAs, чтобы убедиться, что мои данные сохранены в формате текста, чтобы Excel не и запятые в числовых строках в моих данных т.е. (от 1200 до 1200). Диапазон столбцов следует отрегулировать в соответствии с вашими потребностями (A: J).
Я также удалил Echo «готово», чтобы сделать его не интерактивным.
Затем я добавил сценарий в командный файл cmd для ежечасной обработки автоматизированных данных с помощью задачи.
Все эти ответы помогли мне создать следующий скрипт, который автоматически конвертирует файлы 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
:: Для 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
Создайте на рабочем столе файл 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. Готово.