Домой / Офис / Экспорт данных из dbf-файлов в Excel. Открытие и преобразование DBF-файла в EXCEL Полное описание решения

Экспорт данных из dbf-файлов в Excel. Открытие и преобразование DBF-файла в EXCEL Полное описание решения

dBASE - одна из самых старых систем управления базами данных, и формат файла dBASE (DBF) применялся долгое время. Microsoft Access поддерживает экспорт данных в такие форматы файлов dBASE: dBASE III, dBASE IV, dBASE 5 и dBASE 7.

Обратите внимание на то, что поддержка dBASE имеет указанные ниже требования.

    Подписка на Office 365 Если вы являетесь подписчиком Office 365, убедитесь, что у вас установлена последняя версия Office. Если вы являетесь ИТ-специалистом, управляющим процессом обновления Office 365, посетите страницу выпуск каналов, чтобы узнать, какие обновления предоставляются в каждом канале.

    Office 2016 Установите следующие обновления в указанном порядке: 2 мая 2017 г., обновление для Office 2016 (кб3115501) и Май 2, 2017, Update для Access 2016 (кб3178700) .

    Выпуски Office 2016 "нажми и работай" Обновления применяются автоматически.

Экспорт данных в файл dBASE

В результате будет создан файл dBASE в указанном расположении и формате.

Access 2013 не поддерживает формат dBASE

Экспорт в формат dBASE не поддерживается в Access 2013. Для работы с файлами dBASE попробуйте обновить подписку на Office 365. Экспорт в формат dBASE доступен в версиях Access для подписки на Office 365.

DBF - файл баз данных, возможность работы с которым раньше интегрировалась в среду Microsoft Office. С форматом работали приложения Access и Excel, позже Access был выведен из состава пакета и стал отдельной программой, а в Excel с 2007 года поддержка DataBaseFile была существенно ограничена.

При невозможности открыть DBF-файл напрямую в Excel его нужно предварительно конвертировать.

Однако DBF хоть и считается многими устаревшим форматом, но до сих пор широко используется в специализированных программах в сфере бизнеса, проектирования, инженерной сфере. Везде, где требуется работа с большими массивами информации, их структурирование и обработка, выполнение запросов. Например, программный комплекс 1С Предприятие целиком основан на управлении базами данных. А учитывая, что масса офисной документации и данных проходит в Excel, то вопрос интегрированной работы с этими форматами актуален и востребован.

Проблемы Excel при работе с DBF

В Excel 2003 была возможность открыть и редактировать DBF , а также сохранять в этом формате документы XLS:

  1. На панели меню выбрать «Файл».
  2. Далее, нажать «Сохранить как».
  3. Выбрать из выпадающего списка «*.dbf».

ВАЖНО. Начиная с 2007 года вы можете открыть и просмотреть в Excel формат баз данных, но не можете вносить изменения, а также сохранять в нём документы.xls. Стандартные средства программы больше не предусматривают такой возможности.

Однако существуют специальные надстройки для приложения, добавляющие ему такую функцию. В сети на различных форумах программисты выкладывают свои разработки, можно найти разные варианты. Наиболее популярную надстройку, которая называется XslToDBF, можно скачать с сайта разработчика http://basile-m.narod.ru/xlstodbf/download.html. Загрузка бесплатная, но по желанию можно поддержать проект, перечислив любую сумму на кошелёк или карту.

Установка и использование:

  1. Скачайте архив с указанного выше сайта.
  2. Извлеките из него XlsToDBF.xla и сохраните на своём компьютере.
  3. В Excel зайдите в меню кнопкой со значком Майкрософт слева, «Параметры».
  4. В разделе «Параметры Excel» выберите «Надстройки».
  5. В строке «Управление/Надстройки Excel» нажмите «Перейти».
  6. Нажмите «Обзор» и укажите сохранённый XlsToDBF.xla.
  7. В списке надстроек должна появиться запись «XLS -> DBF» с поставленной галочкой проверки. Отметьте, если её нет.
  8. Теперь вы можете сохранять.xls в формат.dbf. С того же сайта можно скачать подробную инструкцию по использованию. Главное, правильно подготовить табличные данные.
  9. После того как таблица готова, выберите любую заполненную ячейку и нажмите Alt и F
  10. В открывшемся окне макроса в поле наберите XlsToDBF, регистр не важен.
  11. Нажмите «Выполнить».
  12. Если вы правильно подготовили и оформили данные, то в папке, где находится исходный XLS, будет сохранён и файл базы данных.

Если вы не хотите ничего менять в Office, не доверяете надстройкам и сторонним приложениям, то можно предложить более трудоёмкий способ преобразовать файл XLS в DBF:

  1. Приобретите и установите программу Microsoft Access.
  2. В Excel подготовьте и сохраните документ.
  3. Нажмите кнопку «Открыть» в MS Access и выберите файл.
  4. Теперь нужно корректно настроить импорт.
  5. Выберите лист, с которого начнёте. Если их несколько, всё равно придётся делать по одному.
  6. Если в таблице есть строка заголовков, поставьте соответствующую галочку.
  7. Далее, можно изменить имя таблицы.
  8. Теперь нажмите на «Внешние данные».
  9. Жмите кнопку «Экспорт», «Дополнительно».
  10. Выберите «Файл dBase».
  11. Укажите имя и место сохранения.

