Excel的连接字符串参数详解

2011-07-27 15:43:50|  分类: 编程专栏 |  标签:excel  连接字符串  参数  含义   |字号大中小 订阅

 
 

程序中读取Excel数据一般有两种连接方式:ODBC和OLEDB;

ODBC连接字符串

Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\MyExcel.xls;DefaultDir=c:\mypath;

解释下 DriverId=790: 790是Microsoft   Excel   97这个驱动程序的整型标志符;

其他 驱动程序的整型标识符:   
      25   (Microsoft   Access)   
      21   (dBASE   III)   
      277   (dBASE   IV)   
      533   (dBASE   5.0)   
      534   (Microsoft   Excel   3.0)   
      278   (Microsoft   Excel   4.0)   
      22   (Microsoft   Excel   5.0/7.0)   
      790   (Microsoft   Excel   97)   
      26   (Paradox   3.x)   
      282   (Paradox   4.x)   
      538   (Paradox   5.x)   
      27   (Text)

OLEDB连接字符串

Excel 97-2003都是用下面这个
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
 
Excel2007不再使用Jet,而是使用ACE,如下:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";

重点提示!

双引号 " 需要在你的编程语言中进行字符转义处理
c#, c++   \"
VB6, VBScript   ""
xml (web.config 等)   "
或者使用 ' 
HDR=Yes,代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
"IMEX=1;" 通知驱动程序以文本格式读取混合型的列(如数字、日期、字符串等)。需要注意的是,这个选项可能会导致Excel文件的写入拒绝
SQL 语法 "SELECT [列名1], [列名12] FROM [Sheet1$]". 即Excel工作表名后加上"$",在"[ ]"内加入列名

检查本地注册表键值

   Excel97-2003:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]
   Excel2007:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel]
找到其中的 "TypeGuessRows"(REG_DWORD数据类型)键。这个数值表示,决定ISAM驱动程序从前n条数据采样确定数据类型,默认为8,将这个值改成0,可以对所有行进行采样,不过性能开销很大。另请注意,有些时候,设置选项IMEX=1可能会导致IMEX驱动程序只进行8行采样。用IMEX=0代替可以确定注册表值TypeGuessRows=0起效
如果Excel设置了密码保护,将不能打文件开读取数据,哪怕是在连接字符串中配置了正确的密码,你会收到这样的错误信息 "Could not decrypt file"

说一下 Extended Properties这几个Key是指什么:
   Excel8.0指Excel的驱动版本,从Excel97到2003都用这个,Excel2007中开始用Excel12.0;

HDR 有两个可选的值:Yes或者No,默认是Yes; 指是否需要列标题,Yes表示第一行当作列标题来处理,No则把第一行当作数据内容来处理;一般我们用到的导入导出的Excel都是有标题栏的,那就可以不写这个参数或者设为Yes。

IMEX有三个可选的值:0,1和2,默认是0; 微软是这样解释的:
        0 is Export mode    -------导出模式(从Excel文件读取数据时使用)
        1 is Import mode     -------导入模式(向Excel文件插入数据时使用)
        2 is Linked mode (full update capabilities)  -----Linked模式(需要完全更新Excel文件时使用) 
这个值具体有啥影响呢?  
上传的Excel数据中如果既有数字型,又有文本型,则上传后读到DataTable中,发现文本的单元格都是空(有时是第一列的数字型值为空);尝试用模板文件来限定数据类型,根本不顶用!    
      使用Remark在Excel模板中标注,这个只能提醒User,但也不能保证User输入的结果啊!
      使用宏定义来强制转化类型,大多情况下,都是禁用宏的,客户端的事,更是难以控制,所以这个方法用在这里也不是最好的~! 
所以,还是把解决问题的思路回归到Server端: 解决读不到混合格式的Excel数据的问题;     

 
        关于Excel中的数据类型缺省值,MS是这样说的:Excel 驱动程序读取指定源中一定数量的行(默认情况下为 8 行)以推测每列的数据类型。如果推测出列可能包含混合数据类型(尤其是混合了文本数据的数值数据时),驱动程序将决定采用占多数的数据类型,并对包含其他类型数据的单元返回空值。(如果各种数据类型的数量相当,则采用数值类型。)Excel 工作表中大部分单元格格式设置选项不会影响此数据类型判断。可以通过指定导入模式来修改 Excel 驱动程序的此行为。
简单点,其实对我们有用就是这样:IMEX=0的时候读取Excel中的数据时,它还是根据上述的默认8行规则来确定数据类型; IMEX设为1时,将把所有单元格数据都作为文本类型来处理; 当设置IMEX为2时,用来更新Excel中的数据用;

问题还没有结束!!  如果在前八行内的数据类型是数字型,且在第八行之后如果出现字符,则字符数据一样的读不到~!

这个问题需要修改注册表来解决:

将Server上注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\ 下的TypeGuessRows这个键值改为一个较大的数;  如果预估一次要上传的资料数量最大为1000的话,那就设为一个比1000稍大的值即可;(注:也不要改太大,因为太大会降低上传Excel时的性能;这个值最大可为65535,)

