Problema durante l'analisi di un file XLS con C #
Domanda
Ok, vediamo se riesco a dare un senso a questo.
Ho un programma scritto che analizza un file Excel e funziona perfettamente. Uso il seguente per accedere al file:
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);
e questo funziona bene. Ma quando lo provo sul file effettivo (mi viene fornito da un altro programma) ottengo questo errore:
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)
MA, è qui che penso che il problema risieda. Se prendo quel file e lo salvo con il mio Excel locale, per prima cosa ottengo questo popup:
CP-ARFJN-FLAG.XLS può contenere funzioni che non sono compatibili con il testo (Tab delimitato). Vuoi mantenere il cartella di lavoro in questo formato?
- Per mantenere questo formato, che lascia tutte le funzionalità incompatibili, fare clic su Sì.
- Per preservare le funzionalità, fare clic su No. Dieci salva una copia nell'ultimo Excel formato.
- Per vedere cosa potrebbe andare perso, fai clic su Aiuto.
Se faccio clic su No e quindi lo salvo come formato Excel corrente, il programma funzionerà correttamente.
Quindi suppongo che questo sia salvato in un pazzo vecchio formato Excel?
Suppongo che le mie domande sarebbero:
- Come posso sapere quale versione di Excel salvato questo?
- Come posso analizzarlo nella sua corrente Stato?
- -oppure- Posso salvarlo programmaticamente come versione più recente?
Spero sia chiaro ... Grazie.
Soluzione
Sembra che il file XLS generato dalla tua app di terze parti potrebbe non essere davvero in formato Excel - potrebbe in realtà essere un file di testo delimitato da tabulazioni con estensione .xls.
Prova ad aprirlo con un editor di testo e guarda.
Se è delimitato da tabulazioni, è possibile abbandonare l'adattatore OleDB e aprirlo / analizzarlo come file di testo standard.
Altri suggerimenti
Se è probabile che il formato del file generato cambi in futuro (forse quando si aggiorna l'app di terze parti), è possibile che si preferisca utilizzare Assiemi di interoperabilità primaria di Office . Questi caricheranno qualsiasi versione o formato del file prodotto da Excel. L'aspetto negativo è che avrai bisogno di Office installato sul server.
ho risolto il problema. Il file Excel dovrebbe essere generato da MS EXCEL 2003, non da MS EXCEL 2007 "salva come 97-2003". quindi devi scaricare un file da qualsiasi fonte. Quindi copiare i dati manualmente sul foglio. ha funzionato con me.