C# OleDbDataReader在单元格(.xlsx)中看不到数据

C# OleDbDataReader在单元格(.xlsx)中看不到数据,c#,excel,datareader,xlsx,oledbdatareader,C#,Excel,Datareader,Xlsx,Oledbdatareader,在读取xlsx文件时遇到了一个非常奇怪的问题(我使用的是OleDbDataReader) 我在那里有一列包含以下数据: 50595855 59528522 C_213154 23141411 问题是,当我阅读本专栏时,读者会告诉我第三行是空的。Excel中的列格式设置为“常规”。但当我将格式设置为“Text”时,一切正常,读者可以看到该行中的数据 为了实验起见,我在前两行前面加了字母前缀,使其如下所示: C_50595855 C_59528522 C_213154 23141411 即使

在读取xlsx文件时遇到了一个非常奇怪的问题(我使用的是OleDbDataReader)

我在那里有一列包含以下数据:

  • 50595855
  • 59528522
  • C_213154
  • 23141411
问题是,当我阅读本专栏时,读者会告诉我第三行是空的。Excel中的列格式设置为“常规”。但当我将格式设置为“Text”时,一切正常,读者可以看到该行中的数据

为了实验起见,我在前两行前面加了字母前缀,使其如下所示:

  • C_50595855
  • C_59528522
  • C_213154
  • 23141411
即使列格式设置为“常规”,读者也可以毫无问题地阅读所有内容

因此,Excel显然在加载列之前会对列中的数据进行分析,当列的第一个单元格看起来像数字,而其他一些单元格则是文本时,Excel会感到困惑

这对我来说真的很奇怪,要么手机里有数据,要么没有数据

有人知道为什么会这样吗

任何帮助都将不胜感激

问候,,
Igor

正如您所猜测的,这是一个由混合数据类型引起的问题。如果你搜索“OleDBDataReader混合类型”,你会得到一些答案。下面是一个描述问题的示例:

“此问题是由Excel ISAM驱动程序的限制引起的,因为一旦它确定Excel列的数据类型,它将为任何不是ISAM驱动程序默认为该Excel列的数据类型的值返回Null。”。Excel ISAM驱动程序通过检查前几行中的实际值来确定Excel列的数据类型,然后选择代表其采样中大多数值的数据类型。”

…以及解决方案:

“确保Excel中的数据以文本形式输入。仅将Excel列重新格式化为文本无法实现这一点。重新格式化Excel列后,必须重新输入现有值。在Excel中,可以使用F5在选定单元格中重新输入现有值

您可以添加选项IMEX=1;到OpenDatabase方法中的Excel连接字符串。例如:

Set Db = OpenDatabase("C:\Temp\Book1.xls", False, True, "Excel 8.0; HDR=NO; IMEX=1;")

正如您猜测的,这是由混合数据类型引起的问题。如果您搜索“OleDBDataReader混合类型”,您将得到一些答案。下面是一个描述问题的示例:

“此问题是由Excel ISAM驱动程序的限制引起的,因为一旦它确定Excel列的数据类型,它将为任何不是ISAM驱动程序默认为该Excel列的数据类型的值返回Null。”。Excel ISAM驱动程序通过检查前几行中的实际值来确定Excel列的数据类型,然后选择代表其采样中大多数值的数据类型。”

…以及解决方案:

“确保Excel中的数据以文本形式输入。仅将Excel列重新格式化为文本无法实现这一点。重新格式化Excel列后,必须重新输入现有值。在Excel中,可以使用F5在选定单元格中重新输入现有值

您可以添加选项IMEX=1;到OpenDatabase方法中的Excel连接字符串。例如:

Set Db = OpenDatabase("C:\Temp\Book1.xls", False, True, "Excel 8.0; HDR=NO; IMEX=1;")

非常感谢您的回复,Doug。非常感谢。FWIW:我发现了一个类似的问题,即数值在转换为字符串之前被Excel ISAM驱动程序四舍五入。例如,188743687作为字符串“188743680”返回给OleDbDataReader。解决方案是在列的格式设置为文本后重新输入所有值。注意:这发生在Windows 7(64位)和Office 2010(32位)上,但在Windows XP和Office 2007(均为32位)上不是问题。注2:数值似乎四舍五入到16的最接近倍数。@RachelHettinger,Yikes!经过进一步研究,我确定在检索数据的某个时刻,这些值被存储为单精度浮点,因此被截断为23位。多谢你的回复,道格。FWIW:我发现了一个类似的问题,即数值在转换为字符串之前被Excel ISAM驱动程序四舍五入。例如,188743687作为字符串“188743680”返回给OleDbDataReader。解决方案是在列的格式设置为文本后重新输入所有值。注意:这发生在Windows 7(64位)和Office 2010(32位)上,但在Windows XP和Office 2007(均为32位)上不是问题。注2:数值似乎四舍五入到16的最接近倍数。@RachelHettinger,Yikes!在进一步研究之后,我确定在检索数据的某个时刻,值被存储为单精度浮点,因此被截断为23位。