天天看点

将Excel文件当作数据库访问时同一列数据类型不同时读取不到数据

使用程序访问Excel文件时,如果文件是标准的Excel文件格式,可以使用com组件进行访问,也可以将Excel文件当做数据库文件访问

com组件访问的好处是显而易见的,可以对Excel里的单元格进行读取,也可以进行修改,同时也带来一个问题就是访问速度慢。

用数据库的方式来访问,好处就是简单快捷,缺点就是只能操作数据,无法操作格式。

但是很多时候我们可能仅仅只是想要做数据读取出来进行统一整理,这个时候采用数据库访问的方式就更加快捷。

数据库访问的具体代码随便都可以搜到,不再细说,将Excel当作数据库文件访问,也只是数据库连接字符串不同而已,标准的连接字符串:

Excel2003:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\1.xls;Extended Properties=“Excel 8.0;HDR=YES;”;

Excel2007:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\1.xlsx;Extended Properties=“Excel 12.0 Xml;HDR=YES”;

很多时候,这样做就可以进行读取了。

但是我在使用的时候确发现很多列的数据读取部分正常,部分丢失。

Excel当做数据库访问的时候,有一个自动推断的功能,会根据Excel里前几行的数据来推断列的数据格式,如果后面的单元格里存在类型不一致的情况,这时就可能会发生读取不到数据的情况。

解决办法: 在连接字符串后面加上一个属性

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\1.xls;Extended Properties=“Excel 8.0;HDR=YES;IMEX=1”;

具体更详细的说明:

IMEX(IMport EXport mode):

IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。当我

们设置IMEX=1时将强制混合数据(数字、日期、字符串等)转换为文本。

但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查

找前8行数据中数据类型占优选择的行为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字

类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。另一个改进的措施是IMEX=1与注册表值

TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几条数据采样确定数据类型,默认为“8

”。

可以通过修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来更改采

样行数,设置为0时表示采样所有行。

IMEX 三种模式:

当 IMEX=0 时为“汇出模式”(Export mode),该模式开启的Excel档案只能用来做“写入”用途。

  当 IMEX=1 时为“汇入模式”(Import mode),该模式开启的Excel档案只能用来做“读取”用途。

  当 IMEX=2 时为“连結模式”(Linked mode),该模式开启的Excel档案支持“读取”和“写入”用途。