使用 oledb 读取 excel 未显示正确的值
reading excel with oledb not displaying correct values
这是我发布的旧问题:
按照建议我创建了 schema.ini 文件。我的 excel 文件有很多包含混合数据的列(其中很多不是固定的)。即使是一个单元格也包含数字和文本。我观察到当我使用 OLEDB 读取 excel 并填充到数据表中时,显示 并非所有值 。
我不能假定所有列都已放入 .ini 文件中。我的 excel 中的列将增加到 "DX"。我观察到只显示了具有数字+文本值的第一行,但未显示出现在下方某处的类似文本。它显示为空白。
这是连接字符串:
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + FilePath+ "';扩展属性=\"Excel 12.0;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"";
有什么解决方案可以读取所有类型的数据吗?
这个问题经常出现,也很好理解,因为文档有点欠缺
Microsoft.ACE.OLEDB.12.0 不能很好地处理混合数据类型的列。所以发生的是 driver 将 总是 读取每列中的前 n 个值,并根据它在该列的前 n 个单元格中找到的内容分配数据类型。 n 由注册表项的设置确定。它会根据您是 64 位实现还是 32 位实现而四处移动,但 64 位密钥在...
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows
遗憾的是,修改注册表项并不总是很方便,将此设置保留在连接字符串上会好得多,但事实就是如此。默认值为 8 行。
如果 driver 找到混合数据类型,那么 IMEX 的设置才会起作用。如果包含 IMEX=1,则将一列混合数据类型 return 编辑为文本。如果未指定,则任何与分配的数据类型不对应的值都将 returned 为 null。
这就是 HDR=No 有用的地方。如果您有 header 则指定 HDR=No 并阅读它。这将有助于确保该列被 return 编辑为文本,当然,只要您的 header 也是文本。然后,您可以在处理数据之前丢弃 header。如果您在列的前 n 个单元格中有大多数 numeric/date 时间数据类型,这将无济于事。
另外,driver 将读取所有类型的 Excel 文件,包括 .xls、.xlsm 和 .xlsx - 无需更改 [=56= 的扩展属性] 12.0这样做。这是一个相当大的优势。
较旧的 Microsoft.Jet.OLEDB.4.0 很好,因为您可以在连接字符串中指定 TypeGuessRows 和 ImportMixedTypes 但 Microsoft.ACE.OLEDB.12.0 完全忽略它们,因此您可以从连接字符串中删除它们作为它们的存在具有误导性。较旧的 driver 只能读取 .xls 文件。
两个 driver 都将只读取 255 列而不修改 SELECT 语句。要读取超过 255 列,您需要指定一个范围。例如
Select * From [Sheet1$IV:SP]
将阅读第 256-510 列。如果您的 sheet 以 DX 结尾,则完全在 255 列限制内。
隐藏的列总是 returned。
这个 driver 有几个问题。首先,前导空行或列被完全忽略。如果您期望特定 rows/columns 中的数据,这真的会把事情搞砸。其次,Excel 错误地将 29/Feb/1900 视为有效日期,但 OLEDB 没有。您可以将 29/Feb/1900 粘贴到 Excel spreadsheet 中,但 OLEDB 会将其 return 设为 28/Feb/1900。我看不出它还能做什么。
driver 是阅读格式良好的 Excel 传播 sheet 的一种非常方便且廉价的方式,只要您了解这些限制并可以围绕它们进行编码。
祝你好运。
这是我发布的旧问题:
按照建议我创建了 schema.ini 文件。我的 excel 文件有很多包含混合数据的列(其中很多不是固定的)。即使是一个单元格也包含数字和文本。我观察到当我使用 OLEDB 读取 excel 并填充到数据表中时,显示 并非所有值 。
我不能假定所有列都已放入 .ini 文件中。我的 excel 中的列将增加到 "DX"。我观察到只显示了具有数字+文本值的第一行,但未显示出现在下方某处的类似文本。它显示为空白。
这是连接字符串:
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + FilePath+ "';扩展属性=\"Excel 12.0;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"";
有什么解决方案可以读取所有类型的数据吗?
这个问题经常出现,也很好理解,因为文档有点欠缺
Microsoft.ACE.OLEDB.12.0 不能很好地处理混合数据类型的列。所以发生的是 driver 将 总是 读取每列中的前 n 个值,并根据它在该列的前 n 个单元格中找到的内容分配数据类型。 n 由注册表项的设置确定。它会根据您是 64 位实现还是 32 位实现而四处移动,但 64 位密钥在...
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows
遗憾的是,修改注册表项并不总是很方便,将此设置保留在连接字符串上会好得多,但事实就是如此。默认值为 8 行。
如果 driver 找到混合数据类型,那么 IMEX 的设置才会起作用。如果包含 IMEX=1,则将一列混合数据类型 return 编辑为文本。如果未指定,则任何与分配的数据类型不对应的值都将 returned 为 null。
这就是 HDR=No 有用的地方。如果您有 header 则指定 HDR=No 并阅读它。这将有助于确保该列被 return 编辑为文本,当然,只要您的 header 也是文本。然后,您可以在处理数据之前丢弃 header。如果您在列的前 n 个单元格中有大多数 numeric/date 时间数据类型,这将无济于事。
另外,driver 将读取所有类型的 Excel 文件,包括 .xls、.xlsm 和 .xlsx - 无需更改 [=56= 的扩展属性] 12.0这样做。这是一个相当大的优势。
较旧的 Microsoft.Jet.OLEDB.4.0 很好,因为您可以在连接字符串中指定 TypeGuessRows 和 ImportMixedTypes 但 Microsoft.ACE.OLEDB.12.0 完全忽略它们,因此您可以从连接字符串中删除它们作为它们的存在具有误导性。较旧的 driver 只能读取 .xls 文件。
两个 driver 都将只读取 255 列而不修改 SELECT 语句。要读取超过 255 列,您需要指定一个范围。例如
Select * From [Sheet1$IV:SP]
将阅读第 256-510 列。如果您的 sheet 以 DX 结尾,则完全在 255 列限制内。
隐藏的列总是 returned。
这个 driver 有几个问题。首先,前导空行或列被完全忽略。如果您期望特定 rows/columns 中的数据,这真的会把事情搞砸。其次,Excel 错误地将 29/Feb/1900 视为有效日期,但 OLEDB 没有。您可以将 29/Feb/1900 粘贴到 Excel spreadsheet 中,但 OLEDB 会将其 return 设为 28/Feb/1900。我看不出它还能做什么。
driver 是阅读格式良好的 Excel 传播 sheet 的一种非常方便且廉价的方式,只要您了解这些限制并可以围绕它们进行编码。
祝你好运。