最近在改公司的订单系统,遇到了一个奇怪的问题。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格式,或直接把整列设成文本格式。
以上是我的个人研究心得,可能实际的情况并非如我测试所得,如高手们有异议,还望不吝赐教!