Конвертиране на данни от Microsoft Excel в DBF формат. Експортиране на данни в dBASE файл

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

Моля, обърнете вниманиече поддръжката на dBASE има следните изисквания.

    Абонамент за Office 365Ако сте абонат на Office 365, уверете се, че имате най-новия Офис версия. Ако сте ИТ специалист, който управлява процеса на актуализиране на Office 365, посетете страницата за издание на канала, за да видите какви актуализации се предоставят във всеки канал.

    Офис 2016Инсталирайте следните актуализации в посочения ред: Актуализация от 2 май 2017 г. за Office 2016 (KB3115501) и Актуализация от 2 май 2017 г. за Access 2016 (KB3178700).

    Издания на Office 2016 Click-to-RunАктуализациите се прилагат автоматично.

Експортиране на данни в dBASE файл

Това ще създаде dBASE файл в указаното местоположение и формат.

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

Експортирането в dBASE не се поддържа в Access 2013. За да работите с dBASE файлове, опитайте да надстроите до вашия абонамент за Office 365. Експортирането в dBASE е налично в абонаментните версии на Office 365.

  • Урок

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

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

Но първата опция отпадна след няколко опита поради различни проблеми и необходимостта от зареждане на много файлове в една таблица (около 100 файла). Освен това при продължително зареждане възникна грешка.

Вторият вариант също не беше подходящ поради различната битовост на драйверите и битовостта на сървъра.

Тъй като файлът е просто огромен, беше решено да се прочете чрез поток и да се запише в базата данни. След това, след като прочетете ред във файла, трябва да запишете този ред в таблица. Първото нещо, което ми дойде на ум, беше да използвам вмъкване, но писането в този случай ще отнеме твърде много време.

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

Така че нека започнем с внедряването на публичния клас BDFBulkReader интерфейс: IDataReader

Нека започнем с функция, която връща стойността на текущия запис:
публичен обект GetValue(int i) ( return R]; )
Нека ви обърна внимание, че полетата във файла и полетата в таблицата може да са в различен ред. И от индекса бих искал да получа стойността за съответното поле на таблицата. Затова допълнително използвах речника FieldIndex, където картографирането на имена на полета към числа в sql таблицата. Името на полето се взема по номер, а стойността от прочетения ред на dbf файла се взема по име от R речника. В резултат на това за n-тия индекс в базата данни GetValue ще върне съответната стойност.
Речник R = нов речник (); Речник ();

FieldIndex = нов речник

Ще предадем вече попълнения FieldIndex за таблицата и R ще го попълни, когато читателят извика функцията Read, която също ще приложим в бъдеще.

И така, конструкторът: R = нов речник (); Речник System.IO.FileStream FS; байтов буфер;< _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; }

int_FieldCount;

Сега нека да преминем към имплементацията на 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 ; за (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 за последващо четене от читателя.
И така, всичко, което остава, е да внедрим метода, който връща броя на полетата:

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 десетичен GetDecimal(int i) ( връща -1; ) public DateTime GetDateTime(int i) ( връща нов 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, низ TableName, низ connestionString, речник FieldIndex) (с помощта на (var loader = new SqlBulkCopy(connestionString, SqlBulkCopyOptions.Default)) ( loader.DestinationTableName = TableName; loader.BulkCopyTimeout = 9999; loader.WriteToServer(new BDFBulkReader(dir.FullName, FieldIndex)); ) )

Това е. Всичко, което остава за предаване на тази функция, е местоположението на файла, името на таблицата, низа за връзка и съответния съответстващ речник, например:

Речник FieldIndex= нов речник ();

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, "АКТУАЛИЗИРАНЕ"); FieldIndex.Add(2, "TERRIFNSFL"); 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, "БРОЯЧ");Това е всичко, благодаря на всички за вниманието, приятно изтегляне.Въпреки че FieldIndex.Add(9, "ESTSTATUS"); dbfотдавна се смята наследствоформат, темата все още остава спешна задача, съдейки по броя на въпросите в интернет. По-специално го срещнах, когато се опитвах да вмъкна карта в масата. Карта ArcGISсъдържащи метаданни във формата . Имаше смисъл да ги четем едновременно в SQLServer , за да не пишете ръчно надписи за полигони, линии и други картографски обекти. В древността FieldIndex.Add(9, "ESTSTATUS"); VisualFoxPro 6 и SQLServer 7.0 сане беше проблем.

, но много неща се промениха оттогава. С изходаSQLServer 2005 на MSDN появи се информация, че съветникът за импортиране и експортиране в SQL сървър FieldIndex.Add(2, "TERRIFNSFL"); не поддържа импортиране и експортиране на dBASE файлове и други DBF файлове. Като решение се препоръчва използването на SQL Server Integration Services или поетапно импортиране в Access или Excel.Импортиране на данни:

Фиг.1

Посочваме като източник на данни.NetFrameworkDataProviderforODBC, от ODBCсега нашето всичко отново, като ConnectionString- следния низ за връзка:

Driver=(Microsoft dBase драйвер (*.dbf));SourceType=DBF;SourceDB=NA;Exclusive=No; NULL=Не;Изтрито=Не;BackgroundFetch=Не

Фиг.2

КликнетеСледваща . Ако сега натиснетеНазад, ще видим, че свойствата на връзката са се разширили от ред в колона, така че можем да видим списък с тях и да видим на какво е равно всяко от тях:

Фиг.3

Примери за низове за свързване ODBC -dBase драйвери са дадени например вMicrosoft KnowledgeBase или на ресурса connectionstrings.com . Като цяло целта на определени свойства е лесна за отгатване от имената им, с изключение може би на свойството Изтрито, което иматочно обратното значение . Както е известно, операцията за изтриване на ред в dBase /FoxPro не води до незабавното му физическо премахване от файла. Линията е отбелязана само, че е изтрита. Физическо почистване на редове, които имат флаг за изтриване и реорганизация на файла се извършва с командатаОПАКОВАЙТЕ . Стойността NO казва на драйвера да включи изтритите редове в върнатия набор от резултати. За да не ги показвате, трябва да зададете ДА. КликнетеСледваща.

Следващият екран е прост. Установява връзка сFieldIndex.Add(9, "ESTSTATUS"); , включително базата данни, в която се намира таблицата с резултатите от импорта от dbf:

Фиг.4

Да продължим. Ще бъдете подканени да изберетеFieldIndex.Add(2, "TERRIFNSFL"); -та таблица от списъка с таблици или напишете заявка ръчно. Има смисъл, например, за FoxPro shny база, която, като всяка нормална база данни, е контейнер, който съдържа няколко таблици, в този случай под формата на отделни dbf файлове. За индивидуални FieldIndex.Add(2, "TERRIFNSFL"); -file това не работи - вижте, например,OdbcConnection . GetSchema(" tables") allwrongfor . dbfileи помощен персонал Microsoft препоръчва се да се използва в тази ситуация OLEDB Доставчик за VisualFoxPro . Първо, инцидентът се случи много преди радикалната промяна в генералната линия на партията. OLEDB тогава беше всичко наше aODBC , напротив, приложен към стари наследени интерфейси. Второ, не разбирам защо трябва да разглеждате списъка dbfкогато вече е сам.

В случай на разпръснатиFieldIndex.Add(2, "TERRIFNSFL"); , намиращи се в същата директория, трябва да бъдат посочени в реда ODBC-connections (Фиг. 3) Свойство DefaultDir, например,

Драйвер=(Microsoft dBase драйвер (*.dbf));sourcetype=DBF;DefaultDir=c:\Temp;exclusive=No;null=Не;deleted=Не;backgroundfetch=Не

ТогаваМожете да проверите Копиране на данни от една или повече таблици или изгледи.

Фиг.5

и ще се покаже списък dbf в тази директория, от която ще бъдете помолени да изберете:

Фиг.6

Но аз не попитах DefaultDir на фиг. 3, така че избирам да напиша заявка:

Фиг.7

и пиша:

Фиг.8

Ав отговор получавам грешката Механизмът на базата данни на Microsoft Jet не можа да намери обекта "regions2010_wgs.dbf":

Фиг.9

Тази грешка възниква, защото драйверът все още е глупавприема имена на файлове във формат MS-DOS 8.3 . Ако преименувате файла regions2010_wgs.dbf, да речем,ааа . dbf , и заявката на фиг. 8, съответно, трябва да бъде заменена сизберете * от c:\Temp\aaa.dbf, грешката изчезва. Ще бъдете подканени да изберете съществуваща или да посочите името на таблицата, върху която ще бъде създадена SQLServer в базата данниБаза данни 1 (виж фиг. 4) под резултатите от импорта от dbf. Оставям предложеното име както е:

