OleDbDataReader 看不到单元格中的数据 (.xlsx)

Posted

技术标签:

【中文标题】OleDbDataReader 看不到单元格中的数据 (.xlsx)【英文标题】:OleDbDataReader does not see data in the cell(.xlsx) 【发布时间】:2012-07-11 10:06:00 【问题描述】:

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

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

50595855 59528522 C_213154 23141411

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

所以只是为了实验,我在前两行前面加上了字母,让它看起来像下面这样:

C_50595855 C_59528522 C_213154 23141411

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

因此,Excel 显然会在加载列之前以某种方式分析列中的数据,当列的第一个单元格看起来像数字而其余一些单元格是文本时,它会感到困惑..

这对我来说真的很奇怪,因为单元格中要么有数据,要么没有。

有人知道为什么会这样吗?

任何帮助将不胜感激。

问候, 伊戈尔

【问题讨论】:

【参考方案1】:

正如您推测的那样,这是由混合数据类型引起的问题。如果您搜索“OleDBDataReader 混合类型”,您会得到一些答案。这是描述问题的MSDN page:

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

...和解决方案:

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

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

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

"

【讨论】:

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

以上是关于OleDbDataReader 看不到单元格中的数据 (.xlsx)的主要内容,如果未能解决你的问题,请参考以下文章

如果列中的前一个单元格为空,DataReader 不会在 Excel 单元格中看到数据

使用OLEDB读取EXCEL数据时,为何读取不到单元格中的时间值,全是1900\1\0

如何将excel某一列单元格中的数字的前N个数相加,或者后N个数相加?

在 s-s-rS 表格的单元格中突出显示文本的方法

什么是JTable的任何单元格中的更改的正确事件?

如何通过表格视图单元格中的 url 预览元数据?