Преобразование xls в csv с использованием VBScript и разделение точкой с запятой - PullRequest
3 голосов
/ 09 февраля 2012

У меня есть фрагмент кода 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"

Ответы [ 4 ]

11 голосов
/ 10 мая 2012

Вы можете сохранить свой оригинальный скрипт, нужно только указать параметр, указывающий, что должны применяться локальные настройкиЭто сохраняет мой 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" 
1 голос
/ 09 января 2013

Функция SaveAs определяется так: .SaveAs (FileName, FileFormat, Пароль, WriteResPassword, ReadOnlyRecommended, Создать резервную копию, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)

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

ExcelObj. Рабочие книги (1). Сохранить как csvFile, 6 ,,,,,,,,,, True

1 голос
/ 11 февраля 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
0 голосов
/ 10 февраля 2012

Вы можете снова открыть файл с помощью объекта 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
...