| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1133 人关注过本帖
标题:请教大侠们,execl文件转dbf文件时“出生日期”出现问题
只看楼主 加入收藏
一片缥缈
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-8-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
请教大侠们,execl文件转dbf文件时“出生日期”出现问题
请教,我在把一份execl文件转dbf文件时,dbf文件中“出生日期”会自动变成文本格式,如execl文档中“1998-9-6”变为dbf文件中“36044”,因为我要导入的数据库只接受1998-9-6这种格式,变成文本格式数据库显示不出来,想了很多办法也弄不出来,不知道是怎么回事,还请大家能指点一二。
以前我也是同样的方法操作的,转化的时候出生日期这样操作是没有问题的,不知道这次怎么回事?系统也没有升级,操作软件也是没有变过。
感激感激。
搜索更多相关主题的帖子: 文件 dbf 出生日期 格式 操作 
2017-08-14 13:58
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:989
专家分:4946
注 册:2013-2-16
收藏
得分:7 
关键看你是怎么转换的,如果是整体转换,不好弄,如果你是逐格读取,可以尝试读取单元格的.Text 值,不要读取 .value 。
2017-08-14 16:26
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9809
专家分:26997
注 册:2012-2-5
收藏
得分:7 
?CTOD('1899.12.30')+36044
看下结果是否是你要的

坚守VFP最后的阵地
2017-08-14 21:51
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:989
专家分:4946
注 册:2013-2-16
收藏
得分:0 
研究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,最终结果一样吗?是不是所有的日期都能被正确的转换?
(待续)
2017-08-16 17:03
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:989
专家分:4946
注 册:2013-2-16
收藏
得分:0 
1、先来看ADO方式转换出的结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

可以看到,这种方式最大限度的保留了“值”,比如中文日期、英文日期,虽然转换后,表现形式丢失了,但是他的日期值是正确的。
2、再来看OLE方式:
图片附件: 游客没有浏览图片的权限,请 登录注册

和ADO方式类似,由于他读取的是Value,所以日期值是正确的。
3、最后,是CSV方式的结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

由于前面讲过,这种方式实际读取的是单元格的Text,所以,即使某些列是日期型或日期时间型,转换为DBF时,DBF的对应列,不宜再按原数据类型,设置为日期或日期时间型,而是设置为文本型为宜,否则,这些日期值都会丢失。当然,他的好处,是保留了xls文件中日期的表现形式,可以说是“原汁原味”,缺点是数值的类型,只能用文本型了。保留值还是保留表现形式呢?当然应该根据用户自己的需要来定。

换言之,以上三种方法,没有绝对的好坏之分,应根据用户的要求,来决定采用哪一种方式。
……

2017-08-16 17:24
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:7 
回复 楼主 一片缥缈
楼主,我实验了一下,如果Excel中的字段仅是日期型,挺好办的,方法如下:
1、把Excel表的所有字段名改成符合FoxPro自由表字段名的规范,但不得含有中文和其它全角字符,否则导入会失败;
2、打开FoxPro,从“文件”菜单中选“导入...”命令,然后在弹出的对话框中点右边最下面的“导入向导”按钮,进入导入向导;
3、在向导的“第二步-确定数据格式”窗口中,将“开始导入行”后面的值改为2。即,从第二行开始导入,因为第一行是字段名;
4、在向导的“第三步-定义导入的字段”窗口中,不要改变字段的类型,保持字符型;
5、第三步后直接点击“完成”钮,结束向导,FoxPro会自动生成并打开该DBF文件;
6、修改表结构,将这个日期型字段的类型修改为“日期型”即可。

但,日期时间型比较难弄,用上述方法不行。因为Excel记录日期时间型时用了数值的形式,即使按字符型导入到FoxPro也无法转换,因为FoxPro要求字符型的内容形式必须完全和日期时间型相同才能转换。而且,也无法在FoxPro中将该数值转换成与Excel一样的日期时间值,因为FoxPro存储日期时间型数据的高四位日期值时,用的是儒略计数法,与Excel的完全不同。

[此贴子已经被作者于2017-8-16 21:49编辑过]

2017-08-16 21:38
快速回复:请教大侠们,execl文件转dbf文件时“出生日期”出现问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016595 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved