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




这里提供一个更加方便的办法,不过前提是第一行必须是作为字段名或者第一行的数据类型就为字符型。这样一说,大家就明白了。首先修改连接字符串为:
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数据类型不统一的问题的更多相关文章
- 关于OleDB连接Excel的Extended Properties(扩展属性)HDR=YES; IMEX=2个人理解心得
		近期在用C#写一个创建Excel并将数据导出到Excel的WinForm程序, 让我对OleDB连接Excel的Extended Properties(扩展属性)HDR=YES; IMEX=2有了深刻 ... 
- ArcGIS中的数据连接问题——数据类型不统一
		博主在研究空间数据分布的时候经常会用到 ArcGIS 进行空间数据可视化.但是有时候会由于数据类型不统一而无法将 csv 中的数据连接到底图上.比如在底图中的数据是字符串格式,而 csv 中是数字格式 ... 
- C#使用oledb连接excel运行Insert Into语句出现“操作必须使用一个可更新的查询”的解决的方法
		我错误发生时的环境:Windows 7,Framework 4.0,Microsoft Office 2007,VS2010,c# WinForm. 部分代码: string strConn = &q ... 
- OLEDB 连接EXCEL的连接字符串IMEX的问题(Oledb)
		今天碰到一个问题需要想EXCEL表中写数据,折腾了好久才发现是IMEX惹得祸,所以记录下提醒自己,也希望大家不要出同样的错. 碰到问题:使用语句 "insert into [Sheet1$] ... 
- C#读取Excel文件:通过OleDb连接,把excel文件作为数据源来读取
		转载于:http://developer.51cto.com/art/200908/142392.htm C#读取Excel文件可以通过直接读取和OleDb连接,把excel文件作为数据源来读取: ... 
- Excel的 OleDb 连接串的格式
		Excel的 OleDb 连接串的格式(Provider=Microsoft.ACE.OLEDB)(2012-08-02 13:04:20) string strCon = "Provide ... 
- 一起学微软Power BI系列-使用技巧(2)连接Excel数据源错误解决方法
		上一篇文章一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库中,我们介绍了Power BI Desktop中连接Oracle和Mysql的方法,其实说到底还是驱动的问题, ... 
- ADO.NET(OleDb)读取Excel表格时的一个BUG
		如果我们有例如以下一个Excel表格: 如今要使用C#程序读取其内容: using System; using System.Data.OleDb; namespace Skyiv.Be ... 
- 关于oledb对Excel的读取
		这两天项目需求要检索excel的内容,于是就研究了一下,话不多说,我就直接贴代码1.首先是连接excel. public DataTable SearchSheetToDT(string strSea ... 
随机推荐
- ES6方面重点摘要
			1.变量声明(1)内层变量覆盖外层变量(即后面的覆盖前面的)(2)循环变量的声明,i值在全局范围内有效,所以最后输出的都是最后一轮i的值(3)let.const的引入,为JS增加了块级作用域的概念(c ... 
- CMAKE 编译报错
			报错如下: CMake Error: your C compiler: "CMAKE_C_COMPILER-NOTFOUND" was not found. 没有安装 gcc 和 ... 
- 20160208.CCPP体系具体解释(0018天)
			程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针具体解 ... 
- SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证)
			落雨 cas 单点登录 本篇将讲解cas-server端的认证方式 1.最简单的认证,用户名和密码一致就登录成功 2.配置Oracle的jdbc数据源,通过spring动态查询数据库 3.配置orac ... 
- sql NextResult()多个结果集
			转自 http://blog.csdn.net/limlimlim/article/details/8626898 注意:当SQL语句中出现两条Select语句,例如:string sql = &q ... 
- Java 调用存储过程、函数
			一.Java调用存储Oracle存储过程 测试用表: --创建用户表 create table USERINFO ( username ) not null, password ) not null ... 
- 斯坦福《机器学习》Lesson5感想———1、成学习算法
			在前面几课里的学习算法的思路都是给定数据集以后.确定基于此数据集的最佳如果H函数,通过学习算法确定最佳如果H的各个參数,然后通过最佳如果函数H得出新的数据集的结果.在这一课里介绍了一种新的思路,它的核 ... 
- Php函数之end
			Php函数之end end()函数 (PHP 4, PHP 5, PHP 7) end - 将数组的内部指针指向最后一个单元 说明 mixed end ( array &$array ) en ... 
- 【Excle数据透视表】如何快速选定数据透视表的汇总行并添加绿色底纹
			数据透视表创建好之后,如何批量将汇总行的底色修改为绿色呢?目标效果图如下: 解决方案 "启用选定内容"选取所有汇总行 单击任意汇总字段(如:北京 汇总)→选择→启用选定内容→开始→ ... 
- UIWebView 加载网页、文件、 html
			UIWebView 是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过al ... 