原因:读取Excel的Microsoft Jet4.0驱动默认按照前八行(标题行除外)来判断该列的数据类型,之前有微软有说法是在读取Excel的数据时,设置连接字符串的扩展参数IMEX=1 就会把混合类型的数据列当作文本来处理,但实际上效果并不完全是这样的;   即使设置了IMEX=1,或者把上传的Excel的列数据格式都设置为文本型,Jet驱动其实还是按照前八行来判断数据类型的,只有当前八行数据中出现既有文本型又有数字型(也即前八行为混合型数据),并设置IMEX=1时,该列数据才会当作文本来处理;  所以我们的解决办法就是把MS Jet这个定义的“8”这个值改大,这样当在第八行以后出现字符时,Jet驱动就会把这列值当作文本来处理,这样就能读到值了。

如此一来,只要设置IMEX=1,则任何在设置的这个范围内的行如果出现混合类型的数据,都将会作为文本来处理,这样就能保证Jet驱动一定能读到Excel中的值(不是混合类型的列会不会读不到? 这点相信微软的实力,对同一类型的数据Jet是绝对能识别的;)

最后举一个取Excel中值的SQL语句的例子,如:select 姓名,年龄 from [Sheet1$],

"Sheet1"可换成你更改的当前Sheet页的名称,如:select 姓名,年龄 from [学生名单$]

 

Excel连接字符串(Oledb)的更多相关文章

  1. Excel连接字符串在.NET中的应用

    转:https://www.cnblogs.com/jaxu/archive/2011/07/29/2121022.html 介绍几种在.NET中直接连接Excel作为数据源的几种方法以及连接字符串的 ...

  2. 使用OLEDB读取不同版本Excel数据的连接字符串设置

    摘要: 用OLEDB通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的/// summary // ...

  3. OLEDB 连接EXCEL的连接字符串IMEX的问题(Oledb)

    今天碰到一个问题需要想EXCEL表中写数据,折腾了好久才发现是IMEX惹得祸,所以记录下提醒自己,也希望大家不要出同样的错. 碰到问题:使用语句 "insert into [Sheet1$] ...

  4. C# 使用OLEDB读取不同版本Excel数据的连接字符串

    用OLEDB通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的 /// <summary&g ...

  5. 通过数据库方式访问excel 2007及其以后(xlsx)文件的连接字符串

    sqlconn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\test3.xls;Extended Properties=&q ...

  6. c# 导出2007格式的Excel的连接字符串

    上次做了个导出excel文件的客户端软件,没有注意到:当打开2007版的excel时提示错误“外部表不是预期的格式”,刚才网上荡了点资料,改了一下连接字符串,问题解决了: 把:string strCo ...

  7. 转:ADO.NET连接字符串

    名称 ADO.NET连接字符串 说明 ADO.NET连接字符串:SQL Server,SQL Server 2005,ACCESS,Oracle,MySQL,Interbase,IBM DB2,Syb ...

  8. Excel 读取字符串引发的问题

    将EXCEL数据导出的时候如果同一列数据中既有文字,又有数字!读取时一列中要么文字丢失只剩下数字,要么数字丢失,只剩下文字,这是由第一行的数据类型决定的.出现这种问题是由于数据类型不统一造成的. 连接 ...

  9. ADO.NET入门教程(三) 连接字符串,你小觑了吗?

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/12/2347914.html 摘要 ADO.NET强大的优势在于对不同的数据源提供一致的访问 ...

随机推荐

  1. 【leetcode】1. Two Sums

    题目 https://leetcode.com/problems/two-sum/   Given an array of integers, find two numbers such that t ...

  2. 针对上一篇文章中的代码,想出的重构方案(python实现)

    #!/usr/bin/env python class Processor: def __init__(self, processor): self.processor = processor def ...

  3. Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2)

    Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2) 上一节主要介绍了SolrCloud分布式索引的整体流程图以及索引链的实现,那么本节开始将分别介绍三个索引过程即LogUpdat ...

  4. 转:为什么要使用NoSQL

    为什么要使用NoSQL NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面.今年伊始,InfoQ中文站有幸邀请到凤凰网的孙立 ...

  5. DC-DC芯片 同步和異步方式有什么區別

    同步方式是集成了High side和Low side MOSFET,組成同步整流模式,可實現高效率,價格相對貴.異步方式只有High side MOSFET;配合外部使用傳統的續流二極管,組成非同步整 ...

  6. !!!全球最流行开源硬件平台!不知道就OUT了!

    全球最流行的几个开源硬件平台!不知道就OUT了! 随着物联网的推广和普及,五年内全球会有200亿台智能设备的需求,而如今随着创客概念的兴起,开源硬件也越加的火热,让我们来看看现在都有哪些主流的开源硬件 ...

  7. BZOJ 1013 [JSOI2008]球形空间产生器sphere

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3074  Solved: 1614[Subm ...

  8. LeetCode——Permutations

    Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ...

  9. git bash中避免在push时反复输入用户名和密码

    我用的是windows系统,这几天学着使用git时发现每次使用git push时每次都要输入一遍用户名和密码,感觉特烦,特意上网查了下,找到了简化方法.虽然不是原创,但至少算是加了点自己的心得和经验吧 ...

  10. XML初学笔记

    一.基本概要: XML,全称是eXtensible Markup Language,可扩展的标记语言,是Web服务的基础之一,使用XML,用户可以定义自己需要的标记.而用户创建的标记可以使用文档类型定 ...