2008-10-14 8 views
3

Ok, voyons si je peux rendre cela logique.Problème lors de l'analyse d'un fichier XLS avec C#

J'ai un programme écrit qui analyse un fichier Excel et cela fonctionne très bien. J'utilise ce qui suit pour entrer dans le fichier:

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); 

et cela fonctionne très bien. Mais quand je l'essayer sur le fichier réel (il est fourni par un autre programme me) Je reçois cette erreur:

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) 

MAIS, c'est là, je pense que le problème réside. Si je prends ce fichier, et l'enregistrer avec mon Excel local, d'abord je reçois ce pop-up:

CP-ARFJN-FLAG.XLS may contain features that are not compatible with Text (Tab delimited). Do you want to keep the workbook in this format?

  • To Keep this format, which leaves out any incompatible features, click Yes.
  • To preserve the features, click No. Ten save a copy in the latest Excel format.
  • To see what might be lost, click Help.

Si je clique sur Non et puis enregistrez le format actuel Excel, le programme sera alors fonctionner correctement.

Donc, je suppose que cela est enregistré dans un vieux format Excel fou?

Je suppose que mes questions seraient:

  • Comment puis-je savoir quelle version Excel sauvé ce? Comment puis-je l'analyser dans son état actuel?
  • -ou- Puis-je l'enregistrer par programme en tant que version plus récente?

J'espère que c'est clair ... Merci.

Répondre

8

Il semble que le fichier XLS généré par votre application tierce ne soit pas vraiment au format Excel - il peut s'agir d'un fichier texte délimité par des tabulations avec une extension .xls. Essayez de l'ouvrir avec un éditeur de texte et voyez le. S'il est délimité par des tabulations, vous pouvez abandonner l'adaptateur OleDB et l'ouvrir/analyser en tant que fichier texte standard.

+0

haha ​​... c'était! comment simple, merci – naspinski

0

Si le format du fichier généré est susceptible de changer dans le futur (peut-être lorsque vous mettrez à niveau l'application tierce), vous préférerez peut-être utiliser le Office Primary Interop Assemblies. Ceux-ci chargeront n'importe quelle version ou format de fichier produit par Excel. L'inconvénient est que vous aurez besoin d'Office installé sur le serveur.

+0

... et l'autre inconvénient est que l'automatisation côté serveur d'Office n'est pas pris en charge, pas évolutive, et a un certain nombre de problèmes, y compris ceux décrits ici: http://support.microsoft.com/kb/257757 – Joe

+0

Qui a dit qu'il fonctionnait comme un service? –

0

J'ai résolu le problème. Le fichier Excel doit être généré par MS EXCEL 2003 et non par MS EXCEL 2007 "save as 97-2003". donc vous devez télécharger un fichier à partir de n'importe quelle source. Ensuite, copiez les données manuellement sur la feuille. ça a marché avec moi.

Questions connexes