Использование запятой в текстовых файлах с разделителями находит свои корни в региональных настройках. В то время как запятая стандартная в США, другие страны, такие как Германия, используют точку с запятой. Вы можете изменить значение разделителя списков в региональных и языковых настройках, а затем выбрать CSV (с разделителями-запятой) (.csv) в окне Excel As. Полученный файл будет разделен на любое значение в системных настройках. Этот скрипт изменяет настройку разделителя по умолчанию. Затем он открывает указанную таблицу и сохраняет ее. Перед завершением он возвращает настройки системы до своего предыдущего значения.
Он принимает два параметра командной строки. Первая - это электронная таблица ввода; второй - это имя выходного файла для экспортируемого файла.
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
Это не является последовательным решением, поскольку он также заменит запятая в литералах: «Джон Доу, евро», «1,234.00», «разрешит« Джон Доу, евро »,« 1, 234,00 », вероятно, не то, что хочет пользователь. – AutomatedChaos
Очевидно, что если это тип данных, это не поможет. Когда я разместил это, не было других ответов, поэтому я просто предлагал некоторые ответы. –
Конечно. И если пользователь имеет только ограниченный набор данных без запятой, он будет работать нормально. Однако преобразование данных в правильный CSV-файл является амбициозным. Даже Microsoft не справляется с определением формата [rfc4180] (http://tools.ietf.org/html/rfc4180). – AutomatedChaos