这是我发布的旧问题:
Reading one & Update some other Excel with c#
建议我创建schema.ini文件。我的excel文件有很多列(其中很多都没有修复)和混合数据。甚至一个单元格也包含数字和文本。我观察到当我使用OLEDB读取excel并填充到DataTable时,会显示 NOT ALL值。
我不能假设所有列都放入.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 \ “”;
是否有任何解决方案,以便读取所有类型的数据?
答案 0 :(得分:2)
这出现了很多,这是非常容易理解的,因为文档有点缺乏
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 =否并阅读它。这将有助于确保列以文本形式返回,只要您的标题当然都是文本。然后,您可以在处理数据之前丢弃标头。如果在列的前n个单元格中有多数数字/日期时间数据类型,则无效。
除此之外,驱动程序将读取所有类型的Excel文件,包括.xls,.xlsm和.xlsx - 无需更改Excel 12.0中的扩展属性即可。这是一个相当大的优势。
较旧的Microsoft.Jet.OLEDB.4.0很好,您可以在连接字符串中指定TypeGuessRows和ImportMixedTypes,但Microsoft.ACE.OLEDB.12.0完全忽略它们,因此您可以从连接字符串中删除它们,因为它们的存在是误导。较旧的驱动程序只能读取.xls文件。
两个驱动程序只读取255列而不修改SELECT语句。要读取超过255列,请指定范围。 E.g。
Select * From [Sheet1$IV:SP]
将读取256-510列。如果您的工作表在DX上结束,则它完全在255列限制范围内。
始终返回隐藏列。
这个驱动程序有几个恶意。首先,完全忽略前导空行或列。如果您期望特定行/列中的数据,这可能会使事情变得混乱。其次,Excel错误地将29 / Feb / 1900视为有效日期,但OLEDB没有。您可以将29 / Feb / 1900粘贴到Excel电子表格中,但是OLEDB会将其返回到28 / Feb / 1900。我看不到它能做的任何其他事情。
只要您了解限制并且可以围绕它们进行编码,驱动程序是一种非常方便且廉价的方式来读取格式良好的Excel电子表格。
祝你好运。