Найти тему
Некто

Статья 5. Перенос данных из XLS или XLSX в DBF на VBScript с использованием ADO и нормализация DBF из EXCEL. InputBox.

Создавать файл из XLS и XLSX научились, делать нормализацию тоже, а что дальше?

А дальше надо вводить имя файла в специальном диалоговом окне или еще окне приглашения. Для этого применим функцию InputBox, которое отображает диалоговое окно, в котором пользователь может ввести текст и нажать на кнопку. Файлы EXCEL остаются те же. Предоставляю файл AdoEDA5.vbs

По ходу приложу некоторые комментарии.

Содержание файла AdoED5.vbs

'*******************************************************************

' Имя: AdoED5.vbs

' Язык: VBScript

' Описание: Вывод данных из XLS файла в DBF

' Полностью ODBC для EXCEL и dBase и нормализация DBF из XLS или XLSX '

' и InputBox

'*******************************************************************

'On Error Resume Next 'Проверка ошибок

Set WshShell=WScript.CreateObject("WScript.Shell")

SDefaultDir=WshShell.CurrentDirectory

Set FSO = CreateObject("Scripting.FileSystemObject")

Вот здесь и вставим фрагмент с InputBox

Тем, кому нравится вводить в окне приглашения, посвящается.

Описать механизм работы этого фрагмента можно так. Создается цикл на проверку символьного выражения. И если есть символы, то набор символов в дальнейшем передается как имя файла и покидает тело цикла. Если имя неверно или нет такого файла, то снова появляется окно с приглашением ввести имя файла. Если отпала необходимость ввода имени файла надо нажать Esc или кнопку Отмена и все и все.

' ==== Выбор файла в каталоге в котором Вы находитесь ====

Do until Trim(sFoldFile)<>""

TITLE ="Выбор файла XLS или XLSX"

sFoldFile = InputBox("Каталог" & vbCrLf & SDefaultDir & vbCrLf & vbCrLf & "Введите имя файла",TITLE)

if IsEmpty(sFoldFile) then

MsgBox "Вы нажали Отмена!"

WScript.Quit

end if

if trim(sFoldFile)="" Then

WScript.Echo("Вы не выбрали файл. Выход любая клавиша.")

end if

Loop

NameFil=SDefaultDir & "\" & trim(sFoldFile)

' ==== Выбор файла в каталоге в котором Вы находитесь ====

Если же хотите выбрать файл из любого другого каталога, то наберите

NameFil=trim(sFoldFile)

' ==== Создаваемый DBF ====

NameFilDBF=SDefaultDir & "\_222.dbf"

' ==== Создаваемый Файл ошибок ====

FileTxt=SDefaultDir & "\_FileErr.txt"

'========== Проверка файла

If FSO.FileExists(NameFil) Then

else

MsgBox "Нет файла "&NameFil

WScript.Quit

end if

'========== Проверка файла

'=========== Проверка файла

If FSO.FileExists(FileTxt) Then

FSO.DeleteFile FileTxt

End if

'========== Проверка файла

'=========== Проверка файла

If FSO.FileExists(NameFilDBF) Then

FSO.DeleteFile NameFilDBF

End if

'========== Проверка файла

Set RSN=WScript.CreateObject("ADODB.Recordset")

Set conn = CreateObject("ADODB.Connection")

SConnect="Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & SDefaultDir & ";"

Set cnnMain = CreateObject("ADODB.Connection")

cnnMain.CursorLocation = 3

cnnMain.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & NameFil & ";"

set tables = cnnMain.OpenSchema(20)

do until tables.eof

ImList=tables("TABLE_NAME")

tables.movenext

loop

strSQLn="SELECT * FROM [" & ImList & "]"

Set RS = cnnMain.Execute(strSQLn)

KlFieldsN = RS.Fields.count 'Количество колонок в XLS, XLSX файле

KlRecsN=RS.RecordCount 'Количество строк в XLS, XLSX файле

'=================== Максимальное поле ==========

On Error Resume Next 'Проверка ошибок

ReDim MassDL(KlFieldsN-1)

for i=0 to KlFieldsN-1

st=RS.Fields(i).Name

strSQLnn="SELECT Max(Len(Trim(" & st & "))) FROM [" & ImList & "]"

set RSQQ = cnnMain.Execute(strSQLnn)

'v=RSQQ.Fields(0).Value

v=RSQQ.GetString

if v="" then

v=254

end if

if v=0 then

v=9

end if

' Запасной вариант

'if IsEmpty(v) then

' v=9

' end if

'if IsNull(v) then

' v=9

'end if

'if v="" then

' v=254

'end if

'if v=0 then

' v=9

'end if

MassDL(i)=v

