Excel日期格式单元格写成yyyy.MM.dd格式将无法读取到DataTable
2013-10-08 22:00
435 查看
最近在改公司的订单系统,遇到了一个奇怪的问题。C#程序需要从Excel文件中将数据全部读取到DataTable,其中Excel文件的第一列是日期格式yyyy/MM/dd,而这一列中大部分的单元格都是按设定的yyyy/MM/dd来写,有一小部分(大概不到20%)是以yyyy.MM.dd格式来写的。程序读取Excel工作表的步骤没啥好说的,使用的是OleDB,以连接字符串建立Connection后,借助OleDbDataAdapter将数据填充到DataTable,C#代码如下:
问题是,那些以yyyy.MM.dd格式来写的单元格在读过来以后居然成了空的字符串,这令我十分诧异。初步判断是OleDB不能识别点分隔的日期,于是我把所有的日期单元格都写成点格式,居然可以正常读取。神奇了,继续研究。。。经过一番折腾和测试,终于发现Excel在满足以下条件时,将出现我遇到的问题:1.从第一行开始以标准的yyyy/MM/dd格式达到连续8行及以上;2.其后面的行按yyyy.MM.dd格式来写(无论多少行)。
![](http://images.cnitblog.com/blog/571490/201310/08215636-d217c71345674698baf1c9915a57ffb3.png)
![](http://images.cnitblog.com/blog/571490/201310/08215658-e62d3b3757ce42e3a19428c4f9d08059.png)
总结:不知为什么,Excel中以yyyy.MM.dd格式填写的日期并不会被强制转换成文本格式,而在导出到DataTable时,以这种格式填写的日期会出现上述的奇怪现象。为了规避这个奇怪问题,如果仍然希望使用yyyy.MM.dd格式,可以让第一行或全部的单元格写成yyyy.MM.dd格式,或直接把整列设成文本格式。
以上是我的个人研究心得,可能实际的情况并非如我测试所得,如高手们有异议,还望不吝赐教!
System.Data.DataTable dt; string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Code\\Study\\TestXls.xls;Extended Properties='Excel 12.0;HDR=YES;IMEX=1'"; System.Data.OleDb.OleDbConnection myConn = new System.Data.OleDb.OleDbConnection(strCon); try { myConn.Open(); System.Data.OleDb.OleDbDataAdapter myCommand = new System.Data.OleDb.OleDbDataAdapter("Select * from [Sheet1$]", myConn); dt = new System.Data.DataTable(); myCommand.Fill(dt); myConn.Close(); myCommand.Dispose(); } catch (Exception) { dt = null; } dataGridView1.DataSource = dt;
问题是,那些以yyyy.MM.dd格式来写的单元格在读过来以后居然成了空的字符串,这令我十分诧异。初步判断是OleDB不能识别点分隔的日期,于是我把所有的日期单元格都写成点格式,居然可以正常读取。神奇了,继续研究。。。经过一番折腾和测试,终于发现Excel在满足以下条件时,将出现我遇到的问题:1.从第一行开始以标准的yyyy/MM/dd格式达到连续8行及以上;2.其后面的行按yyyy.MM.dd格式来写(无论多少行)。
![](http://images.cnitblog.com/blog/571490/201310/08215636-d217c71345674698baf1c9915a57ffb3.png)
![](http://images.cnitblog.com/blog/571490/201310/08215658-e62d3b3757ce42e3a19428c4f9d08059.png)
总结:不知为什么,Excel中以yyyy.MM.dd格式填写的日期并不会被强制转换成文本格式,而在导出到DataTable时,以这种格式填写的日期会出现上述的奇怪现象。为了规避这个奇怪问题,如果仍然希望使用yyyy.MM.dd格式,可以让第一行或全部的单元格写成yyyy.MM.dd格式,或直接把整列设成文本格式。
以上是我的个人研究心得,可能实际的情况并非如我测试所得,如高手们有异议,还望不吝赐教!
相关文章推荐
- excel转换日期格式,将yyyymmdd类型日期转换成yyyy-mm-dd等日期类型方法
- 修改 excel 文件中的日期格式为 yyyy-mm-dd
- excel实现不规范的日期转换成yyyy-mm-dd的格式
- oracle 导出csv里日期无论是yyyy-m-d格式还是yyyy-mm-dd格式都无法导入。
- Excel限定输入日期格式是yyyy-mm-dd(亲自实践)
- jquery validation yyyy-MM-dd格式日期在ie中无法验证通过
- Date( )日期格式Sun Sep 30 00:00:00 CST 2012转换成yyyy-mm-dd
- 校验日期格式yyyy-MM-dd及两日期比较
- sql 转换成yyyy-mm-dd格式和SqlServer中得到当前日期(convert函数,getdate函数)
- 简单设置让EasyUI显示中文,日期选择框格式为yyyy-MM-dd格式
- js功能比较全面的yyyy-MM-dd格式的日期验证正则
- dojo中DateTextBox日期格式yyyy-MM-dd转化为数据库中yyyyMMdd
- rdlc报表的日期格式"yyyy/mm/dd 00/00/00"转换为"yyyy-mm-dd"
- js 时间计算(加减天数、返回当前时间后一个星期的日期,返回格式yyyy-MM-dd)
- 时间戳格式化转换为日期格式,date.Format('yyyy/MM/dd hh:mm:ss')
- 在EL表达式或者Struts标签库中格式化日期对象,即将Date转换为yyyy-MM-dd格式
- maximo 中修改日期的格式为yyyy-mm-dd
- 如何用sql语言只获得数据库当前日期,且格式为"yyyy-mm-dd"?
- Win7时间日期格式YYYY/MM/DD改为YYYY-MM-DD
- 正则表达式实现将MM/DD/YYYY格式的日期转换为YYYY-MM-DD格式