Фиг.10

Като щракнете върху бутона тукПреглед , можете да прегледате съдържанието dbf o предполага се да бъде прехвърлен нане беше проблем:

Фиг.11

Всичко е наред, но абракадабрата вместо руския текст е депресираща. Причината за появата му в популярен вид обяснява уважаваният авторЛалекс. Липсват руски знаци, защото глупавият шофьор чака FieldIndex.Add(2, "TERRIFNSFL"); файл в DOS oov кодиране ( CP866, известен още като OEM ). Той изглежда обмисля формата dbfмного древно, чисто досовско наследство. ArcView по подразбиране счита DBF за формат на Windows ( ANSI1251). Така че тези две програми стоят като два бика, подпряли чела .

И така, причината е ясна, остава само да се коригира. Във връзката въведете танци с тамбураcollate=Машинаилируски / Кодова страница=ANSI / Съпоставяне на последователност = 1251не доведе до успех. Променен29-ти байт Vааа . dbf на 0xC9 - нула емоции. Наистина знакът на кодовата страница в заглавката FieldIndex.Add(2, "TERRIFNSFL"); се игнорира от водача. Въпреки това настройката на драйвера може да бъде променена в системния регистър. Съхранява се в DataCodePage по пътя HKLM\ СОФТУЕР\ Microsoft\ Jet\4.0\ Engines\ xBase или HKLM\ СОФТУЕР\ Microsoft\ Office\14.0\ AccessConnectivityEngine\ Engines\ Xbase или съответно HKLM\ СОФТУЕР\ Wow6432 Node\ Microsoft\ Jet\4.0\ Engines\ xBase или HKLM\ SOFTWARE\ Wow6432 Node\ Microsoft\ Office\14.0\ AccessConnectivityEngine\ Engines\ Xbase в зависимост от това дали е монтиран на колатаофис и ако да как. По подразбиране свойството има стойност OEM което кара водача да чете всичко FieldIndex.Add(2, "TERRIFNSFL"); въз основа на това кодиране. Ако го промените на ANSI


Фиг.12

кирилица в ANSI dbf" д, естествено, ще се чете по човешки:

Фиг.13

За щастие няма нужда да рестартирате, но съветникът за импортиране трябва да се затвори и да се повтори отново от фиг. 1.

Натиснете OKСледваща , завършваме съветника, в резултат на което той имплицитно се създава и изпълнява SSIS- найлонов плик:

Фиг.14

и получаваме боклук. Боже!


Фиг.15

Това всъщност е и разбираемо защо. В таблицатаЗапитване Помощникът създаде поле за резултатите от импортиранеторегион тип varchar (200), без изрично да се посочи сортирането. Следователно по подразбиране е базово съпоставяне. Случи се така, че базатаБаза данни1 имаше неруска колация:


Фиг.16

За да коригирате ситуацията, трябва да направите полерегион Unicode или коригирайте сортирането му. Между другото, нека увеличим дължината му. Да, за всеки случай.


Фиг.17

Запазете структурните промени, изчистете даннитесъкращаване на таблица Заявкаи повторете импортирането Фиг. 1-14


Фиг.18

Сега всичко се внася нормално. Единственото нещо е, че казах „изчистване на данните“, но забравих да направя това сам и на снимката те бяха удвоени. Повече няма да го правя, защото е безпринципно. Смисълът е ясен.

Алексей Шуленин

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

Ако не е възможно да отворите DBF файл директно в Excel, първо трябва да го конвертирате.

Въпреки това, DBF, въпреки че се счита от мнозина за остарял формат, все още се използва широко в специализирани програми в бизнеса, дизайна и инженерството. Навсякъде, където се налага работа с големи обеми информация, тяхното структуриране и обработка и изпълнение на заявки. Например софтуерният пакет 1C Enterprise е изцяло базиран на управление на бази данни. И като се има предвид, че много офис документация и данни се обработват в 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 отидете в менюто с иконата на Microsoft вляво, „Опции“.
  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Достъп.
  2. В Excel подгответе и запазете документа.
  3. Щракнете върху бутона "Отвори" в MS Access и изберете файла.
  4. Сега трябва да конфигурирате правилно импортирането.
  5. Изберете листа, с който да започнете. Ако има няколко от тях, все пак трябва да правите един по един.
  6. Ако таблицата има заглавен ред, поставете отметка в съответното квадратче.
  7. След това можете да промените името на таблицата.
  8. Сега щракнете върху „Външни данни“.
  9. Щракнете върху бутона „Експортиране“, „Разширени“.
  10. Изберете dBase файл.
  11. Посочете име и запазете местоположение.

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