'wscript.echo("i=" & i & " st=" & st & " v=" & MassDL(i))

v=""

next

On Error goto 0

v=0

RSQQ.Close

Set RSQQ = Nothing

'=================== Максимальное поле ==========

' ==============Ввод названий Полей базы данных

SQL="create table " & NameFilDBF & "("

for i=0 to KlFieldsN-1

st=RS.Fields(i).Name

stDL=MassDL(i)

if i=KlFieldsN-1 then

SQL=SQL & "st" & i & " char(" & stDL & "))"

else

SQL=SQL & "st" & i & " char(" & stDL & "),"

end if

next

' ==============Ввод названий Полей базы данных

conn.Open SConnect

RSN.open SQL,conn,3

' ======== Кодировка 866 ======= Этот фрагмент можно здесь убрать и поставить 1251

Set oFile = FSO.GetFile(NameFilDBF)

With oFile.OpenAsTextStream()

readBinary = .Read(oFile.Size)

.Close

End With

readBinary=left(readBinary,29)+"e"+mid(readBinary,31)

With FSO.createTextFile(NameFilDBF)

.Write(readBinary)

.Close

End With

' ======== Кодировка 866 =======

On Error Resume Next 'Проверка ошибок

iuu=0 'Признак записи в текстовый файл

ikk=0 'Запись строки Строки ошибок

for i=1 to KlRecsN

vvv="'"

for j=0 to KlFieldsN-1

st=RS.Fields(j)

if j=KlFieldsN-1 then

vvv=vvv & st & "'"

else

vvv=vvv & st & "'" & "," & "'"

end if

next

SQL="insert into " & NameFilDBF & " values(" & vvv & ")"

RSN.open SQL,conn,3

'11111111111111111111 Обработка ошибок 1111111111111111111

iu=0

If Err.Number <> 0 Then

iu=1

ikk=ikk+1

End If

if iu=1 then

iuu=i

Const ForWriting = 2

Set FOut = FSO.OpenTextFile(FileTxt,ForWriting,true)

if ikk=1 then

FOut.WriteLine "Строки ошибок"

end if

FOut.WriteLine (iuu)

end if

'11111111111111111111 Обработка ошибок 1111111111111111111

RS.MoveNext

next

if iuu>0 then

FOut.WriteLine "Ошибок " & iuu

FOut.Close

FOut.Nothing

end if

ikk=0

iuu=0

iu=0

' Можно указать i,j,KlRecsN и другие переменные А можно все это не указывать

Set WshShell=Nothing

Set FSO = Nothing

Set oFile=Nothing

set tables=Nothing

cnnMain.Close

Set cnnMain = Nothing

RSQ.close

Set RSQ = Nothing

RSN.close

Set RSN = Nothing

conn.close

Set conn = Nothing

if iuu>0 then

WScript.Echo("Проверьте журнал ошибок _FileErr.txt. Файл создан " & NameFilDBF & " Создан!")

else

WScript.Echo("Файл создан!")

end if

WScript.Quit

'*******************************************************************

Если в файле XLS или XLS есть заголовки с пробелами , то нормализация из этих файлов не пройдет и потому надо пользоваться нормализацией из DBF. Этот фрагмент

' ==== Выбор файла в каталоге в котором Вы находитесь ====

Do until Trim(sFoldFile)<>""

TITLE ="Выбор файла XLS или XLSX"

sFoldFile = InputBox("Каталог" & vbCrLf & SDefaultDir & vbCrLf & vbCrLf & "Введите имя файла",TITLE)

if IsEmpty(sFoldFile) then

MsgBox "Вы нажали Отмена!"

WScript.Quit

end if

if trim(sFoldFile)="" Then

WScript.Echo("Вы не выбрали файл. Выход любая клавиша.")

end if

Loop

NameFil=SDefaultDir & "\" & trim(sFoldFile)

'NameFil=trim(sFoldFile)

' ==== Выбор файла в каталоге в котором Вы находитесь ====

надо вставить в файл AdoED3B.vbs но перед этим убрать

Set objArgs=WScript.Arguments

if objArgs.Count>0 then

fileVvod=objArgs(0)

else

WScript.Echo "Введите имя файла XLS или XLSX после AdoED3B.vbs"

WScript.Quit

end if

и

' ==== Ввод файла EXCEL через строку данные которого надо перевести в создаваемый во время процесса файл dbf ====

Set NameFil = FSO.GetFile(fileVvod)

Теперь можете просмотреть с помощью WDBFVIEW.EXE созданный dbf файл (_222.dbf) кому это просто захочется. В следующей статье я опишу другие действия с помощью VBScript .

Файл можно редактировать, а также переделать на JScript.

Ссылка на файл https://disk.yandex.ru/d/o-JD28DBcPzV1Q