C#彻底解决Oledb连接Excel数据类型不统一的问题

移动开发 Android
在使用Microsoft.Jet.OLEDB.4.0连接Excel,进行读取数据,相对使用传统的COM来读取数据,效率是很高的。但相对传统COM操作Excel来说,及存在数据类型转换的问题。因为使用OLEDB连接Excel读取数据时,需要确定数据的类型。默认情况使用连接字符串:

在使用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/。下面列出了网上出现解决该问题方法的比较:

这里提供一个更加方便的办法,不过前提是***行必须是作为字段名或者***行的数据类型就为字符型。这样一说,大家就明白了。首先修改连接字符串为:

  1. view source 
  2. print ? 
  3.  
  4. //2003(Microsoft.Jet.Oledb.4.0) 
  5. string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath); 
  6.  
  7. //2010(Microsoft.ACE.OLEDB.12.0) 
  8. 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行判断列的数据类型,如果有字符型数据,那么就强制混合数据转换为 文本。这里就明白为什么要保证***行为字符型的原因了。能将列的数据类型强制设为字符型,那么列中出现什么类型的数据都不怕了。需要做的工作就是,在获取 完数据后,将字段名重新设置,并删除***条记录即可。代码如下:

  1. view source 
  2. print ? 
  3. 01. DataTable dt = new DataTable(); 
  4. 02.    
  5. 03. using(OleDbCommand cmd = new OleDbCommand()){ 
  6. 04.     cmd.Connection = conn; 
  7. 05.     cmd.CommandType = CommandType.Text; 
  8. 06.     cmd.CommandTimeout = 6; 
  9. 07.     cmd.CommandText = string.Format("select * from [{0}$]", sheetName); 
  10. 08.    
  11. 09.     OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 
  12. 10.     adapter.Fill(dt); 
  13. 11. } 
  14. 12.    
  15. 13. if (dt.Rows.Count > 0) { 
  16. 14.     DataRow dr = dt.Rows[0]; 
  17. 15.    
  18. 16.     for (int col = 0; col < dt.Columns.Count; col++) { 
  19. 17.         dt.Columns[col].ColumnName = dr[col].ToString(); 
  20. 18.     } 
  21. 19.    
  22. 20.     dt.Rows[0].Delete(); 
  23. 21.     dt.AcceptChanges(); 
  24. 22. } 
责任编辑:chenqingxiang 来源: oschina
相关推荐

2009-11-27 10:31:02

GPRS路由

2021-12-03 12:15:01

QT中文乱码Windows

2009-09-07 10:48:53

C#数据类型

2009-08-27 15:47:00

C#数据类型string

2009-09-04 10:16:30

C#数据类型

2011-06-08 13:35:18

C#数据类型

2010-01-04 15:05:53

2009-08-12 16:26:27

C#数据类型转换

2023-02-27 08:08:54

Pulsar源码重复消费

2009-09-11 12:00:33

C#预定义数据类型

2010-01-14 10:19:05

2023-11-28 08:36:16

Spring中Body读取

2009-08-13 15:19:17

C#数据类型

2010-01-11 18:05:24

VB.NET窗体继承

2020-09-28 14:41:24

Event Loop

2009-08-14 13:52:18

C#判断数据类型

2009-09-01 16:35:55

C#操作String数

2024-05-20 00:00:00

代码主线程

2009-12-25 09:39:08

ADSL MODEM

2022-05-31 09:01:13

GitHub工具安全
点赞
收藏

51CTO技术栈公众号