新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇内容主要讲解“如何用C#解决Oledb连接Excel数据类型不统一的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用C#解决Oledb连接Excel数据类型不统一的问题”吧!
成都一家集口碑和实力的网站建设服务商,拥有专业的企业建站团队和靠谱的建站技术,10年企业及个人网站建设经验 ,为成都上1000家客户提供网页设计制作,网站开发,企业网站制作建设等服务,包括成都营销型网站建设,高端网站设计,同时也为不同行业的客户提供网站建设、成都网站建设的服务,包括成都电商型网站制作建设,装修行业网站制作建设,传统机械行业网站建设,传统农业行业网站制作建设。在成都做网站,选网站制作建设服务商就选创新互联。
在使用Microsoft.Jet.OLEDB.4.0连接Excel,进行读取数据,相对使用传统的COM来读取数据,效率是很高的。但相对传统COM操作Excel来说,及存在数据类型转换的问题。
因为使用OLEDB连接Excel读取数据时,需要确定数据的类型。默认情况使用连接字符串:
view source
print ?
1. string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;'";
使用上面的连接字符串连接Excel时,可能会遇到数据类型不一致的问题。所谓数据类型不一致,是指同一列里面数据类型可能出现多种,如浮点数、字符串、日期等;当出现此类情况时,读取出来的数据就为空,甚至会报错,如“非法的日期格式”等异常。出现这种问题,我们大家都会想到把数据全部都按字符数据来读取,但是按什么数据类型来读取不是我们能控制的,是OLEDB控制的,至少暂时我还没有找到能控制输出数据类型的方法。因为我当初也尝试使用convert,cast函数对输出的列进行类型转换,但oledb连接Excel时,使用的SQL不支持这些函数。因此只能从其他角度来解决该问题。我也在网上搜索了很多解决方法,最全面的解决方法是:http://www.douban.com/note/18510346/。下面列出了网上出现解决该问题方法的比较:
这里提供一个更加方便的办法,不过前提是***行必须是作为字段名或者***行的数据类型就为字符型。这样一说,大家就明白了。首先修改连接字符串为:
view source print ? //2003(Microsoft.Jet.Oledb.4.0) string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath); //2010(Microsoft.ACE.OLEDB.12.0) string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);
这里将HDR设为NO,因为我就是将***行做为数据读取,而IMEX=1就表示根据前8行判断列的数据类型,如果有字符型数据,那么就强制混合数据转换为 文本。这里就明白为什么要保证***行为字符型的原因了。能将列的数据类型强制设为字符型,那么列中出现什么类型的数据都不怕了。需要做的工作就是,在获取 完数据后,将字段名重新设置,并删除***条记录即可。代码如下:
view source print ? 01. DataTable dt = new DataTable(); 02. 03. using(OleDbCommand cmd = new OleDbCommand()){ 04. cmd.Connection = conn; 05. cmd.CommandType = CommandType.Text; 06. cmd.CommandTimeout = 6; 07. cmd.CommandText = string.Format("select * from [{0}$]", sheetName); 08. 09. OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 10. adapter.Fill(dt); 11. } 12. 13. if (dt.Rows.Count > 0) { 14. DataRow dr = dt.Rows[0]; 15. 16. for (int col = 0; col < dt.Columns.Count; col++) { 17. dt.Columns[col].ColumnName = dr[col].ToString(); 18. } 19. 20. dt.Rows[0].Delete(); 21. dt.AcceptChanges(); 22. }
到此,相信大家对“如何用C#解决Oledb连接Excel数据类型不统一的问题”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!