问题描述:
用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中没有出现,而且也只有几个单元格出现这个现象
问题:
为什么会出现这个问题?该如何解决?谢谢
微软官方答案:http://support.microsoft.com/kb/189897
两个测试用的excel文件来自两个不同的提供者,每个文件中都有数据长度大于255个字符的数据。
是不是说出问题的那个文件的excel版本太低,以至于出现数据被截为255个字符?
@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驱动,但是需要手动设置参数,具体可以参看我给你的链接中解决方案那一部分。
@飞扬的尘埃: 哦,我明白了,非常感谢您的解答,谢谢!
@飞扬的尘埃:
今天我使用 Microsoft.ACE.OLEDB.12.0 驱动来读取文件,发现也会出现数据被截为255。
刚开始运行时提示 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序然后我就装了这个驱动AccessDatabaseEngine.exe,在datagridview中的数据也是被截为255,和用Jet的现象一样,但是我发现,如果我把数据大于255的表格放到前8行,数据就不会被截为255
@Waming: 好吧,我以为微软在ACE驱动中已经解决了这个问题。
前8行的判定中,如果数据已经超过255,当然该列的数据类型会被设定得更大,就不会出现截断的情况。不过这要你自己调整Excel了。
@飞扬的尘埃:
有没有这样的解决办法,比如通过代码来设定数据的类型...
@Waming: 可以啊,使用NPOI库来操作Excel。