Excel导入问题 拾遗

近期项目设计到excel导入问题,在开发过程中发现很多问题,现在记录一下,便于查阅

 

主要问题在于导入过程中,列的类型问题,ms默认认为列中大多数才用的类型就为该列类型,如果这样的话列中有少量文本的话,他就会认为该列是数字型,在导入过程中,会屏蔽到这些少量的文本,导致导入数据不完整,例如是身份证一样,有少数位数为x的

 

解决方法:

1.在导入数据连接字符串中,将IMEX=1加入,“Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:/Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1; ”,这样就可以。

注:

1.IMEX=1:tells the driver to always read "intermixed" data columns as text
2.HDR=Yes; to indicate that I have a header row in my sheets

 

2.但在实际使用过程中,光是1还不行,还有一个注册表里的信息需要修改,这样带能让excel不再使用前8行的内容来确定该列的类型。

 

参考如下:

 

设定IMEX=1透过OleDb读取Excel仍然出现null值的问题,之前在使用OleDb读取Excel时,发生有些栏位虽然有值,但是读出来却是Null的问题,上网查了一下,说是在连线字串中加入Extended Properties,将IMEX设为1,就可以强迫OleDb的driver将内容当成文字读取,以避免发生型别错误而回传null.如下

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:/Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;
但是后来发现有些资料可以成功,有些不行,但是如果把资料列的顺序作一下改变的话(把非数字的资料放到比较前面的几列),就又可以顺利读取,真是怪到极点,于是再去问了一下Google,终于找到问题的源头...

原来是OleDb Driver的问题,在机码HKLM/Software/Microsoft/Jet/4.0/Engines/Excel有一个TypeGuessRows值,预设是8,表示会先读取前8列来决定每一个栏位的型态,所以如果前8列的资料都是数字,到了第9列以后出现的文字资料都会变成null,真是聪明得令人哭笑不得.....

所以如果要解决这个问题,只要把TypeGuessRows机码值改成0,就可以解这个问题了!

你可能感兴趣的:(c,properties,Excel,header,Google,null)