聘我网

新概念招聘3.0

C# 获取Excel中数据单元格内容被截断问题

vote up0vote downstar

在用OleDb获取Excel数据源遇到的奇怪问题.

假定一个单元格的内容长度超过256,该单元格如果位于Excel的第二行或者第三行等较前的几行,则获取没有任何问题,之后任何行如果有单元格内容超过256的,获取的内容也是完整的; 但是如果在前10行都没有单元格的内容长度超过256,而在第17行有单元个的内容长度超过256,则获取到的该单元格内容被截断,仅获取前256长度的内容.

有没有人也遇到过类似的问题,知道答案的,麻烦留个言,告之原因以及解决方案,非常感谢.

 

1 个答复

vote up0vote downcheck

当前版本还是如此,首先说一下规则是这样的: ole db(JET) 会扫描sheet中前几行,默认8行(这个值在注册表设定:HkeyLocalMachine/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows )来决定当前列的数据类型。(TypeGuessRows 可以0-16) 考虑一列数据,如果前8行都是数字,那么JET扫描没有问题。 如果8行内的数据类型不一样,JET会采用一个都适合的数据类型来匹配,通常为varchar或unicode varchar。

你现在的问题是,前8行的数据如果短小,JET匹配了varchar,只有255字符。而实际肯能是adLongVarChar或者其它更大的类型。 我没有查到可以指定类型或者优先选择adLongVarChar之类类型,不过可以考虑多查询几行: 设置前面的TypeGuessRows=0,这样会查询16384行。 不过对于大文件,就可能会导致效率问题。

再说一下如果决定前8行中使用varchar还是unicode varchar: JET会根据HkeyLocalMachine/Software/Microsoft/Jet/4.0/Engines/ Excel/ImportMixedTypes 的值来决定。 如果是‘Majority Type’,那么会认为当前列为varchar;如果是‘Text’,则是Unicode VARCHAR或ADVARWCHAR。(另外也可以在连接字符串后面加上IMEX=1来强制使用unicode varchar)

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.