Бесплатный конвертер XLS в DBF и DBF в XLS
Конвертер XLS а также XLSX в DBF и DBF в XLSX представляет собой макрос EXCEL, которым можно использовать не только для конвертирования, но и для поиска, заполнения из файла другой структуры по ключевым полям записей и их модификация. Например, если требуется заполнить файл EXCEL, в котором присутствует какое либо ключевое поле (номер счета или код товара) из базы DBF с таким же ключевым полем.
Или же обратная ситуация - есть EXCEL файл, надо модифицировать или заполнить DBF файл. Конечно потребуется коррекция VBA кода макроса, но сочинять и отлаживать "с нуля" не придется.
Идея выложить подобный макрос появилась, когда самому потребовался подобный конвертор, а поиски в интернете указывали только на платные конвертеры, к тому же без возможности что либо изменить под себя. За основу была взята оригинальная надстройка XlsToDBF, автор Василий Малинин, которая распространялась в интернете бесплатно, но найти и скачать ее оказалось не просто. Больше попадались либо платные утилиты, либо он-лайн конверторы. Ни то ни другое не подходило.
Тем более с выходом версии MS Office 2007 в программе Excel по кнопке <Save As...> (<Сохранить как...>) в списке возможных вариантов формат dBASE (*.DBF) уже нет. В последующих подавно.
Краткое описание файла конвертора с макросом XLSX_DBF
В скачанном архиве XLSX_DBF.zip (в конце статьи) присутствуют файлы:
Конвертор.xlsm - собственно сам EXCEL файл с макросами.
Файлы для примера конвертации и заполнения
in_file.DBF
LK_in1.xlsx
RK_in2.xlsx
out1.xlsx
out2.xlsx
Еще два файла появятся после нажатия кнопки " Заполнить L,R DBF"
SUB_K.DBF
SUB_L.DBF
Все действия по кнопкам легко подкорректировать в VBA из меню макросов
По умолчанию в файле прописаны пути "D:\File". Для удобства разархивируйте архив на диск D в корень и у Вас сохранится начальная настройка каталогов.
Естественно какие то начальные знания VBA должны присутствовать. Подробных инструкций нет, но все и так максимально просто. Если Вы хоть раз работали с макросами, то подправить по себя наверняка сумеете.
Для выполнения макроса необходимо в EXCEL включить разрешение на открытие и запуск макросов. В этих макросах ВИРУСОВ НЕТ. Для включения надо в меню "ФАЙЛ" выбрать "Сведения" -> "Параметры"
Далее выбрать "Центр управления безопасностью" -> "Параметры центра управления безопасностью" -> "Параметры макросов" -> "Включить все макросы"
Для запуска конвертора открываутся файл Конвертор.xlsm. Слева кнопки выбора файлов, справа кнопки запуска. Для примера представлены файлы EXCEL (Субсидии и льготы - Out1 и Out2), которые обновляются из IN_FILE.DBF, по ключевому полю LSCHET. В сроки файлов XLSX, где будет найден "Номер лицевого счета" будет заполнено значением из поля "DOLG" файла IN_FILE.DBF.
Вторая часть Конвертор.xlsm демонстрирует создание и заполнение файлов SUB_K.DBF и SUB_L.DBF из LK_in1.xlsx и RK_in2.xlsx согласно заданной структуры. За основу создания взята надстройка XlsToDBF, преобразованная в макрос с исправлением некоторых ошибок.
Макрос (надстройка) XlsToDBF и его описание
Позволяет:
-
- задать произвольное имя выходного DBF-файла
- задать тип и размер для каждого поля по усмотрению пользователя
- задать кодовую страницу (WINDOWS-1251 или DOS-866) для выходного DBF-файла
- задать параметр MAC для корректного вывода DBF-файла на Macintosh
Чтобы надстройка поняла, что от неё требуется и создала требуемый DBF-файл, необходимо задать тип, размер, имена полей для конечного DBF-файла, а также его название.
Надстройка умеет работать с четырьмя основными форматами полей DBF: Character (Cnnn), Numeric (Nnn или Nnn.n), Date (D) и Logical (L), т.е такие поля как General, Memo, Currency и т.д. в конечном файле она создать не сумеет. Собственно, родной конвертер предыдущих версий Excel имел такое же ограничение.
Для примера используется файл Price.xls из архива, Лист: Price. Существует таблица EXCEL, которую необходимо сохранить в DBF-файле.

