2012-02-09 4 views
2

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

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" 

ответ

9

Вы можете сохранить исходный скрипт, необходимо указать параметр, указывающий местную настройку. Это сохраняет мой 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" 
0

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

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 
+0

Это не является последовательным решением, поскольку он также заменит запятая в литералах: «Джон Доу, евро», «1,234.00», «разрешит« Джон Доу, евро »,« 1, 234,00 », вероятно, не то, что хочет пользователь. – AutomatedChaos

+0

Очевидно, что если это тип данных, это не поможет. Когда я разместил это, не было других ответов, поэтому я просто предлагал некоторые ответы. –

+1

Конечно. И если пользователь имеет только ограниченный набор данных без запятой, он будет работать нормально. Однако преобразование данных в правильный CSV-файл является амбициозным. Даже Microsoft не справляется с определением формата [rfc4180] (http://tools.ietf.org/html/rfc4180). – AutomatedChaos

1

Использование запятой в текстовых файлах с разделителями находит свои корни в региональных настройках. В то время как запятая стандартная в США, другие страны, такие как Германия, используют точку с запятой. Вы можете изменить значение разделителя списков в региональных и языковых настройках, а затем выбрать 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 
+0

Спасибо!Тем не менее, я изменил разделитель на моем компьютере в панели управления на точку с запятой, но когда VBScript работает, он использует запятую в качестве разделителя, что является странным, потому что когда я сохраняю как в Excel, он отделяется точкой с запятой. Кажется, что это делается точно так же, как в командной строке, а не при нажатии и изменении настроек на панели управления. Но я попробую этот сценарий и дам вам знать результаты. –

+0

Да, я получил тот же результат. Он был разделен запятыми. Я на школьном компьютере и, возможно, он не позволит мне редактировать ключи реестра? Я попробую, когда я нахожусь на своем домашнем компьютере. Я надеюсь, что это и есть причина. Я дам вам знать свои результаты дома. –

+0

Люк, я понял проблему и разместил в своем ответе новый код. Это должно сработать для вас. – Nilpo

1

функция SaveAs определяется так: .SaveAs (FileName, FileFormat, Пароль, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, Конфликтные, AddToMru, TextCodepage, TextVisualLayout, местные)

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

ExcelObj.Workbooks (1) .SaveAs csvFile, 6 ,,,,,,,,,, Правда

+0

спасибо, но мне больше не нужен этот код. Большое вам спасибо. –

+0

Лучший ответ здесь ... Единственная вещь, о которой вы должны помнить, - это ваша версия Excel True в позиции 12 работает для Excel 2013 Для Excel 2010 это на 2 аргумента меньше, чем на позиции 10 Также можно проверить: http : //msdn.microsoft.com/en-us/library/office/microsoft.office.interop.excel.dialogsheet.saveas.aspx в этом контексте ... – WD11

Смежные вопросы