从Excel中读取数据时获取的数据为空的原因及解决方案
2009-11-30 10:09
423 查看
明明我的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
在用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
相关文章推荐
- 从Excel中读取数据时获取的数据为空的原因及解决方案
- 从Excel中读取数据时获取的数据为空的原因及解决方案
- poi读取excel,获取全部数据.
- OLEDB方式读取Excel丢失数据、字符串截断的原因和解决方法
- 通过oledb驱动读取excel、csv数据丢失解决方案
- python读取外部数据之excel数据获取及参数说明
- 采用ISO8211封装的S57数据,中文读取时乱码及丢字原因分析与解决方法,终极解决方案.
- Excel读取获取数据必须判断数据类型
- 通过oledb驱动读取excel、csv数据丢失解决方案
- 使用VBA从海量Excel文件中模糊获取数据并生成新表(附实例) - (二) VBA跨Excel读取数据
- 关于 C# select 读取 Excel 数据 为空,或成科学计数法解决方案
- OLDB读取excel的数据类型不匹配的解决方案
- OLDB读取excel的数据类型不匹配的解决方案【转】
- OLEDB方式读取Excel丢失数据的原因和解决方法
- OLEDB方式读取Excel丢失数据的原因和解决方法
- poi读取excel,获取全部数据.
- python读取excel数据,遇到路径问题解决方案
- cookieless为true时,Request.Form无法获取htm表单数据的原因及解决方案
- Java+Poi 读取Excel做数据导入时获取cell值的方法
- oledb读取Excel数据丢失原因