В конечном DBF-файле назначаем необходимые имена полей и форматы, чтобы:
- Поле Идентификатор имело целочисленный тип (т.е Numeric) шириной в 14 знаков и называлось ID.
- Поле Наименование -- строковый тип (Character) шириной в 100 символов с названием NAME
- Поле Единица измерения -- строковый, 20 символов, с названием ONE_NAME
- Поле Цена -- числовой тип (Numeric) шириной в 14 знаков с двумя знаками за запятой с названием PRICE
- Поле Включать в прайс -- логический тип (Logical) с названием L_PRICE
- Поле Дата обновления имело тип даты (Date) с названием D_UPDATE
Также мы хотим конечный DBF-файл сохранить с названием PRICE.DBF в кодовой странице (Code Page) DOS-866.
Для того, чтобы получить ожидаемый результат, нужно изменить заголовок таблицы следующим образом (файл Price.xls из архива, Лист: Price_pre).

Первая ячейка первой строки, экспортируемой области, содержит имя конечного файла. Расширение в имени файла на процесс конвертации не влияет, т.е. конечный файл в любом случае будет иметь структуру DBF (dBASE).
Вторая ячейка (B1) указывает макросу надстройки в какой кодовой странице сохранять DBF-файл. Если значение ячейки (B1) отличается от CP866 или не задано совсем, то конечный DBF-файл сохранится в кодовой странице WINDOWS CP1251.
Вторая строка описывает форматы полей, которые мы хотим получить в конечном файле. Здесь хочу отметить, т.к. многие путаются, что числовой формат с дробной десятичной частью, например N14.2 трактуется следующим образом: ширина поля 14 знаков, включая десятичную точку и 2 знака за ней. Т.е. 11 целых знаков, десятичная точка и 2 знака за ней, а не 14 целых знаков и 2 за точкой.
Третья строка описывает наименование полей (максимально 10 символов). Я думаю, больше комментировать здесь нечего.
Начиная с четвёртой строки и до конца непрерывной области, располагаются данные. Желательно, чтобы данные соответствовали заданному типу. Красным цветом я отметил те поля, в которых значения не могут быть корректно преобразованы. В таких случаях надстройка задаёт им значения по умолчанию. Например, значение ДА не может быть преобразовано к логическому типу. Поэтому в конечном DBF-файле это поле будет иметь значение FALSE (F). В данном примере то же самое произойдёт и с датами, отмеченными красным цветом (в DBF-файле они будут пустые).
В макросе файла Конвертор.xlsm эти операции прописаны в VBA коде, макрос - "Вывод_в_dbf()"
Sub Вывод_в_dbf()
Dim i As Integer
Dim strMes As String
Dim strMes1 As String
Dim strMes2 As String
Dim WBook As String
Dim WMak As String
Dim Wind1 As String
strMes = ""
Range("D13:D200").Value = ""
Range("D13").Value = "Обработка 1"
f_lgot = Range("D8").Value
f_sub = Range("D9").Value
f_dbf_l = Range("D10").Value
f_dbf_r = Range("D11").Value
WBook = ThisWorkbook.Name
strMes2 = Range("D10").Value
If is_file(f_lgot) = 1 Then
Range("D13").Value = "Обработка 1"
Workbooks.Open (f_lgot)
Range("A1").Value = strMes2
i = rep_file()
Application.Run "'Конвертор.xlsm'!XlsToDBF"
ActiveWindow.Close SaveChanges:=False
Windows(WBook).ActivatestrMes = strMes + "DBF Файл льгот " & Range("D10").Value & " заполнен" & Chr(13) + Chr(10)
Else
strMes = strMes + "!!! DBF Файл льгот НЕ заполнен!" & Chr(13) + Chr(10)
End If
Запуск макроса надстройки XlsToDBF
После того, как мы подготовили данные для выгрузки, можно запустить макрос надстройки. Для этого нужно выделить любую ячейку в области данных или заголовка и нажать <Alt+F8>. В диалоговом окне «Макрос» в поле «Имя макроса:» нужно ВРУЧНУЮ ввести XlsToDBF (регистр не имеет значения) и нажать кнопку <Выполнить>. Если на предыдущем этапе всё сделано верно, то DBF-файл будет сохранен с именем PRICE.DBF в той же папке, где расположена исходная книга Excel. В случае если книга новая и не сохранена, то DBF-файл будет сохранён в папке по умолчанию (скорее всего в папке «Мои документы»). Будьте внимательны: при повторном запуске макроса DBF-файл будет переписан без каких-либо предупреждений.
Если работа надстройки устраивает, и Вы предполагаете часто её использовать, то для удобства создайте пользовательскую кнопку на ленте и назначьте ей макрос XlsToDBF.