Vidual Studio 2017 C#System.Data.OleDb无法读取较新的Excel文件

Vidual Studio 2017 C#System.Data.OleDb无法读取较新的Excel文件,c#,excel,oledb,oledbconnection,C#,Excel,Oledb,Oledbconnection,我使用Visual Studio Professional 2017(15.9.16和.NET Framework 4.7.02558),用C#编写代码 我有使用System.Data.OleDB的现有代码,该代码成功读取较旧的Excel文件,但无法读取较新的Excel文件,从而出现错误“外部表不是预期格式”。完全例外情况显示在本文末尾 我声称这是一个版本问题,因为如果我将文件向下转换为Excel 2003,那么读取工作簿就会成功。唯一的区别是Excel文件的版本不同 我做了一些初步的探索,希望

我使用Visual Studio Professional 2017(15.9.16和.NET Framework 4.7.02558),用C#编写代码

我有使用System.Data.OleDB的现有代码,该代码成功读取较旧的Excel文件,但无法读取较新的Excel文件,从而出现错误“外部表不是预期格式”。完全例外情况显示在本文末尾

我声称这是一个版本问题,因为如果我将文件向下转换为Excel 2003,那么读取工作簿就会成功。唯一的区别是Excel文件的版本不同

我做了一些初步的探索,希望发现我只需要升级VisualStudio中的一些组件,但在这方面我没有运气;这个谜有这么多的碎片,我不知道从哪里开始

System.Data.OleDb.OleDbException
HResult=0x80004005
Message=External table is not in the expected format.
Source=System.Data
StackTrace:
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()

好的,我找到了正确的解决方案。我应该使用OpenXML(DocumentFormat.OpenXML),而不是OleDb。我现在正在加快这一方法的进度

既然您已经将其与此特定问题隔离开来,您能否澄清您正在保存的是什么较新的版本格式?2003年Excel将格式从.xls(二进制)更改为.xlsx(XML)后的版本不是吗?可能是因为您使用的版本已经过时,或者它试图读取基于XML的文件,但需要二进制文件(您没有发布代码或任何东西,所以我真的不知道)?我根本没有保存到新的格式。我正在接收来自外部方的Excel文件。我无法控制我收到的版本。然后,我通过将文件导入Excel并执行另存为手动降级。原始文件是.xlsx压缩的。我发现可以使用7zip解压缩xlsx,从而生成几个xml文件。但是如何读取这些数据?这不仅仅是阅读一些XML的问题,它还需要知道各种提取的XML文件之间的关系。fwiw我的连接字符串是“Provider=Microsoft.ACE.OLEDB.12.0;;Extended Properties=Excel 12.0 XML;Data Source=C:\\which.xlsx;”