Такой способ не всегда работает удачно, часто возникают ошибки в обработке данных, в последующем сохранении. И он весьма долгий и неудобный.

Конвертация

Чтобы не мучиться самим с офисными программами, создано множество приложений , позволяющих перевести данные из одного формата в другой. Во-первых, почти все мощные программы по работе с СУБД предполагают возможность экспорта в XLS и загрузки из него. Во-вторых, есть небольшие утилиты, специализирующиеся на конвертации. Вот некоторые из них:


Во всех этих программах преобразование сводится к тому, что нужно открыть исходный файл, а затем выполнить команду «Конвертировать» или «Экспорт».

Существуют и бесплатные сервисы онлайн-преобразования. На таких сайтах предлагается прислать (загрузить) исходный файл, нажать «Конвертировать», после чего появится ссылка на преобразованный документ. Насколько можно доверять таким услугам, решение индивидуальное, на свой страх и риск.

Таким образом, открыть DBF в программе Excel можно, но если его версия 2007 и новее, то сделать с ним больше ничего не получится, только посмотреть. Для редактирования, сохранения в XLS есть специальные надстройки или программы, так же как и для преобразования в обратном направлении. Если у вас есть опыт конвертации и работы с DBF в разных приложениях, поделитесь своими советами в комментариях.

  • Tutorial

В этой статье я расскажу как загрузить много огромных dbf файлов, состоящих из миллионов записей в вашу базу данных на ms sql сервере за приемлемое время.

Задача на первый взгляд тривиальна. Можно использовать мастер в sql management studio или функцию OPENROWSET через запрос.

Но первый вариант после нескольких попыток отпал из за разных глюков и необходимости загрузки множества файлов в одну таблицу (около 100 файлов). К тому же при продолжительной загрузке вылетала ошибка.

Второй вариант тоже не подошел из за различной разрядности драйверов и разрядности сервера.

Так как файл просто огромный, то было решено читать его через поток и записывать в базу. Далее после прочтения строки в файле надо эту строку записать в табличку. Первое что пришло на ум это использовать insert, но запись в этом случае заняла бы слишком много время.

И тут я вспомнил про другой механизм записи через SqlBulkCopy, который позволяет заливать огромное число записей без запросов insert.
На деле это использование класса SqlBulkCopy, для осуществления записи через который надо реализовать один лишь интерфейс IDataReader.

Итак начнем с реализации интерфейса public class BDFBulkReader: IDataReader

Начнем с функции, которая возвращает значение текущей записи:
public object GetValue(int i) { return R]; }
Обращу ваше внимание на то что поля в файле и поля в таблице могут быть в разном порядке. А по индексу хотелось бы получать значение для соответствующего поля таблицы. Поэтому я использовал дополнительно словарь FieldIndex, где сопоставление имен полей номеру в таблице sql. По номеру берется имя поля, по имени из словаря R берется значение из прочитанной строки dbf файла. В итоге для n го индекса в бд GetValue вернет соответствующее значение.
Dictionary R = new Dictionary(); Dictionary FieldIndex = new Dictionary();

FieldIndex будем передавать уже заполненный для таблицы, а R будет заполнять при вызове самими reader"ом функции Read, которую в дальнейшем тоже реализуем.

Итак, конструктор:

System.IO.FileStream FS; byte buffer; int _FieldCount; int FieldsLength; System.Globalization.DateTimeFormatInfo dfi = new System.Globalization.CultureInfo("en-US", false).DateTimeFormat; System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat; string FieldName; string FieldType; byte FieldSize; byte FieldDigs; int RowsCount; int ReadedRow = 0; Dictionary R = new Dictionary(); Dictionary FieldIndex = new Dictionary(); public BDFBulkReader(string FileName, Dictionary FieldIndex) { FS = new System.IO.FileStream(FileName, System.IO.FileMode.Open); buffer = new byte; FS.Position = 4; FS.Read(buffer, 0, buffer.Length); RowsCount = buffer + (buffer * 0x100) + (buffer * 0x10000) + (buffer * 0x1000000); buffer = new byte; FS.Position = 8; FS.Read(buffer, 0, buffer.Length); _FieldCount = (((buffer + (buffer * 0x100)) - 1) / 32) - 1; FieldName = new string[_FieldCount]; FieldType = new string[_FieldCount]; FieldSize = new byte[_FieldCount]; FieldDigs = new byte[_FieldCount]; buffer = new byte; FS.Position = 32; FS.Read(buffer, 0, buffer.Length); FieldsLength = 0; for (int i = 0; i < _FieldCount; i++) { FieldName[i] = System.Text.Encoding.Default.GetString(buffer, i * 32, 10).TrimEnd(new char { (char)0x00 }); FieldType[i] = "" + (char)buffer; FieldSize[i] = buffer; FieldDigs[i] = buffer; FieldsLength = FieldsLength + FieldSize[i]; } FS.ReadByte(); this.FieldIndex = FieldIndex; }

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

