好的,让我们看看能不能让它变得有意义。
我编写了一个解析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格式保存的?
我想我的问题是:
我希望这很清楚......谢谢。
答案 0 :(得分:8)
听起来您的第三方应用生成的XLS文件可能不是真正的Excel格式 - 它实际上可能是带有.xls扩展名的制表符分隔的文本文件。
尝试使用文本编辑器打开它,然后查看。
如果是制表符分隔符,则可以放弃OleDB适配器并将其打开/解析为标准文本文件。
答案 1 :(得分:0)
如果生成的文件的格式将来可能会更改(可能在您升级第三方应用时),您可能更喜欢使用Office Primary Interop Assemblies。这些将加载Excel生成的任何版本或格式的文件。缺点是您需要在服务器上安装Office。
答案 2 :(得分:0)
答案 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
方法。