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结束。
发布评论