Преобразование xls в csv с использованием VBScript и разделение точкой с запятой

У меня есть фрагмент кода VBScript, который преобразует мои файлы xls и xlsx в файлы csv. Однако я хочу, чтобы каждая ячейка была разделена точкой с запятой, а не запятой. На моем компьютере разделитель списка установлен на точку с запятой вместо запятой, поэтому, когда я открываю окно Excel и сохраняю как csv, он разделяется точкой с запятой. Однако мой VBScript создает файл csv, разделенный запятыми. Я нашел фрагмент кода в Интернете, так как я не очень хорошо знаю VBScript (в основном я программист на Java). Как я могу изменить фрагмент кода, чтобы разделить CSV-файлы точкой с запятой, а не запятой?

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"

person Luke Mat    schedule 09.02.2012    source источник


Ответы (5)


вы можете сохранить исходный сценарий, нужно только указать параметр, указывающий, что должны применяться локальные настройки. Это сохраняет мой CSV с ; разделитель

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") 
oExcel.DisplayAlerts = FALSE 'to avoid prompts
Dim oBook, local
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))
local = true 
call oBook.SaveAs(WScript.Arguments.Item(1), 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, local) 'this changed
oBook.Close False 
oExcel.Quit 
WScript.Echo "Done" 
person peter    schedule 10.05.2012

Использование запятой в текстовых файлах с разделителями связано с региональными настройками. В то время как запятая является стандартной в США, в других странах, таких как Германия, вместо нее используется точка с запятой. Вы можете изменить значение разделителя списка в региональных и языковых настройках, а затем выбрать CSV (с разделителями-запятыми) (.csv) в окне Excel «Сохранить как». Полученный файл будет разделен любым значением в настройках системы. Этот сценарий изменяет настройку разделителя списка по умолчанию. Затем он открывает указанную электронную таблицу и повторно сохраняет ее. Он возвращает системную настройку к ее предыдущему значению перед завершением.

Он принимает два параметра командной строки. Первая — входная электронная таблица; второй — имя выходного файла для экспортируемого файла.

strDelimiter = ";"

strSystemDelimiter = ""           ' This will be used to store the current sytem value
Const HKEY_CURRENT_USER = &H80000001

' Get the current List Separator (Regional Settings) from the registry
strKeyPath = "Control Panel\International"
strValueName = "sList"
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
objRegistry.GetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter

' Set it temporarily to our custom delimiter
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strDelimiter

' Open spreadsheet with Excel and save it in a text delimited format
Const xlCSV = 6

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open(WScript.Arguments.Item(0))
objWorkbook.SaveAs WScript.Arguments.Item(1), xlCSV
objWorkbook.Close vbFalse         ' Prevent duplicate Save dialog
objExcel.Quit

' Reset the system setting to its original value
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter

После некоторого тестирования кажется, что это работает только через диалоговое окно Excel «Сохранить как», а не через командную строку или автоматизацию. Я немного изменил сценарий, чтобы сделать окно Excel видимым и использовать сочетания клавиш для открытия диалогового окна «Сохранить как» через интерфейс Excel. Это должно сработать. У меня это сработало на Vista x64 с Excel 2007. Надеюсь, это сработает и у вас.

strDelimiter = ";"

strSystemDelimiter = ""           ' This will be used to store the current sytem value
Const HKEY_CURRENT_USER = &H80000001

' Get the current List Separator (Regional Settings) from the registry
strKeyPath = "Control Panel\International"
strValueName = "sList"
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
objRegistry.GetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter

' Set it temporarily to our custom delimiter
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strDelimiter

' Open spreadsheet with Excel and save it in a text delimited format
Const xlCSV = 6

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = vbTrue
Set objWorkbook = objExcel.Workbooks.Open(WScript.Arguments.Item(0))

WScript.Sleep 500                 ' Delay to make sure the Excel workbook is open
strWorkbookName = objExcel.ActiveWorkbook.Name
strTitlebar = strWorkbookName
Set WshShell = CreateObject("WScript.Shell")
WshShell.AppActivate strTitlebar  ' Make the workbook active so it receives the keystrokes
WshShell.SendKeys "%fa"           ' Keyboard shortcuts for the Save As dialog
WScript.Sleep 500
WshShell.SendKeys "%tc{ENTER}"    ' Change the Save As type to CSV
If WScript.Arguments.Count > 1 Then
    WshShell.SendKeys "+{TAB}" & WScript.Arguments.Item(1)
    WScript.Sleep 500
End If                            ' This If block changes the save name if one was provided
WshShell.SendKeys "{ENTER}"       ' Save the file
WScript.Sleep 500
WshShell.SendKeys "{ENTER}"       ' Dismiss the CSV warning dialog
Set WshShell = Nothing

objWorkbook.Close vbFalse         ' Prevent duplicate Save dialog
objExcel.Quit

