2023年12月22日发(作者:)

编写EXCEL文件转DBF文件要知的资料

自从微软自EXCEL2007开始取消了另存为DBF文件功能之后。我只好用国产WPSOFFICE中的ET把EXCEL文件转换成DBF文件了。而其他软件都是收费的,所谓在线转换工具更就是个笑话。

不过ET的转换也不完美,偶然会碰到情况,不知为何只能转换前几列数据的情况。这时要先把EXCEL表格先另存为CSV文件,然后再读入CSV文件再另成为DBF文件。

而且,用ET打开DBF文件编辑,若是增加新纪录后保存,往往DBF文件中记录个数是不变的,造成后面的纪录自动丢失。

因此我尝试自己写程序来转换,发现光从网上找到的DBF文件头结构资料是不够的,经过参考ET转换出来的DBF文件,发现若要正确转换成DBF文件,还有几个分隔符和某些格式需要注意。

(一)首先是前32字节的DBF文件头资料,这部分及第(二)部分基本上是从网上复制来的资料,参考(/weixin_30896657/article/details/95757196)

1.表头记录的结构:

字节偏移 说明

0 文件类型

0x02 FoxBASE

0x03 FoxBASE+/dBASE III PLUS,无备注

0x30 Visual FoxPro

0x43 dBASE IV SQL 表文件,无备注

0x63 dBASE IV SQL 系统文件,无备注

0x83 FoxBASE+/dBASE III PLUS,有备注

0x8B dBASE IV 有备注

0xCB dBASE IV SQL 表文件,有备注

0xF5 FoxPro 2.x(或更早版本)有备注

0xFB FoxBASE

1 - 3 最近一次更新的时间(YYMMDD)

其中第1字节是年份,其值+1900就是建立的年份,第2字节的值是月份,第3字节的值是日期

4 - 7 文件中的记录数目

第4字节的值是总记录数/256后的余数,一般第5字节的值*256 + 第4字节的值为记录总数目。

8 - 9 第一个数据记录的位置

第8字节的值是位置/256后的余数,一般第9字节的值*256 + 第8字节的值为记录在DBF文件中开始的位置。

10 - 11 每个数据记录的长度(包括删除标记)

数据记录的总长度是每个字段长度之和再+1,第10字节的值是记录长度/256后的余数,一般第11字节的值*256 + 第10字节的值为每条记录的长度。

12 - 27 保留

28 表的标记

0x01具有 .cdx 结构的文件

0x02文件包含备注。

0x04文件是数据库(.dbc)

请注意,这个字节可以包含任何上面值的和。例如,0x03 表明表具有结构化.cdx和一个备注字段。

29 代码页标记

30 - 31 保留,包含 0x00

(二)然后文件头的第二部分,这部分是DBF文件中每个字段的字段名及其类型、长度等信息,每一个字段名要占用32字节长度。

0-10 字节,共11字节 用于记录字段名,字段名居左,后面不足位填0x00

11 字段类型,为一个ASCII字符

C-字符型

Y-货币型

N-数值型

F-浮点型

D-日期型

T-日期时间型

B-双精度型

I-整型

L-逻辑型

M-备注型

G-通用型

C-字符型(二进制)

M-备注型(二进制)

P-图片型

12 - 15 记录中该字段的偏移量

16 字段长度(以字节为单位)

17 小数位数

18 字段标记

0x01系统列(用户不可见)

0x02可存储 null 值的列

0x04二进制列(只适于字符型和备注型)

19 - 32 保留

(三)数据记录部分

注意,前面的文字头与这部分之间必须以一个字符0x0D分隔。

之后就是DBF文件的逐条记录数据。

每条记录的长度是所有字段的长度之和+1,每个记录以空格符0x20开头,然后每个字段按其长度分配,数值型字段居右,不足位前面以0x20填充。而字符型和日期型字段数据则是居左,不足位后面以0x20填充。

另外,日期型字段必须转换成YYYYMMDD格式,不能保留分隔符。

最后,DBF文件要以字符0x1A结束。