在用OleDb获取Excel数据源遇到的奇怪问题.
假定一个单元格的内容长度超过256,该单元格如果位于Excel的第二行或者第三行等较前的几行,则获取没有任何问题,之后任何行如果有单元格内容超过256的,获取的内容也是完整的; 但是如果在前10行都没有单元格的内容长度超过256,而在第17行有单元个的内容长度超过256,则获取到的该单元格内容被截断,仅获取前256长度的内容.
有没有人也遇到过类似的问题,知道答案的,麻烦留个言,告之原因以及解决方案,非常感谢.
当前版本还是如此,首先说一下规则是这样的: 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)
您正在浏览的问题含有以下标签:
csharp × 15 excel × 2 oledb × 2
提问时间: 1 year, 8 months前
目前浏览数量:1,331 次
最后更新时间:1 year, 8 months前
C# 获取Excel中数据单元格内容被截断问题
F#与C#的发展定位是什么 [已关闭]
文本输入框的历史记录保存在哪里,是否可以用C#进行编程控制?
如何用C#编程启动磁盘配额?
WinForm程序中窗口优先键盘事件 [已关闭]
WinForm程序中如何始终让窗口捕获键盘事件
如何重写NumericUpDown控件使能够显示非数字格式的文本?
你知道哪些C#的"隐藏"功能?
用openSSL生成了一对RSA密钥,在C#里面怎么使用它啊?
c#里怎样给一个类动态增加属性?