Начнем с того что такое ODBC и ADO Вы можете посмотреть в ИНТЕРНЕТе и я не буду здесь это описывать. Могу только уточнить, что ODBC бывает разных версий и где то строка подключения может выглядеть по-другому.
Но приступим к рассмотрению примера создания dbf файла из XLS, XLSX
Для начала уточним, для чего эта статья нужна. Сейчас MS office не создают dbf файлы. В новых его версиях нет этого решения. В свое время даже в среде ACCESS можно было создать dbf формат до 13 версии MS office. Можно конечно внедрить это решение с помощью специальных дополнений, но стоит ли. Как это сделать, также описано в ИНТЕРНЕТе. Это на Ваше усмотрение. Но если у Вас нет office, приходятся пользоваться другими программами, которые могут быть платными, хотя делают небольшое решение в этом направлении. Я не буду их перечислять, да и нет надобности в этом. Но по мере продвижения новых версий этот формат был выведен из работы. Многие программы работают с dbf форматом. Сказать, что это самый лучший формат для работы не всегда можно это отметить. Но то, что он уже зарекомендовал как удобный формат для структурирования записей и работы с базами можно. Рассмотрим создание dbf файла на VBScript. Почему так. Если кто уже работал с VBScript, может это понять. Из-за этого не будем описывать все достоинства и недостатки VBScript, просто вот для меня он очень удобен для создания маленьких и емких программ, с помощью которых легко показать работу в самой операционной системе. У каждого есть свои предпочтения, и я не собираюсь их пересматривать. Можно также приспособить и JScript, но суть остается та же. Я уверен, что есть, кто работает на этих языках, но не все хотят выполнять более-менее крупные задачи. Все о VBScript и JScript можете найти и почитать в ИНТЕРНЕТе. Сейчас этого материала предостаточно чтобы представить, что это такое.
Тогда приступим. Значит, нам надо перевести файл XLS или XLSX в dbf с помощью VBScript.
Для начала я создал простенький XLS и XLSX файлы. Можете создать свой файл. Необязательно он должен быть большим. Это для удобства понять, как работает VBScript.
Создаем скрипт VBScript с названием файла AdoED1.vbs
Почему AdoED1.vbs 1- это 1-ый файл, который создадим.
Можете имя этого файла назвать по-своему.
'*******************************************************************
' Имя: AdoED1.vbs
' Язык: VBScript
' Описание: Вывод данных из XLS или XLSX файла в DBF
' Полностью ODBC для EXCEL и dBase, ADO через DefinedSize
'*******************************************************************
Что такое DefinedSize прочитаете в ИНТЕРНЕТе
Есть еще и ActualSize, Тоже прочитайте в ИНТЕРНЕТе.
Чем они отличаются, будет понятно.
Дальше
Set WshShell=WScript.CreateObject("WScript.Shell")
SDefaultDir=WshShell.CurrentDirectory
Set FSO = CreateObject("Scripting.FileSystemObject")
Здесь в основе лежит понятие работы VBScript с файлами и определение директории (папки) откуда будем запускать этот VBScript и где находятся и создаются наши файл(ы) XLS, XLSX и dbf
Как и в других VBScript можно явно указать переменные с помощью DIM и сопровождать их с помощью Option Explicit, но я не стал этого делать. Про объявление переменных также можно почитать в ИНТЕРНЕТе и принять свое решение. Полезно также почитать про все команды и функции VBScript. Что такое Set также прочитайте в ИНТЕРНЕТе. Кому доступны понятия классы и объекты это поймет, а кому это не надо просто следите за ходом пояснения.
Введем файл XLS или XLSX, который хотим перевести в dbf
NameFil=SDefaultDir & "\_111.xls" или XLSX
Можете указать свой файл.
Введем файл dbf, в который будем переводить данные из XLS или XLSX
NameFilDBF=SDefaultDir & "\_222.dbf"
Также можете назначить другое имя файлу dbf
Файл _222.dbf автоматически создается во время процесса работы скрипта.
Теперь надо выявить и указать ошибки, которые могут быть возникнуть в процессе переноса данных из XLS или XLSX в dbf и если они возникнут.
Для этого также введем файл ошибок, который будет создаваться автоматически.
Для чего этот файл нужен. Он покажет строки XLS или XLSX, которые не попали в dbf файл и которые надо тщательно проанализировать, почему они не попали и отработать их, если эти данные необходимы. Почему этот файл будет указан, вроде бы он создается автоматически. Перед запуском VBScript он удаляется и если перенос данных осуществляется без ошибок, он просто не появится.
Запишем его в скрипт
FileTxt=SDefaultDir & "\_FileErr.txt"
Дальше.
Происходит проверка файла EXCEL на его наличие и присутствие в каталоге, из которого мы запускаемся.
'========== Проверка файла
If FSO.FileExists(NameFil) Then
else
MsgBox "Нет файла "&NameFil
WScript.Quit
end if
'========== Проверка файла
Дальше.
Происходит проверка файла dbf на его наличие и присутствие в каталоге, из которого мы запускаемся и удаление. Почему удаление. Если файл XLS или XLSX необходим, и он проверяется на его присутствие в каталоге, из которого запускается скрипт, то файл dbf создается и поэтому для его создания заново программа должна его удалить.
Поэтому
'=========== Проверка файла и удаление файла dbf
If FSO.FileExists(NameFilDBF) Then
'Файл есть! Удаляем
FSO.DeleteFile NameFilDBF
End if
'========== Проверка файла
'=========== Проверка файла и удаление файла TXT
If FSO.FileExists(FileTxt) Then
'Файл есть! Удаляем
FSO.DeleteFile FileTxt
End if
'========== Проверка файла
Если не удалять файлы dbf они не самоперезапишутся а будут добавлять данные заново.
Если кому то это необходимо, можно менять только файлы XLS или XLSX, но только с такими же полями. Если не отменить файл ошибок, то он тоже покажет, что есть ошибки.
Вот здесь большое значение имеет команда
On Error Resume Next 'Проверка ошибок
Если эту команду убрать или сделать ее не действительной с помощью символа`, то появится окно ошибка с предупреждением, таблица dbf уже существует, и на этом работа скрипта прекратиться. Поэтому нужно знать, что хотите сделать и для чего это нужно. Если хотите добавить в файл другие данные и с этими полями, то в начале, можно поставить эту команду On Error Resume Next - Проверка ошибок
Можно также отключить запись в файл ошибок. Тогда информация накапливаться по ошибкам не будет. Она будет постоянной. Если же файл XLS или XLSX большой в объеме (размер), то можно совсем убрать обработку ошибок в файле. Это тоже затрата времени – запись ошибок. Но если же хотите все-таки узнать про ошибки, придется ждать до конца переноса и записи данных. Файлы dbf и txt можно удалять, если XLS и XLSX небольшие. Они создадутся скриптом заново. Если же XLS или XLSX большие и информация в создаваемом файле dbf а также и в txt необходима, то не торопитесь их удалять или запускать заново скрипт.
В общем, удалять эти файлы или оставлять, это если можно так сказать на Ваше усмотрение.
Идем дальше.
Set RSN=WScript.CreateObject("ADODB.Recordset")
Set conn = CreateObject("ADODB.Connection")
SConnect="Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & SDefaultDir & ";"
В этом фрагменте мы подсоединяем и открываем канал работы с dBase драйвером.
Это также можно найти в ИНТЕРНЕТе. Строка подключения SCconnect может быть разная по смыслу. Здесь надо быть внимательным и реализовать то направление, которое Вы захотите. Про строку подключения много есть в ИНТЕРНЕТе и можете выбрать то, что Вам необходимо. Сейчас я применяю самый распространенный формат по умолчанию. Про строку подключения я еще вернусь в ее реализации. В остальное наверно просто надо верить. Кстати вместо RSN, conn и SConnect можно поставить свои данные. Все остальное это в зависимости от ODBC и его версии. В ИНТЕРНЕТе это тщательно и подробно написано.
Можно применить числовой идентификатор типа драйвера
21 - dBASE III
277 - dBASE IV
533 - dBASE 5.0, значение по умолчанию
В строку подключение можно поставить ;DriverId=277;
Дальше вот такой фрагмент
Set cnnMain = CreateObject("ADODB.Connection")
cnnMain.CursorLocation = 3
cnnMain.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & NameFil & ";"
или если есть поддержка XLSX
cnnMain.Open "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & NameFil & ";"
Смотрите версию ODBC. Также ODBC можно самому установить на компьютер. Такая информация есть в ИНТЕРНЕТе, и я не буду это показывать. В крайнем случае, можете поэкспериментировать. Если выдаст ошибку, что ODBC не может работать с XLSX, то просто ставите другую строку и все. Я пробовал работать с XLS и XLSX, и предпочтенье отдаю XLSX, но это мое суждение. Так же заметил если переводить XLSX в XLS, а потом работать, то ODBC с XLS иногда плохо поддерживает некоторые форматы данных.
Что такое CursorLocation также можно почитать в ИНТЕРНЕТе, но здесь он просто необходим. Все остальное, как и в предыдущем фрагменте, имеет такой же подход.
Можно строку "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & NameFil & ";" определить какой-нибудь переменной, ну например
EXCconnect="DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & NameFil & ";"
или
EXCconnect="DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & NameFil & ";"
А потом cnnMain.Open EXCconnect
Со строкой подключения можно поиграться и выбрать ту, которая лично подходит.
Дальше выбираем тот лист в XLS или XLSX данные, с которого мы хотим перевести в создаваемый dbf файл
set tables = cnnMain.OpenSchema(20)
do until tables.eof
ImList=tables("TABLE_NAME")
tables.movenext
loop
Если листов в книге много, надо выбрать тот лист, данные которого Вам необходимы. Листы определяются с конца перечня листов, но выбирается лист с начала перечня листов.
По крайней мере, Вы можете прописать сами тот лист, который Вам необходим и даже диапазон необходимых данных на этом листе. Пишется так Лист1$ или Лист1$A:АD и т.д.
Все это есть в ИНТЕРНЕТе, и Вы легко это найдете. Конечно, придется понять это, но если Вы работали с EXCEL, то обоснуете это быстро.
Продолжаем дальше:
Пишем строку strSQL="SELECT * FROM [" & ImList & "]"
Что это означает. Делаем запрос данных со страницы (листа) EXCEL.
Можно поставить так и не мудрить с strSQL="SELECT * FROM [Лист1$]"
И не мудрить, если постоянно считываете данные из этого файла. Если будут другие файлы, можно сделать также, но можно и автоматически.
Подставляем strSQL в объект:
Set RS = cnnMain.Execute(strSQL)
Что такое Execute прочтете в ИНТЕРНЕТе. Там тоже есть свои предпочтения. Прочтете, и все будет ясно.
objKlRecs=RS.RecordCount ‘Количество строк в XLS, XLSX файле
objKlFields = RS.Fields.count ‘Количество колонок (столбцов) в XLS, XLSX файле
Здесь понятно. Дальше
Вот здесь самое интересное
' ==============Ввод названий Полей базы данных
SQL="create table " & NameFilDBF & "(st0 char(254), st1 char(254), st2 char(254))"
или
SQL="create table " & NameFilDBF & "(st1 char(254), st2 char(254), st3 char(254))"
Можно
SQL="create table c:\_222.dbf (st0 char(254), st1 char(254), st2 char(254))"
или
SQL="create table c:\_222.dbf (st0 date, st1 float, st2 char(254))"
и т.д. и т.д.
Но если полей заголовков в EXCEL файле много и их надо прописывать, то это можно сделать для тех файлов, которые Вам известны.
Если же Вы хотите, чтобы можно ввести любой EXCEL файл, имея большое количество заголовков то лучше сделать так
SQL="create table" & NameFilDBF & "("
for i=0 to objKlFields-1
st=RS.Fields(i).Name
stDL= RS.Fields(i).DefinedSize
if stDL>254 then
stDL=254
end if
if i=objKlFields-1 then
SQL=SQL & "st" & i & " char(" & stDL & "))"
else
SQL=SQL & "st" & i & " char(" & stDL & "),"
end if
next
' ==============Ввод названий Полей базы данных
Опишем этот фрагмент. Сначала что такое шапка полей в EXCEL файле.
Это заголовки колонок или столбцов EXCEL файла. Здесь есть свои неурядицы и их надо знать. Заголовки полей должны быть краткими и на латинице. Если они длинные, то в некоторых случаях выдается окно с ошибкой и редко когда обрезается. Потом имя полей на кириллице не всегда явно отображаются и во вовремя работы с таким файлом трудно работать с такими полями. Поэтому лучше сразу переделать такие имена колонок.
Сделать копию такого файла и исправить заголовки. Здесь я перевожу сразу, так выразится на латиницу.
Другой путь, просто исправить на свои заголовки, зная количество колонок в EXCEL таблице. Можете вместо “st”, поставить свое название, ну например “stt”или другое на ваше усмотрение. Только длину поля лучше делать не более 10 символов. Почему 10. Некоторые языки программирования не работают с dbf файлами у кого длина поля (заголовка) превышена 10 символов и даже с полями не с латиницей.
' ==============Ввод названий Полей базы данных
SQL="create table" & NameFilDBF & "("
for i=0 to objKlFields-1
stDL= RS.Fields(i).DefinedSize
if stDL>254 then
stDL=254
end if
if i=objKlFields-1 then
SQL=SQL & "stt" & i & " char(" & stDL & "))"
else
SQL=SQL & "stt" & i & " char(" & stDL & "),"
end if
next
' ==============Ввод названий Полей базы данных
Можете вместо “st” поставить свое название.
В VBScript массивы начинаются с нуля, и если хотите, чтобы поля базы начинались с 1
' ==============Ввод названий Полей базы данных
nk=0
SQL="create table " & NameFilDBF & "("
for i=0 to objKlFields-1
nk=nk+1
st=”st”&nk
stDL= RS.Fields(i).DefinedSize
if stDL>254 then
stDL=254
end if
if i=objKlFields-1 then
SQL=SQL & "st" & nk & " char(" & stDL & "))"
else
SQL=SQL & "st" & nk & " char(" & stDL & "),"
end if
next
' ==============Ввод названий Полей базы данных
nk=0 ‘ Очистка переменной
Я не пользовался функцией UBOUND и LBOUND. Думаю, что в этом примере они не нужны.
Дальше что такое stDL - это размер данных по символьной длине, которые записываются в указанные поля. Вот здесь я применил DefinedSize. Можете пробовать ActualSize, но где то это работает, а где то нет. Теперь я все поля перевожу в тип char. Можете попробовать и другие типы. Это на Ваше усмотрение. Если допустим, Вы знаете, что колонка в EXCEL имеет формат DATE, то просто пишете
If i=3
SQL=SQL & "st" & i & " date,"
End if
И другие форматы т.д.
Все это конечно надо проверять и убеждаться что работает.
Можно копировать свои форматы. Добавим строчку в предыдущий фрагмент
SQL="create table " & NameFilDBF & "("
for i=0 to objKlFields-1
stDL= RS.Fields(i).DefinedSize
TypePl=RS.Fields(i).Type ' Выбор типа поля
if stDL>254 then
stDL=254
end if
if i=objKlFields-1 then
SQL=SQL & "st" & i & " char(" & stDL & "))"
else
if TypePl=200 then ' char
SQL=SQL & "st" & i & " char(" & stDL & "),"
end if
if TypePl=5 then ' Double, float, real
SQL=SQL & "st" & i & " float," ' правильно
или
SQL=SQL & "st" & i & " real," ' правильно
end if
end if
next
Здесь TypePl=200 это тип char
Здесь TypePl=5 это тип float или real число с плавающей запятой.
Типы могут быть и другими, но файл, который я предлагаю там такие.
Я не нашел тонкой настройки атрибутов.
Я не работал с МЕМО и поэтому не буду его указывать в этой статье. Иногда строки в EXCEL больше 254 символов и их надо транспортировать в МЕМО поля. Кстати перевод такой строки в CSV файл не всегда получается. Появляется новая строка. Обычно текстовое поле dBase файла в большинстве имеет 254 символа и лучше ориентироваться на это, чем переводить все в MEMO поле.
Можно сказать все на Ваше усмотрение и экспериментирование.
Если у кого есть свое мнение, то можете написать под моим материалом.
Причем число с плавающей запятой мне не удалось привести к выбранному числу, ну например float5,2 при этом выдается ошибка. Выводится как float 20,5 и real также.
Переводить в целое я не стал. Возможно, это не решается в ODBC в версии, с которой я работаю, а если решается, то можете написать.
Пробовал ALTER, но у меня получилось, когда данных в dbf нет. Также не смог записать атрибуты. Можно конечно сделать изменения в EXCEL, но не всегда данные переносится, так как хочется. Поэтому я всегда оставляю type char. Главное создать dbf файл, а там, в легких бесплатных приложениях его можно отредактировать и сделать нормализацию.
Естественно можно создать шапку и без DefinedSize, но тогда просто придется поставить всем полям одинаковый размер длины поля char(254) или написать большой листинг полей. Что могу здесь подытожить. Все улучшается и возможно в новых версиях ODBC можно многое что делать, но их надо устанавливать и также пробовать эти процессы.
Теперь переходим к самому важному. Так вот шапку с полями для dbf мы создали, но теперь ее надо записать в создаваемый dbf файл. Запомните правильно созданная оглавление dbf файла это уже большая помощь в создании файла.
Набираем под шапкой
conn.Open SConnect ‘ Открываем канал к драйверу dBase
RSN.open SQL,conn,3 ‘ Создаем файл _222.dbf и записываем в него шапку полей
‘ согласно XLS или XLSX файла.
Разберем это фрагмент
Здесь с помощью conn.Open SConnect открываем канал подключения к драйверу dBase и
с помощью RSN.open SQL,conn,3 записываем в создаваемый файл (в нашем случае _222.dbf) созданную нами шапку с заголовками (полями).
В общем, создаем и открываем файл для записи
Строку conn.Open SConnect Вы можете написать и в начале скрипта и здесь не указывать, но я это здесь оставил для наглядности.
Что такое 3, можете почитать в ИНТЕРНЕТе, вызвав метод Open (объект RecordSetв ADO)
Можно указать RSN.open SQL,conn,3,3 или RSN.open SQL,conn,3,1
Первое это тип курсора, второе тип блокировки. Там все доступно написано, и кто работает с базами, это поймет. Если есть желание можете и проиграть все другие понятия.
Теперь, когда файл и оглавление (шапку) создали, необходимо освоить его формат кодировки. Есть кодировка 1251, 1252, 866 и т.д. Я всегда устанавливаю кодировку 866.
Почему. Так легче подзагружать файл в любое EXCEL приложение. Вот подзагружать dbf файл в EXCEL приложение можно, а переводить в dbf на современных EXCEL приложениях уже нельзя. Даже ACCESS отказался от этого, начиная с 13 версии.
Для перевода в 866 вставляем такой фрагмент
' ======== Кодировка 866 =======
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 =======
И вот самое интересное как перенести данные в уже созданный файл.
Можно не переносить данные, а уже в других программах это сделать.
Есть много способов просто добавить данные и программисты, да и кто много работает с программами, это могут сделать. Тогда может и возникнуть вопрос для чего все это. Но это отдельная история или направление, я не буду привлекать к этому внимание.
Значит необходимо перенести данные из EXCEL в уже созданный dbf файл.
Вставляем такой фрагмент
for i=1 to objKlRecs
st0= RS.Fields(0)
st1= RS.Fields(1)
st2= RS.Fields(2)
SQL="insert into " & NameFilDBF & " values(" & "'" & st0 & "'" & "," & "'" & st1 & "'" & "," & "'" & st2 & "')"
или
SQL="insert into c:\_222.dbf values(" & "'" & st0 & "'" & "," & "'" & st1 & "'" & "," & "'" & st2 & "')"
RSN.open SQL,conn,3
RS.MoveNext
next
В этом фрагменте RS.MoveNext Это переход на следующую строку в RS считанную из EXCEL в RecordSet
Оператор MoveNext перемещает курсор к следующей записи в наборе записей с текущей позиции, и считывает данные строки для записи в dbf файл.
Есть еще методы MoveFirst, NoveLast, MovePrevious Подробно про них можно прочитать в ИНТЕРНЕТе.
Значит, происходит запись данных с помощью RSN.open SQL,conn,3 и потом переходим на следующую строку RS.MoveNext
Ну и как Вам длина строки SQL? А если заголовок (полей) много?
Этот фрагмент решаем так:
for i=1 to objKlRecs
vvv="'"
for j=0 to objKlFields-1
st=RS.Fields(j)
if j=objKlFields-1 then
vvv=vvv & st & "'"
else
vvv=vvv & st & "'" & "," & "'"
end if
next
SQL="insert into " & NameFilDBF & " values(" & vvv & ")"
RSN.open SQL,conn,3
RS.MoveNext
next
vvv=0 или vvv=”” а можно вообще не указывать
Можете вместо vvv поставить свою переменную
После этого можете подбирать любой файл XLS или XLS
Просто количество заголовков в EXCEL файлах не должно быть больше 254
Также можно столкнуться с такой проблемой - перенос NULL данных.
Если Вы преобразовали XLSX в XLS, то иногда некоторые данные переносятся как NULL данные. Вообще при записи XLSX в XLS сам EXCEL как бы предупреждает, что некоторые данные могут записаться некорректно и не только МАКРОСЫ. Я думаю, что многие кто работает с EXCEL, видели такое сообщение. В самом файле XLS Вы это можете и не осознать. А вот в dbf файле это можно увидеть. Просто данные не перенесутся. Это бы ничего, но в некоторых NULL есть корректные данные. В JScript это можно как то их обналичить, но в VBScript у меня не получилось. Если кто знает, как это сделать, можете под этой статьей написать. Пробовал isNull и isEmpty не получалось.
Также менял строки подключения что dBase и EXCEL, тоже не увидел результата.
Конечно, желательно переводить в dbf, можно так сказать хороший EXCEL файл. Просто навести в нем порядок, если есть office или другая программа, с помощью которой можно работать с XLS или XLSX . Один раз понять, как привести в нормальный вид и все.
Если, нет Office, то можете отредактировать в другой программе или на другом компьютере. Можете также установить office или программу, которая поможет вам выполнить это решение.
Понять какая переменная можно с помощью оператора VarType(переменная)
Если же все-таки не можете это сделать, то Я добавил вот такие строки и фрагменты в скрипт.
Поставил в начале скрипта On Error Resume Next 'Проверка ошибок
Учтите использовать On Error Resume Next надо осторожно. Если не знаете, где происходит ошибка лучше его не ставить, просмотреть все ошибки во время исполнения скрипта, а потом поставить там, где крайне необходимо.
Тогда вставляем показ ошибок
iuu=0 'Признак записи в текстовый файл
ikk=0 'Запись строки “Строки ошибок”
for i=1 to objKlRecs
vvv="'"
for j=0 to objKlFields-1
st=RS.Fields(j)
if j=objKlFields-1 then
vvv=vvv & st & "'"
else
vvv=vvv & st & "'" & "," & "'"
end if
next
SQL="insert into " & NameFilDBF & " values(" & vvv & ")"
Или кто хочет прописывать полный путь к файлу
SQL="insert into c:\_222.dbf 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
vvv=""
if iuu>0 then
FOut.WriteLine "Ошибок " & iuu
FOut.Close
FOut.Nothing
end if
Таким способом мы запишем ошибки, которые возникнут при переносе данных из EXCEL файла в dbf
И наконец, в конце скрипта ставим строки
Set WshShell=Nothing
Set FSO = Nothing
Set oFile=Nothing
set tables=Nothing
cnnMain.Close
Set cnnMain = Nothing
RS.close
Set RS = 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
Кто дочитал до конца и все это представляет тяжелым текстом и, у кого нет по этому, понятия я напишу полностью текст, который надо записать в VBScript, а также создам готовый VBScript файл и запишу на диск. Также запишу на диск файлы EXCEL для примера. Ссылку я также дам.
Подытожим все написанное.
Вот так будет выглядеть начинка файла AdoED1.vbs
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'*******************************************************************
' Имя: AdoED1.vbs
' Язык: VBScript
' Описание: Вывод данных из XLS файла в DBF
' Полностью ODBS для EXCEL и dBase, ADO через DefinedSize EXCEL
'*******************************************************************
On Error Resume Next 'Проверка ошибок
Set WshShell=WScript.CreateObject("WScript.Shell")
SDefaultDir=WshShell.CurrentDirectory
Set FSO = CreateObject("Scripting.FileSystemObject")
' ==== Файл EXCEL данные которго надо перевести в создаваемый во время процесса файл dbf ====
NameFil=SDefaultDir & "\_111.xls"
' ==== Создаваемый 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 & ";"
Dim ImList
set tables = cnnMain.OpenSchema(20)
do until tables.eof
ImList=tables("TABLE_NAME")
tables.movenext
loop
strSQL="SELECT * FROM [" & ImList & "]"
Set RS = cnnMain.Execute(strSQL)
objKlRecs=RS.RecordCount 'Количество строк в XLS, XLSX файле
objKlFields = RS.Fields.count 'Количество колонок в XLS, XLSX файле
' ==============Ввод названий Полей базы данных
SQL="create table " & NameFilDBF & "("
for i=0 to objKlFields-1
st=RS.Fields(i).Name
stDL= RS.Fields(i).DefinedSize
TypePl=RS.Fields(i).Type
if stDL>254 then
stDL=254
end if
if i=objKlFields-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 =======
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 =======
iuu=0 'Признак записи в текстовый файл
ikk=0 'Запись строки Строки ошибок
for i=1 to objKlRecs
vvv="'"
for j=0 to objKlFields-1
st=RS.Fields(j)
if j=objKlFields-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
Set WshShell=Nothing
Set FSO = Nothing
Set oFile=Nothing
Set tables=Nothing
cnnMain.Close
Set cnnMain = Nothing
RS.close
Set RS = 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
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Ну, вот и все. Просьба соблюдать нормы общения и поведения. Не надо писать грубости и выставлять свою значимость и исключительность в приоритете. Буду убирать из общения. Писать только по существу. Обсуждение и полезная критика приветствуется. Если есть интересные понятия, то можете их представить.
Файлы _111.xls и _111.xlsx для работы. AdoED1.vbs - основной запускаемый файл скрипт. Каталог WDBFVIEW (файл WDBFVIEW.EXE распространяется в ИНТЕРНЕТе свободно и бесплатно). В этом каталоге находится приложение, с помощью которого можете привести получаемый файл _222.dbf или создаваемый dbf к нормализации, а также редактировать его. Что я понимаю под словом нормализации - это привести поля dbf файла в соответствии с их размером данных. Все это упаковано в архив Файлы.rar
Распакуйте все в любой каталог (лучше создать отдельно новый) и запустите AdoED1.vbs
Можете просмотреть созданный dbf файл (_222.dbf) с помощью WDBFVIEW.EXE
Теперь кому это нужно. Здесь можно привести много причин вытекающих из понятий оперативного создания dbf файла, и последующих с ним других операций.
В следующей статье я опишу, как привести получаемый dbf файл к нормализации и другие действия с помощью VBScript .
И еще, файл можно редактировать, а также переделать на JScript.
Ссылка на файлы https://disk.yandex.ru/d/CTZ-OhnPftRJmg С
Подписывайтесь на мой канал и ставьте лайки.