使用C#解析XLS文件时出现问题

时间:2008-10-14 12:04:59

标签: c# excel

好的,让我们看看能不能让它变得有意义。

我编写了一个解析Excel文件的程序,它运行正常。我使用以下内容进入文件:

string FileToConvert = Server.MapPath(".") + "\\App_Data\\CP-ARFJN-FLAG.XLS";
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileToConvert + ";Extended Properties=Excel 8.0;";
OleDbConnection connection = new OleDbConnection(connectionString);
connection.Open();
//this next line assumes that the file is in default Excel format with Sheet1 as the first sheet name, adjust accordingly
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [CP-ARFJN-FLAG$]", connection);

这很好用。但是当我在实际文件上尝试它(它是由另一个程序提供给我)时,我收到了这个错误:

System.Data.OleDb.OleDbException: External table is not in the expected format. at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.OleDb.OleDbConnection.Open() at wetglobe.Page_Load(Object sender, EventArgs e)

但是,这是我认为问题所在。如果我拿这个文件,并用我的本地Excel保存,首先我得到这个弹出窗口:

  

CP-ARFJN-FLAG.XLS可能包含功能   与文本不兼容(Tab   分隔)。你想保留吗?   这种格式的工作簿?

     
      
  • 要保留此格式,请离开   输出任何不兼容的功能,单击   是。
  •   
  • 要保留这些功能,请单击“否”。   十个在最新的Excel中保存副本   格式。
  •   
  • 要查看可能丢失的内容,请单击   帮助
  •   

如果我单击否,然后将其保存为当前的Excel格式,则程序将正常工作。

所以我假设这是以一些疯狂的旧Excel格式保存的?

我想我的问题是:

  • 如何判断Excel版本 保存了吗?
  • 我如何解析当前的问题 状态?
  • - 或者 - 我可以以编程方式将其另存为新版本吗?

我希望这很清楚......谢谢。

4 个答案:

答案 0 :(得分:8)

听起来您的第三方应用生成的XLS文件可能不是真正的Excel格式 - 它实际上可能是带有.xls扩展名的制表符分隔的文本文件。

尝试使用文本编辑器打开它,然后查看。

如果是制表符分隔符,则可以放弃OleDB适配器并将其打开/解析为标准文本文件。

答案 1 :(得分:0)

如果生成的文件的格式将来可能会更改(可能在您升级第三方应用时),您可能更喜欢使用Office Primary Interop Assemblies。这些将加载Excel生成的任何版本或格式的文件。缺点是您需要在服务器上安装Office。

答案 2 :(得分:0)

我解决了这个问题。 Excel文件应由MS EXCEL 2003生成,而不是从MS EXCEL 2007生成“另存为97-2003”。 所以你必须从任何来源下载文件。然后手动将数据复制到工作表。它与我合作。

答案 3 :(得分:-2)

错误

[OleDbException] External table is not in the expected format.   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.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.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OleDb.OleDbConnection.Open()

解决方案

我在服务器端应用程序中遇到上述错误。当您同时访问许多excel文件时,您会收到此错误。我在代码中错过了connection.close()connection.dispose()方法。添加此代码后,问题得到解决。 在catch块中,您也可以添加此代码以确保安全。 connection.open()连接必须使用connection.dispose()Oledb方法。