' Reset the system setting to its original value
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter
person Nilpo    schedule 11.02.2012
comment
Спасибо! Однако я изменил разделитель на своем компьютере в панели управления на точку с запятой, но когда VBScript запускается, он использует запятую в качестве разделителя, что странно, потому что, когда я сохраняю как в Excel, он разделяется точкой с запятой. Кажется, это делает то же самое только из командной строки вместо того, чтобы щелкать и изменять настройки на панели управления. Но я попробую этот скрипт и сообщу вам о результатах. - person Luke Mat; 15.02.2012
comment
Да у меня такой же результат. Оно было разделено запятыми. Я на школьном компьютере, и, может быть, он не позволит мне редактировать ключи реестра? Попробую, когда буду на домашнем компе. Я надеюсь, что причина в этом. Дома сообщу о результатах. - person Luke Mat; 15.02.2012
comment
Люк, я понял проблему и опубликовал новый код в своем ответе. Это должно сработать для вас. - person Nilpo; 16.02.2012
comment
Это тоже не работает. Файл excel открывается, но затем код пытается использовать команду fatc в cmd и говорит, что это не распознано как внутренняя или пакетная команда, исполняемая программа или пакетный файл. Обычное сообщение об ошибке для неверной команды. И окно excel тоже закрывается. Я не уверен, почему эта ошибка происходит. Однако это решение может не сработать для меня, потому что кажется, что окно Excel откроется для каждого файла Excel, который я пытаюсь преобразовать, что является проблемой, потому что я буду использовать это для преобразования около 700 файлов Excel одновременно. .. это много окон Excel. - person Luke Mat; 17.02.2012
comment
Люк, какую версию Windows и Excel вы используете? Кажется, что он не активирует окно Excel. Вместо этого нажатия клавиш отправляются в активные в данный момент окна, которые являются командной оболочкой. Кроме того, он будет открывать файлы последовательно, поэтому у вас не должно быть одновременно открыто 700 окон Excel. - person Nilpo; 17.02.2012
comment
Windows 7 Professional и Mircosoft Office Excel 2007. И я знаю, что они не будут открываться сразу, но я бы хотел, чтобы это произошло без открытия окон Excel вообще. Но когда открывается каждое окно, мне нужно щелкнуть csv и указать ему имя, местоположение и все такое вручную? - person Luke Mat; 23.02.2012
comment
@LukeMat Это было бы невозможно сделать без открытия Excel вообще. Вы не можете использовать программу, которая не запущена. Что касается именования, то это все делается автоматически. - person Nilpo; 24.02.2012

Функция SaveAs определяется следующим образом:

То есть использовать точку с запятой (если ваш региональный язык установлен правильно)

ExcelObj.Workbooks(1).SaveAs csvFile, 6,,,,,,,,,,, True

person Martin    schedule 09.01.2013
comment
спасибо, но мне больше не нужен этот код. спасибо большое однако. - person Luke Mat; 12.01.2013
comment
Лучший ответ здесь ... Единственное, на что вам нужно обратить внимание, это ваша версия Excel. True на позиции 12 работает для Excel 2013. Для Excel 2010 это на 2 аргумента меньше, поэтому на позиции 10. Также можно проверить: msdn.microsoft.com/en-us/library/ office/ в этом контексте... - person GWD; 21.10.2013

Вы можете снова открыть файл с объектом FSO, а затем выполнить Replace() для символа запятой.

Const OpenAsDefault = -2
Const FailIfNotExist = 0
Const ForReading = 1
Const ForWriting = 2

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set fCSVFile = _
  oFSO.OpenTextFile("C:\path\file.csv", ForReading, FailIfNotExist, OpenAsDefault)

sFileContents = fCSVFile.ReadAll
fCSVFile.Close
sFileContents = Replace(sFileContents, ",",";"))

Set fCSVFile = oFSO.OpenTextFile("C:\path\file.csv", ForWriting, True)
fCSVFile.Write(sFileContents)
fCSVFile.Close
person Nathan Rice    schedule 10.02.2012
comment
Это непоследовательное решение, потому что оно также заменяет запятые в литералах: John Doe,Euro,"1,234.00" преобразуется в John Doe;Euro;"1;234.00", что, вероятно, не то, что хочет пользователь. - person AutomatedChaos; 13.02.2012
comment
Очевидно, что если это тип данных, это не будет полезно. Когда я опубликовал это, других ответов не было, поэтому я просто предлагал какой-то ответ. - person Nathan Rice; 13.02.2012
comment
Конечно. И если у пользователя есть только ограниченный набор данных без запятых, это сработает нормально. Однако преобразование данных в правильный файл CSV неоднозначно. Даже Microsoft не поспевает за определением формата rfc4180. - person AutomatedChaos; 13.02.2012
comment
Да, в файлах будут деньги, поэтому я хочу разделить их точкой с запятой вместо запятой. Если бы я не имел дело с деньгами, я бы остановился на запятых. Но спасибо за попытку помочь, я ценю это. - person Luke Mat; 15.02.2012

Я изменил параметр на true, и у меня сработало.

if WScript.Arguments.Count < 2 Then
    WScript.Echo "Erro! Especifique origem e destino. Exemplo: 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))
call oBook.SaveAs(WScript.Arguments.Item(1), 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, true) --CHANGED
oBook.Close False
oExcel.Quit
person Rubens Wuensch    schedule 17.09.2019