C# 在oledb未显示正确值的情况下读取excel

C# 在oledb未显示正确值的情况下读取excel,c#,excel,winforms,oledb,C#,Excel,Winforms,Oledb,这是我发布的老问题: 按照建议,我创建了schema.ini文件。我的excel文件中有很多列(其中许多不是固定的)包含混合数据。甚至一个单元格也包含数字和文本。我观察到,当我使用OLEDB读取excel并填充到数据表中时,并非所有的值都会显示出来 我不能假设所有列都被放入.ini文件中。我的excel中的列将上升到“DX”。我注意到,只显示了第1行的数字+文本值,但下面的某个地方出现了类似的文本,但没有显示。它显示为空白 以下是连接字符串: string strConn=“Provider=

这是我发布的老问题:

按照建议,我创建了schema.ini文件。我的excel文件中有很多列(其中许多不是固定的)包含混合数据。甚至一个单元格也包含数字和文本。我观察到,当我使用OLEDB读取excel并填充到数据表中时,并非所有的值都会显示出来

我不能假设所有列都被放入.ini文件中。我的excel中的列将上升到“DX”。我注意到,只显示了第1行的数字+文本值,但下面的某个地方出现了类似的文本,但没有显示。它显示为空白

以下是连接字符串:

string strConn=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=”“+FilePath+”;扩展属性=\”Excel 12.0;HDR=是;IMEX=1;TypeGuessRows=0;ImportMixedTypes=文本\“”


有什么解决方案可以读取所有类型的数据吗?

这会出现很多问题,而且很容易理解,因为文档有点缺乏

Microsoft.ACE.OLEDB.12.0不能很好地处理混合数据类型的列。因此,驱动程序将始终读取每列中的前n个值,并根据在列的前n个单元格中找到的内容分配数据类型。n由注册表项的设置确定。它的移动取决于您是使用64位实现还是32位实现,但64位密钥位于

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows
遗憾的是,修改注册表项并不总是很方便,最好将此设置保留在连接字符串上,但事实就是这样。默认值为8行

如果驱动程序发现混合数据类型,则IMEX的设置才会起作用。如果包含IMEX=1,则混合数据类型的列将作为文本返回。如果未指定,则与指定数据类型不对应的任何值都将返回为null。

这就是HDR=No有用的地方。如果您有一个标题,那么指定HDR=No并读取它。这将有助于确保列作为文本返回,当然,只要标题也是文本。然后,您可以在处理数据之前放弃标头。如果在列的前n个单元格中有大多数数字/日期-时间数据类型,则没有帮助

另外,驱动程序将读取所有类型的Excel文件,包括.xls、.xlsm和.xlsx-无需更改Excel 12.0的扩展属性即可。这是一个相当大的优势

较旧的Microsoft.Jet.OLEDB.4.0很好,因为您可以在连接字符串中指定TypeGuessRows和ImportMixedTypes,但Microsoft.ACE.OLEDB.12.0完全忽略它们,因此您可以将它们从连接字符串中删除,因为它们的存在具有误导性。较旧的驱动程序只能读取.xls文件

两个驱动程序只读取255列,而不修改SELECT语句。要读取超过255列,请指定一个范围。例如

Select * From [Sheet1$IV:SP]
将读取第256-510列。如果您的工作表以DX结尾,则它完全在255列限制内

隐藏列始终返回

这个司机有几处不好的地方。首先,完全忽略前导的空行或空列。如果您希望数据位于特定的行/列中,那么这会把事情弄得一团糟。其次,Excel错误地将1900年2月29日视为有效日期,但OLEDB没有。您可以将1900年2月29日粘贴到Excel电子表格中,但OLEDB会将其作为1900年2月28日返回。我看不出它还能做什么

驱动程序是阅读格式良好的Excel电子表格的一种非常方便和廉价的方法,只要您知道这些限制,并可以围绕这些限制编写代码


祝你好运。

这经常出现,而且很容易理解,因为文档有点缺乏

Microsoft.ACE.OLEDB.12.0不能很好地处理混合数据类型的列。因此,驱动程序将始终读取每列中的前n个值,并根据在列的前n个单元格中找到的内容分配数据类型。n由注册表项的设置确定。它的移动取决于您是使用64位实现还是32位实现,但64位密钥位于

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows
遗憾的是,修改注册表项并不总是很方便,最好将此设置保留在连接字符串上,但事实就是这样。默认值为8行

如果驱动程序发现混合数据类型,则IMEX的设置才会起作用。如果包含IMEX=1,则混合数据类型的列将作为文本返回。如果未指定,则与指定数据类型不对应的任何值都将返回为null。

这就是HDR=No有用的地方。如果您有一个标题,那么指定HDR=No并读取它。这将有助于确保列作为文本返回,当然,只要标题也是文本。然后,您可以在处理数据之前放弃标头。如果在列的前n个单元格中有大多数数字/日期-时间数据类型,则没有帮助

另外,驱动程序将读取所有类型的Excel文件,包括.xls、.xlsm和.xlsx-无需更改Excel 12.0的扩展属性即可。这是一个相当大的优势

较旧的Microsoft.Jet.OLEDB.4.0很好,因为您可以在连接字符串中指定TypeGuessRows和ImportMixedTypes,但Microsoft.ACE.OLEDB.12.0完全忽略它们,因此您可以将它们从连接字符串中删除,因为它们的存在具有误导性。较旧的驱动程序只能读取.xls文件

两个驱动程序只读取255列,而不修改SELECT语句。要读取超过255列,请指定一个范围。例如

Select * From [Sheet1$IV:SP]
将读取第256-510列。如果您的工作表以DX结尾,则它完全在255列限制内

隐藏的