c# - ACE OLEDB "External table is not in the expected format"在 Excel 单元格中带有大文本

标签 c# excel oledb ms-jet-ace

我正在尝试使用 System.Data.OleDb 和 Microsoft ACE OLEDB 提供程序读取恰好有一个非常大的文本单元格(大约 8900 个字符)的 .xls 文件。我无法控制 .xls 文件的内容。

尝试 .Open() OleDbConnection 时出现以下异常:

Exception thrown: 'System.Data.OleDb.OleDbException' in System.Data.dll

Additional information: External table is not in the expected format.

我已将 .xls 文件最小化,似乎文本单元格是导致异常的原因。我在 x64 操作系统上安装了 MS Office 2010 x86。

我已经尝试了以下所有方法,都没有解决问题:

  • ACE 12.0 x86
  • ACE 12.0 x64
  • ACE 15.0 x32
  • 调整注册表以设置 TypeGuessRows = 0
  • 连接字符串 IMEX=1
  • 连接字符串扩展属性="Excel 8.0;"
  • 连接字符串扩展属性="Excel 12.0;"

根据我的研究,旧的 JET 提供程序似乎曾经将字段截断为 255 个字符。如果不抛出异常,我根本无法让 ACE 读取文件。

最佳答案

您似乎遇到了 Access 数据库引擎(“ACE”)处理旧 .xls 文件的问题。我可以使用

重现该问题
myConnectionString =
        "Provider=Microsoft.ACE.OLEDB.12.0;" +
        @"Data Source=C:\Users\Public\test\sample.xls;" +
        "Extended Properties=\"Excel 8.0;HDR=YES;\";" +
        "";

但是当我简单地切换到旧的“Jet”OLEDB 提供程序(32 位)时没有发生错误......

myConnectionString =
        "Provider=Microsoft.Jet.OLEDB.4.0;" +
        @"Data Source=C:\Users\Public\test\sample.xls;" +
        "Extended Properties=\"Excel 8.0;HDR=YES;\";" +
        "";

...它确实读取了“合法”列中的所有 8927 个字符(即,它没有将其截断为 255 个字符)。

如果您确实需要使用 ACE OLEDB 提供程序,那么我发现将 .xls 文件保存为 .xlsx 并使用

myConnectionString =
        "Provider=Microsoft.ACE.OLEDB.12.0;" +
        @"Data Source=C:\Users\Public\test\sample2.xlsx;" +
        "Extended Properties=\"Excel 12.0;HDR=YES;\";" +
        "";

也有效。 (重新保存大概可以在 C# 应用程序中使用 Excel 的 COM 自动化来完成。)

关于c# - ACE OLEDB "External table is not in the expected format"在 Excel 单元格中带有大文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40787308/

相关文章:

c# - C# 和 "a constant value is expected"中的 switch 语句

c# - 在编译时获取属性名称

c# - 为什么用户控制类访问对另一个线程不安全?

python - 如何将变量从 Python 传递到 VBA Sub

excel - Google 电子表格 - 如果另一个单元格包含 N 个字符串之一,则对单元格值求和

C# Oledb like 语句不返回任何结果

c# - ASP.Net 请求引发 502 Bad Gateway 或 TimeOut

mysql - 如何将 MySQL 查询输出保存到 excel 或 .txt 文件?

c# - 使用 WHERE 子句对 Excel 进行 OLE CALL

c# - 使用 OleDb 更新 Excel 工作表