首页 新闻 会员 周边

请教:C#使用oledb方式将excel导入到datagridview数据异常(数据未全部导入)

0
悬赏园豆:50 [已解决问题] 解决于 2014-03-05 18:28

问题描述:

  用winform中用oledb方式导入excel文件到datagridview,用两个excel文件进行测试,其中一个OK,另外一个出现问题,有几个excel单元格中的数据没有在datagridview单元格中全部显示,如图

excel单元格中的数据:

导入后datagridview中显示的数据:

datagridview显示的数据(上图)是:CR14,CR18,CR21,CR29,DR2,DR7,DR11,DR13,DR19,DR21,DR22,DR23,DR24,DR25,R7,R79,R80,R81,R82,R107,R108,R111,R120,R121,R123,RR9,RR10,RR12,RR56,RR57,RR58,RR97,RR114,RR115,RR116,RR117,RR118,RR119,RR120,RR121,RR122,RR123,RR124,RR126,RR134,RR135,RR136,RR138,RR149,RR

两张图片对比看,似乎在导入时数据被截掉一部分,但这个现象在令一个测试用的excel中没有出现,而且也只有几个单元格出现这个现象

问题:

  为什么会出现这个问题?该如何解决?谢谢

Waming的主页 Waming | 初学一级 | 园豆:71
提问于:2014-03-05 14:00
< >
分享
最佳答案
0

微软官方答案:http://support.microsoft.com/kb/189897

收获园豆:50
飞扬的尘埃 | 小虾三级 |园豆:1318 | 2014-03-05 16:25

两个测试用的excel文件来自两个不同的提供者,每个文件中都有数据长度大于255个字符的数据。

是不是说出问题的那个文件的excel版本太低,以至于出现数据被截为255个字符?

Waming | 园豆:71 (初学一级) | 2014-03-05 16:55

@Waming: 不是。目前微软提供了两个版本的Office Ole驱动,Jet版本存在这个问题。这和Excel文件本身并没有关系。

关键一点,如果Excel前8行数据类型判定的过程中,如果某个列的数据类型不一致,特别是包含了标题行的情况下,这列的数据类型将被判定为混合类型,很大几率该列数据会被设置为varchar(255),这就导致了,从第9行数据开始,该列被读取时,都只读取固定长度的字符,一般是255个。

解决办法,使用微软 Microsoft.ACE.OLEDB.12.0 驱动来读取文件。但有个问题,ACE驱动分32位版本和64位版本。我们的开发机通常使用32位版本,或者你安装的是Office2007,那么附带的ACE驱动也会是32位版本,即使你的系统是64位的。而服务器则通常是64位的,因此可能会导致你的程序在服务器上运行出现驱动不匹配的问题。

另外一个解决办法,还是继续使用Jet驱动,但是需要手动设置参数,具体可以参看我给你的链接中解决方案那一部分。

飞扬的尘埃 | 园豆:1318 (小虾三级) | 2014-03-05 17:09

@飞扬的尘埃: 哦,我明白了,非常感谢您的解答,谢谢!

Waming | 园豆:71 (初学一级) | 2014-03-05 18:27

@飞扬的尘埃: 

今天我使用 Microsoft.ACE.OLEDB.12.0 驱动来读取文件,发现也会出现数据被截为255。

刚开始运行时提示  未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序然后我就装了这个驱动AccessDatabaseEngine.exe,在datagridview中的数据也是被截为255,和用Jet的现象一样,但是我发现,如果我把数据大于255的表格放到前8行,数据就不会被截为255

Waming | 园豆:71 (初学一级) | 2014-03-06 14:09

@Waming: 好吧,我以为微软在ACE驱动中已经解决了这个问题。

前8行的判定中,如果数据已经超过255,当然该列的数据类型会被设定得更大,就不会出现截断的情况。不过这要你自己调整Excel了。

飞扬的尘埃 | 园豆:1318 (小虾三级) | 2014-03-06 14:22

@飞扬的尘埃: 

有没有这样的解决办法,比如通过代码来设定数据的类型...

Waming | 园豆:71 (初学一级) | 2014-03-06 14:27

@Waming: 可以啊,使用NPOI库来操作Excel。

飞扬的尘埃 | 园豆:1318 (小虾三级) | 2014-03-06 15:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册