研究xls转DBF已经有一段时间了,平时忙没有时间和各位高手交流,今天有时间,正好也有人问,就多说说。
首先,我不知道你们是如果转换xls 到DBF 的,如果是用Excel2003另存,这种方式不在今天我的讨论范围之内,而且这种方式有隐患,以前讲过的。
今天只讨论的用代码来转换的问题。
代码转换xls 到DBF ,有两种思路,或者说,是两种访问机制,容我慢慢的说。
1、用Ado方式,建立到xls的连接,把数据读取到RecordSet,根据RecordSet每一列的属性,建立一个结构对应的空DBF,再循环RecordSet,把数据输出到DBF。
2、OLE方式,这是比较常见的方式,建立一个OLE对象,把xls打开,再根据xls中每一列的属性,建立一个结构对应的空DBF,再把Sheet上的数据读入到数组,最后,把数组输出到DBF。这种方式在多种情况下是适用的。
3、不过,当xls本身比较大,而用户的内存比较小的时候,这种方式会暴露出运行效率低的问题,甚至在有的机器上会卡死,于是,又在此基础上,衍生了第三种方式:
前面的做法和OLE方式差不多,最后的差别在于,不再把数据读入到数组里,而是先控制OLE对象,把Sheet内容另存为CSV 或TXT文本,最后,用Append From ...txt Deli wtih ...或者 Append From ...CSV type CSV 的方式,把数据输出到DBF。这种方式,为了叙述方便,我把它叫做CSV方式,和OLE相比,优点是比较节约内存。但是,也存在着明显的限制。下面我们详细的说说到底限制在哪里?
OLE方式把数据读取到数组,他读的是单元格的“值”也就是Value,而CSV方式,由于先另存为文本文件,再导入到DBF,那么他实际上取的是单元格的“Text”,单元格的Value和Text,这两个东西,当单元格是数值、文本的时候,似乎没有区别,但是,当单元格是日期、时间类型的时候,会发生较大的差异而这种徧差,恰好是OLE和CSV两种读取方式的差异所在。为了说明问题,我们专门设置一个示例,由下图可以看到:Excel中,日期、时间的表现形式是多样的,他允许每一列都可以有不同的表现形式。
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
那么,如果我们用几种不同的方法去转换到DBF,最终结果一样吗?是不是所有的日期都能被正确的转换?
(待续)