从Excel中读取数据时获取的数据为空的原因及解决方案
明明我的Excel中有值,可是用OLEDB连接读取它时却返回空值,真是莫名其妙!如果你也遇到过这样的困惑,请往下读,如果暂时还没遇到就以后再读吧,哈哈。
在用OLE DB,ISAM会尝试读取前8行的数据类型,如果一列中的前8行既有文本类型又有数字类型,那么就取多数的数据类型,其余的返回为空。如果两者一样的数目一样多,那么就取数字类型,文本类型的行返回空值。
即:某一列前8行中
如果5行文本类型,3行数字类型 则返回结果为5行文本类型的数据,3行空值
如果5行数字类型,3行文本类型 则返回结果为5行数字类型的数据,3行空值
如果4行文本类型,4行数字类型 则返回结果为4行数字类型的数据,4行空值
当然8行以后的值按照前面探测的结果,如果跟结果一样的类型返回原来的值,如果相反则返回空值。
如果想在混合类型中返回真实的值,那么就要在连接字符串的扩展属性中加上IMEX=1;这个属性的对应值如下:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
微软提醒说,谨慎使用IMEX=1,因为这是导入模式,在这种模式下做数据的添加或者更新结果不可预料,所以在对Excel做Insert 或者Update动作时,不要给这个属性赋值。
那么为什么在IMPort Mode的情况下就是用文本方式读取的那?
请看注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel 下面有个键ImportMixedTypes,它的值是Text,也就是说在导入模式下,混合数据类型统一处理为文本。
这样看似一切OK了,不过当你的数据前八行都是数字,后面的N(N>>8)为文本类型时,即使你把IMEX设为1,后面的文本还是不会显示的。
why?
ISAM还是比较勤快的,即使你跟他交待了在导入模式下使用文本类型,它还是比较关注前八行的情况,如果前八行都为数字,他还是要按数字来处理,这家伙还是比较执著,很想主持公道的。
那咋办?
还是得靠注册表,还是上面的那个路径下有个键TypeGuessRows,其默认键值为8,这就是前八行的来源,你可以把它设为1-16行,当然也可以把它设为0,它不是很勤快吗?那就让它看看所有的行吧!累死个傻小子。如果所有行都是数字,那就是数字了,有一个不是数字那就按文本处理。
以上的理论在我的机子上测试通过,环境是Office2003,Win2000 Sp4