关于c#:使用oledb读取excel不显示正确的值

reading excel with oledb not displaying correct values

这是我发布的旧问题:

阅读一个并用C更新其他Excel#

按照建议,我创建了schema.ini文件。我的Excel文件有这么多列(其中许多列不是固定的)混合数据。即使是单元格也包含数字和文本。我注意到,当我使用OLEDB读取Excel并填充到数据表中时,并不是所有值都显示出来。

我不能假设所有的列都放在.ini文件中。我的Excel中的列将转到"dx"。我注意到,只有第一行显示数字+文本值,但下面的某个地方显示类似的文本却没有显示。它显示为空白。

这是连接字符串:

string strconn="provider=microsoft.ace.oledb.12.0;data source=''+filepath+"';extended properties="excel 12.0;hdr=yes;imex=1;typeguessrows=0;importmixedtypes=text";

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


这是非常容易理解的,因为文档有点缺乏

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

1
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows

遗憾的是,修改注册表项并不总是方便的,最好将此设置保留在连接字符串上,但它就是这样。默认值为8行。

如果驱动程序发现混合的数据类型,那么,并且只有这样,IMEX的设置才会起作用。如果包含IMEX=1,则以文本形式返回混合数据类型的列。如果未指定,则任何与分配的数据类型不对应的值都将返回为空。

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

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

旧的Microsoft.jet.oledb.4.0很好,因为您可以在连接字符串中指定typeguesrow和importmixedtypes,但Microsoft.ace.oledb.12.0完全忽略它们,因此您可以从连接字符串中删除它们,因为它们的存在会误导您。旧驱动程序只能读取.xls文件。

两个驱动程序在不修改select语句的情况下只读取255列。要读取超过255列,请指定一个范围。例如。

1
Select * From [Sheet1$IV:SP]

将读取256-510列。如果工作表以dx结尾,则完全在255列的限制范围内。

始终返回隐藏列。

这个司机有两个毛病。首先,完全忽略前导的空行或空列。如果您希望在特定的行/列中包含数据,这可能会把事情搞得一团糟。其次,Excel错误地将1900年2月29日视为有效日期,但OLEDB没有。您可以将1900年2月29日插入Excel电子表格,但OLEDB将返回1900年2月28日。我看不出它还能做什么。

只要您知道这些限制,并且能够围绕这些限制进行编码,驱动程序就是一种非常方便和廉价的阅读格式良好的Excel电子表格的方法。

祝你好运。