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这个驱动程序的整型标志符; 其他 驱动程序的整型标识符: 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\";
重点提示! 双引号 " 需要在你的编程语言中进行字符转义处理 检查本地注册表键值 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是指什么: HDR 有两个可选的值:Yes或者No,默认是Yes; 指是否需要列标题,Yes表示第一行当作列标题来处理,No则把第一行当作数据内容来处理;一般我们用到的导入导出的Excel都是有标题栏的,那就可以不写这个参数或者设为Yes。 IMEX有三个可选的值:0,1和2,默认是0; 微软是这样解释的: 关于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连接openGauss实操
- 导出到Excel时,如果数值型字符串太长,会显示成科学记数法的形式。如字串“1111111111111”“1.11111E+14”请问有何办法??
- oracle jdbc 连接字符串
- Oracle 多行记录合并/连接/聚合字符串的几种方法
- SQL 把多个字段连接成一个字符串、替换字符串字段中的某些字符串
- 求一条sql语句,如何将一列字符串查询出来并全部连接成一个字符串?
- 怎样把一个字符串数组连接成一个新的字符串?
- Excel连接openGauss数据库实操
- 如果列名不从第一行开始,如何使用OLEDB查询从Excel获取列名
- Groupby在熊猫dataframe上,并根据列中的值的频率用逗号连接字符串