ACE OLEDB在读取Excel单元格中的大量文本时出现“外部表格格式不符合预期”的错误。

4
我正在尝试使用System.Data.OleDb和Microsoft ACE OLEDB提供程序读取一个具有非常大文本单元格(约8900个字符)的.xls文件。我无法控制.xls文件的内容。
当我尝试使用OleDbConnection中的.Open()方法时,会发生以下异常:
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
  • 连接字符串Extended Properties="Excel 8.0;"
  • 连接字符串Extended Properties="Excel 12.0;"
从我的研究中得知,旧的JET提供程序会将字段截断为255个字符。我无法让ACE读取该文件而不抛出异常。

异常提示表明您正在尝试从.NET应用程序中执行此操作。如果是这样,那么如果您使用C#VB.NET或其他标签标记问题,则可能会获得更好的帮助。话虽如此,我无法从C#中重现您的问题。您能否提供一个小的示例.xls文件的链接以演示错误? - Gord Thompson
是的,C#。已将示例上传至https://dropfile.to/EZmAt3K。 - CoderBrien
在Excel中,您可以尝试使用“数据”选项卡>从Access>选择Excel文件>等等,然后在属性中检查生成的连接字符串。否则,您可以尝试一些ODBC驱动程序https://www.connectionstrings.com/excel-2007-odbc/。 - Slai
1个回答

4

您似乎遇到了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;\";" +
        "";

我已经成功读取了"Legal"列中的全部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自动化来完成。)


嗨 Gord,你太棒了!感谢你确认了ACE中的一个错误并提供了解决方法。我试图卸载ACE15时,不幸地破坏了我的办公室安装程序 :-(。对于其他跟进的人,我也会尝试使用ExcelDataReader项目。谢谢! - CoderBrien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接