Преобразуване

За да не страдате сами с офис програми, са създадени много приложения, които ви позволяват да прехвърляте данни от един формат в друг. Първо, почти всичко мощни програмиза работа с СУБД предполагат възможност за експорт в XLS и зареждане от него. Второ, има малки помощни програми, които са специализирани в преобразуването. Ето някои от тях:


Във всички тези програми преобразуването се свежда до отваряне на изходния файл и след това стартиране на командата „Конвертиране“ или „Експортиране“.

Има също безплатни услугионлайн реализации. На такива сайтове ще бъдете помолени да изпратите (изтеглите) изходния файл, щракнете върху „Конвертиране“, след което ще се появи връзка към конвертирания документ. Доколко можете да се доверите на подобни услуги, решението е индивидуално, на ваша отговорност и риск.

Така че отворете DBF в програма Excelвъзможно е, но ако версията му е 2007 и по-нова, тогава няма да можете да правите нищо друго с него, просто погледнете. Има специални добавки или програми за редактиране и запис в XLS, както и за конвертиране в обратна посока. Ако имате опит в конвертирането и работата с DBF в различни приложения, споделете вашите съвети в коментарите.

Проста програма за прехвърляне на данни от dbf файлове в таблици Microsoft Excel.


Основата на тази помощна програма е следната: 1C има данни, качени в древния и мощен dBase формат, например списъци със стоки с цени и др. и т.н. Така че някои програми лесно импортират набори от данни от таблици на Excel, но не знаят за dBase.


Upload 1c записва данни в кодиране WIN1251 (разбира се, това може да бъде конфигурирано някъде, не съм проверил), но след отваряне на такъв файл в Excel информацията се показва в „kryakozyabra“. Това се случва, защото Microsoft Excel отваря dBase таблици в CP866 (DOS) кодиране по подразбиране.


Всъщност това, което имам предвид с всичко това, е, че се оказва твърде труден тест за обикновения потребител да разбере как, какво, къде и с какво да прекодира, какви бутони да натиска и какви действия да извършва. Ето защо задачата беше поставена възможно най-просто и веднага.


P.S.: Никога не претендирам за уникалност или гениалност, тъй като интернет е пълен с подобен софтуер, който променя кодирането и прави много повече, но повечето от тях са платени, а допълнителната функционалност само влошава мъките на обикновените хора.


Програма за експортиране на данни от dBase файлове в Microsoft Excel.


Основният прозорец на програмата.


След като програмата се стартира, трябва да кликнете върху бутона "Отвори" и в диалоговия прозорец за избор на файл изберете dbf, който ще бъде експортиран в Excel.


* * *


Основният прозорец на програмата със заредения dbf файл.


Ако файлът е качен успешно, данните за него ще бъдат показани в таблицата. Най-отгоре, в полето "Изходен файл", ще се покаже пълният път и името на изтегления dbf файл.


След това трябва да кликнете върху големия бутон „Експортиране на данни“, намиращ се непосредствено под таблицата с информацията.


* * *


Прозорец с молба да мащабирате колони.


Ако няма проблеми с dbf файла, трябва да видите прозорец с молба да мащабирате размерите на колоните, това означава дали в Excel трябва да разтегнете колоните, за да отговарят на ширината на данните.


* * *


Ако всички операции са успешни, екземплярът на Excel ще бъде стартиран с всички данни, качени в него.

Може да се случи dbf файлът да не съдържа служебна информация за кодирането, в който случай ще се покаже съобщението „DBF файлът не съдържа информация за кодирането“.


На снимките по-долу в червено е показано и написано кой от бутоните „Да” или „Не” трябва да се натисне в един или друг случай:


Ако текстът в таблицата е нечетлив.


* * *


Ако текстът в таблицата се чете нормално.

Характеристики на програмата


Microsoft Excel трябва да бъде инсталиран в системата.
Dbf файловете се отварят в изключителен режим.
Съдържанието на blob полета не се прехвърля.
Ефективността на програмата е тествана на Windows XP и Windows 7.
Помощната програма е абсолютно безплатна и не изисква инсталация, което означава, че я изтегляте и използвате.

WiFi