Теперь перейдем к реализации bool Read(). Она вернет true в случае если строка успешно прочитана. И false в случае если строка не была прочитана и в то же время был достигнут конец данных.

Public bool Read() { if (ReadedRow >= RowsCount) return false; R.Clear(); buffer = new byte; FS.ReadByte(); FS.Read(buffer, 0, buffer.Length); int Index = 0; for (int i = 0; i < FieldCount; i++) { string l = System.Text.Encoding.GetEncoding(866).GetString(buffer, Index, FieldSize[i]).TrimEnd(new char { (char)0x00 }).TrimEnd(new char { (char)0x20 }); Index = Index + FieldSize[i]; object Tr; if (l.Trim() != "") { switch (FieldType[i]) { case "L": Tr = l == "T" ? true: false; break; case "D": Tr = DateTime.ParseExact(l, "yyyyMMdd", dfi); break; case "N": { if (FieldDigs[i] == 0) Tr = int.Parse(l, nfi); else Tr = decimal.Parse(l, nfi); break; } case "F": Tr = double.Parse(l, nfi); break; default: Tr = l; break; } } else { Tr = DBNull.Value; } R.Add(FieldName[i], Tr); } ReadedRow++; return true; }

Еще раз напомню, что после ее вызова прочитанная строка запишется в словарь R, для последующего чтения reader"ом.
Итак, осталось реализовать, метод возвращающий число полей:

Public int FieldCount { get { return _FieldCount; } }

И заглушки для интерфейса:

Public void Dispose() { FS.Close(); } public int Depth { get { return -1; } } public bool IsClosed { get { return false; } } public Object this { get { return new object(); } } public Object this { get { return new object(); } } public int RecordsAffected { get { return -1; } } public void Close() { } public bool NextResult() { return true; } public bool IsDBNull(int i) { return false; } public string GetString(int i) { return ""; } public DataTable GetSchemaTable() { return null; } public int GetOrdinal(string name) { return -1; } public string GetName(int i) { return ""; } public long GetInt64(int i) { return -1; } public int GetInt32(int i) { return -1; } public short GetInt16(int i) { return -1; } public Guid GetGuid(int i) { return new Guid(); } public float GetFloat(int i) { return -1; } public Type GetFieldType(int i) { return typeof(string); } public double GetDouble(int i) { return -1; } public decimal GetDecimal(int i) { return -1; } public DateTime GetDateTime(int i) { return new DateTime(); } public string GetDataTypeName(int i) { return ""; } public IDataReader GetData(int i) { return this; } public long GetChars(int i, long fieldoffset, char buffer, int bufferoffset, int length) { return -1; } public char GetChar(int i) { return " "; } public long GetBytes(int i, long fieldOffset, byte buffer, int bufferoffset, int length) { return -1; } public byte GetByte(int i) { return 0x00; } public bool GetBoolean(int i) { return false; } public int GetValues(Object values) { return -1; }

Где в Dispose() я просто закрываю файл.

После того как интерфейс реализован, можно написать метод для загрузки файла:

Void SaveToTable(FileInfo dir, string TableName, string connestionString, Dictionary FieldIndex) { using (var loader = new SqlBulkCopy(connestionString, SqlBulkCopyOptions.Default)) { loader.DestinationTableName = TableName; loader.BulkCopyTimeout = 9999; loader.WriteToServer(new BDFBulkReader(dir.FullName, FieldIndex)); } }

Вот и все. В эту функцию осталось передать расположение файла, имя таблицы, строку подключения и соответствующий словарь соответствий, например:

Dictionary FieldIndex= new Dictionary(); FieldIndex.Add(0, "POSTALCODE"); FieldIndex.Add(1, "IFNSFL"); FieldIndex.Add(2, "TERRIFNSFL"); FieldIndex.Add(3, "IFNSUL"); FieldIndex.Add(4, "TERRIFNSUL"); FieldIndex.Add(5, "OKATO"); FieldIndex.Add(6, "OKTMO"); FieldIndex.Add(7, "UPDATEDATE"); FieldIndex.Add(8, "HOUSENUM"); FieldIndex.Add(9, "ESTSTATUS"); FieldIndex.Add(10, "BUILDNUM"); FieldIndex.Add(11, "STRUCNUM"); FieldIndex.Add(12, "STRSTATUS"); FieldIndex.Add(13, "HOUSEID"); FieldIndex.Add(14, "HOUSEGUID"); FieldIndex.Add(15, "AOGUID"); FieldIndex.Add(16, "STARTDATE"); FieldIndex.Add(17, "ENDDATE"); FieldIndex.Add(18, "STATSTATUS"); FieldIndex.Add(19, "NORMDOC"); FieldIndex.Add(20, "COUNTER");

Все, всем спасибо за внимание, приятной загрузки.