我正在尝试使用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
>连接字符串Extended Properties =“ Excel 8.0;”
>连接字符串Extended Properties =“ 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自动化来完成重新保存.)