Excel日期格式单元格写成yyyy.MM.dd格式将无法读取到DataTable

时间:2024-03-04 18:18:00

最近在改公司的订单系统,遇到了一个奇怪的问题。C#程序需要从Excel文件中将数据全部读取到DataTable,其中Excel文件的第一列是日期格式yyyy/MM/dd,而这一列中大部分的单元格都是按设定的yyyy/MM/dd来写,有一小部分(大概不到20%)是以yyyy.MM.dd格式来写的。程序读取Excel工作表的步骤没啥好说的,使用的是OleDB,以连接字符串建立Connection后,借助OleDbDataAdapter将数据填充到DataTable,C#代码如下:

 1        System.Data.DataTable dt;
 2             string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Code\\Study\\TestXls.xls;Extended Properties=\'Excel 12.0;HDR=YES;IMEX=1\'";
 3             System.Data.OleDb.OleDbConnection myConn = new System.Data.OleDb.OleDbConnection(strCon);
 4             try
 5             {
 6                 myConn.Open(); System.Data.OleDb.OleDbDataAdapter myCommand = new System.Data.OleDb.OleDbDataAdapter("Select * from [Sheet1$]", myConn);
 7                 dt = new System.Data.DataTable();
 8                 myCommand.Fill(dt);
 9                 myConn.Close();
10                 myCommand.Dispose();
11             }
12             catch (Exception)
13             {
14                 dt = null;
15             }
16             dataGridView1.DataSource = dt;
17             

 

问题是,那些以yyyy.MM.dd格式来写的单元格在读过来以后居然成了空的字符串,这令我十分诧异。初步判断是OleDB不能识别点分隔的日期,于是我把所有的日期单元格都写成点格式,居然可以正常读取。神奇了,继续研究。。。经过一番折腾和测试,终于发现Excel在满足以下条件时,将出现我遇到的问题:1.从第一行开始以标准的yyyy/MM/dd格式达到连续8行及以上;2.其后面的行按yyyy.MM.dd格式来写(无论多少行)。

总结:不知为什么,Excel中以yyyy.MM.dd格式填写的日期并不会被强制转换成文本格式,而在导出到DataTable时,以这种格式填写的日期会出现上述的奇怪现象。为了规避这个奇怪问题,如果仍然希望使用yyyy.MM.dd格式,可以让第一行或全部的单元格写成yyyy.MM.dd格式,或直接把整列设成文本格式。

以上是我的个人研究心得,可能实际的情况并非如我测试所得,如高手们有异议,还望不吝赐教!