/// <summary> /// Excel文件连接字符串 /// </summary> private const string excelConnnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1;READONLY=1'";
ADO.NET读取Excel数据时,发现有的数据读出来为空,有的数据可以正确读取。
为此,打开excel表格,发现有的读不出是因为加入了除去数字之外的其他字符,网上了好些内容,最后才搜出来问题的原因,及其解决的方法。如下:
先了解下HDR和IMEX:
1、HDR=YES表示excel的第一行为标题行,不把它作为数据使用,因此,如果HDR的值设为NO,则说明第一行不是标题行,作为数据使用。系统默认是YES。参数Excel 8.0 对于Excel 97以上到2003版本都用Excel 8.0,2007或2010的都用Extended Properties=Excel 12.0。
2、IMEX(IMport EXport mode)的三种模式:
IMEX=0:输出模式,这个模式开启的 Excel 档案只能用来做“写入”用途。
IMEX=1:输入模式,这个模式开启的 Excel 档案只能用来做“读取”用途。
IMEX=2:链接模式(完全更新能力),这个模式开启的 Excel 档案可同时支持“读取”与“写入”用途。
问题的描述及出现的原因:
问题描述:C#项目使用OLEDB读取excel时,会出现某些数据读不出来的问题,读出是空白,查看excel文件,在出现问题的这一列中,字符串格式和数字格式两种同时存在,如果全部改成数字,则不会出现问题,当某个单元格中出现了除数字以外的其他字符,则不能正确显示单元格中的内容。
出现的原因:IMEX=1时将单元格内容混合数据强制转换为文本类型,但只能确保在某列前8行数据至少有一个是文本项的时才起作用。若某列前8行数据全为纯数字,则它仍以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。
问题解决:
premise:IMEX=1
方法一:在混合列中,在所有单元格内容的最前面“ ’ ”
方法二:修改项目所在机器的注册表值TypeGuessRows,其值决定了程序从前几条数据采样确定数据类型,默认为“8”。修改“HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel”下的该TypeGuessRows值来更改采样行数。若设为0,将分析所有数据行。
如下图所示:
注意:Excel表数据列是单一数据类型还是混合数据类型,是由取样行决定而不由整列数据决定。
————————————————
版权声明:本文为CSDN博主「JIngles123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40467670/article/details/120021346