C# 使用OLEDB 读不出 Excel 参数配置说明 Excel 12.0; HDR=Yes; IMEX=1;READONLY=1

        /// <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表数据列是单一数据类型还是混合数据类型,是由取样行决定而不由整列数据决定。

 

 

读取excel单元格数据,当单元格数据长度大于255时,只能读取到前面长度为255字符,后面的字符会自动被截掉

 这个是EXCEL驱动问题,需要改注册表的

在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel中TypeGuessRows

的数据是25,所以我的程序在读取前25行数据不存在数据截断的问题.如果将他设置为0,所有问题都不存在了

 注意: 有关性能方面的考虑,将 TypeGuessRows 值设置为零 (0) 不建议如果您的 Excel 表格非常大。 如果此值被设置为零,Microsoft Excel 将扫描您的表以确定每一列中的数据类型中的所有记录。

 


————————————————
版权声明:本文为CSDN博主「JIngles123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40467670/article/details/120021346

posted on 2023-04-12 08:56  离线  阅读(477)  评论(0编辑  收藏  举报

导航