Question

Je suis en train de lire un fichier Excel (.xlsx) en utilisant le code ci-dessous. Je reçois un « tableau externe n'est pas dans le format attendu. » erreur à moins d'avoir le fichier déjà ouvert dans Excel. En d'autres termes, je dois ouvrir le fichier dans Excel d'abord avant que je puisse lire si de mon programme C #. Le fichier XLSX est sur un partage sur notre réseau. Comment puis-je lire le fichier sans avoir à l'ouvrir en premier? Merci

string sql = "SELECT * FROM [Sheet1$]";
string excelConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathname + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";

using (OleDbDataAdapter adaptor = new OleDbDataAdapter(sql, excelConnection)) {
    DataSet ds = new DataSet();
    adaptor.Fill(ds);
}
Était-ce utile?

La solution

« Table externe n'est pas dans le format attendu. » se produit généralement lorsque vous essayez d'utiliser un fichier Excel 2007 avec une chaîne de connexion qui utilise: Microsoft.Jet.OLEDB.4.0 et propriétés étendues = Excel 8.0

En utilisant la chaîne de connexion suivante semble résoudre la plupart des problèmes.

public static string path = @"C:\src\RedirectApplication\RedirectApplication\301s.xlsx";
public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

Autres conseils

Merci pour ce code :) Je l'apprécie vraiment. Fonctionne pour moi.

public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

Donc, si vous avez la version diff du fichier Excel, obtenir le nom de fichier, si son extension est .xlsx , utilisez ceci:

Private Const connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

et si elle est .xls , utilisez:

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""

(j'ai trop faible réputation pour commenter, mais c'est un commentaire sur l'entrée de JoshCaba, en utilisant l'as-moteur au lieu de Jet pour Excel 2007)

Si vous n'avez pas installé Ace / enregistré sur votre ordinateur, vous pouvez l'obtenir à: https://www.microsoft.com/en-US/download/details.aspx?id=13255

Il applique pour Excel 2010 ainsi.

Il suffit d'ajouter mon cas. Mon fichier xls a été créé par une fonction d'exportation de données à partir d'un site Web, le fichier est extention xls, il peut être normalement ouverte par MS Excel 2003. Mais les deux Microsoft.Jet.OLEDB.4.0 et Microsoft.ACE.OLEDB.12.0 a obtenu un " table externe ne sont pas dans le format attendu » exception.

Enfin, le problème est, comme l'exception dit: « ce n'est pas dans le format attendu ». Bien que son nom extention est xls, mais quand je l'ouvre avec un éditeur de texte, il est en fait un fichier HTML bien formé, toutes les données sont dans une

, chaque est une ligne et chaque
est un cellule. Ensuite, je pense que je peux l'analyser d'une manière html.

J'ai eu ce même problème (Utilisation du ACE.OLEDB) et ce qui a résolu pour moi était ce lien:

http://support.microsoft.com/kb/2459087

L'essentiel de ce que l'installation de plusieurs versions de bureau et divers sdk de bureau de, assemblées, etc. a conduit à la référence ACEOleDB.dll dans le pointage de registre dans le dossier OFFICE12 au lieu de OFFICE14 dans

  

C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

À partir du lien:

  

Vous pouvez modifier la clé de Registre changer le chemin dll pour correspondre à celle de votre version d'accès.

     

Access 2007 devrait utiliser OFFICE12, Access 2010 - OFFICE14 et accès   2013 - OFFICE15

     

(OS: Office 64 bits: 64 bits) ou (OS: 32bit Bureau: 32bit)

     

Clé: HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

     

Nom de la valeur: (par défaut)

     

Données de la valeur: C: \ Program Files \ Common Files \ Microsoft   Shared \ OFFICE14 \ ACEOLEDB.DLL

     

(OS: Office 64 bits: 32 bits)

     

clé:   HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

     

Nom de la valeur: (par défaut)

     

Données de la valeur: C: \ Program Files (x86) \ Common Files \ Microsoft   Shared \ OFFICE14 \ ACEOLEDB.DLL

Je l'ai aussi vu cette erreur en essayant d'utiliser des formules (INDIRECT) complexes sur la feuille qui est importée. Je l'ai remarqué parce que cela était la seule différence entre deux classeurs où l'on a l'importation et l'autre pas. Tous deux étaient 2007+ .xlsx, et le moteur 12.0 a été installé.

Je confirme ce fut la question par:

  • Faire une copie du fichier (il y avait encore la question, il était donc pas une économie, comme la différence)
  • Sélection de toutes les cellules de la feuille avec les formules indirectes
  • comme valeur que Coller

et l'erreur a disparu.

Je recevais des erreurs avec des tiers et la lecture Oledb d'un classeur XLSX. La question semble être une feuille de calcul caché qui provoque une erreur. Démasquage la feuille de calcul a permis le classeur à importer.

J'ai eu le même problème. qui comme résolu en procédant comme suit:

1.) Cliquez sur Fichier

2.) Sélectionnez "Enregistrer sous"

3.) Cliquez sur déroulant (Save as type)

4.) Sélectionner un classeur Excel 97-2003

5.) Cliquez sur le bouton Enregistrer

Je l'ai eu ce problème et la modification des propriétés étendues HTML importation fixé selon ce poste par Marcus Miris:

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"

Cette adresse de fichier Excel peut avoir une extension incorrecte. Vous pouvez modifier l'extension de xls xlsx ou vice versa, et essayer à nouveau.

Si le fichier est en lecture seule, il suffit de retirer et il devrait fonctionner à nouveau.

Cela peut aussi être un fichier contenant des images ou des graphiques, voir ceci: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format

La recommandation est de sauver Excel 2003

Il suffit d'ajouter ma solution à ce problème. Je télécharger un fichier .xlsx au serveur web, puis la lecture de celui-ci et en vrac l'insertion à SQL Server. Devenais ce même message d'erreur, essayé toutes les réponses proposées, mais aucune n'a fonctionné. Finalement, j'ai sauvé le fichier Excel 97-2003 (.xls), qui a travaillé ... seule question que j'ai maintenant que le fichier d'origine avait 110,000+ lignes.

Si vous avez encore ce problème, vérifiez vos autorisations, j'ai essayé beaucoup de ces suggestions et mon problème concret est que le fichier que je voulais processus était sous contrôle de code source et le fil avait aucune autorisation, je devais changer autorisations dossier entier et il a commencé à travailler (je en train de traiter de nombreux fichiers là-bas) ... il correspond également à de nombreuses suggestions comme changer le nom du fichier ou vérifier que le fichier ne loicked par un autre processus.

J'espère que cela vous aide.

ACE a Superceded JET

Ace Prend en charge toutes les versions précédentes d'Office

Ce code fonctionne bien!

        OleDbConnection MyConnection;
        DataSet DtSet;
        OleDbDataAdapter MyCommand;

        MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\\Book.xlsx;Extended Properties=Excel 12.0;");
        MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection);
        DtSet = new System.Data.DataSet();

        MyCommand.Fill(DtSet);
        dataGridView1.DataSource = DtSet.Tables[0];
        MyConnection.Close();

Cela peut se produire lorsque le classeur est protégé par mot de passe. Il y a quelques solutions de contournement pour supprimer cette protection, mais la plupart des exemples que vous trouverez en ligne sont pas à jour. De toute façon, la solution simple est de déprotéger le classeur manuellement, utilisez quelque chose comme autre OpenXML pour enlever la protection d'un programme.

J'ai vu récemment cette erreur dans un contexte qui ne correspond à aucune des réponses proposées précédemment. Il est avéré être un conflit avec AutoVer . Solution:. Désactiver temporairement AutoVer

J'ai eu récemment cette "System.Data.OleDb.OleDbException (0x80004005): table externe n'est pas dans le format attendu." erreur se produit. Je comptais sur Microsoft Access 2010 Runtime. Avant la mise à jour qui a été automatiquement installé sur mon serveur le 12 Décembre 2018 mon code C # ran bien l'aide du fournisseur de Microsoft.ACE.OLEDB.12.0. Après la mise à jour du 12 Décembre 2018 a été installé j'ai commencé à la « table externe n'est pas dans le format attendu » dans mon fichier journal.

Je le Microsoft Access laissé tomber 2010 Runtime et installé le Microsoft Access 2013 Runtime et mon code C # a commencé à travailler à nouveau sans "System.Data.OleDb.OleDbException (0x80004005): table externe n'est pas dans le format attendu." erreurs.

Version 2013 qui fixe cette erreur pour moi https://www.microsoft.com/en-us/ téléchargement / confirmation.aspx? id = 39358

La version 2010 qui a fonctionné pour moi avant la mise à jour qui a été automatiquement installé sur mon serveur le 12 Décembre. https://www.microsoft.com/en-us/ téléchargement / confirmation.aspx? id = 10910 https://www.microsoft.com/en-us/ téléchargement / confirmation.aspx? id = 10910

J'ai aussi eu cette erreur se produit le mois dernier dans un processus automatisé. Le code C # a fonctionné très bien quand je l'ai couru le débogage. Je trouve que le compte de service en cours d'exécution du code des autorisations également nécessaires pour le répertoire C:. \ Windows \ Temp

Mon champ d'application se compose de télécharger modèle et vérifie le modèle quand il est rempli de données Ainsi,

1) Télécharger un modèle (.xlsx) déposer auprès de la ligne d'en-tête. le fichier est généré en utilisant OpenXML et il fonctionne parfaitement.

2) Téléchargez le même fichier sans aucun changement de son état normal téléchargé. Cela entraînera une erreur de connexion et échoue (connexion OLEDB utilise pour lire la feuille Excel).

Ici, si les données sont rempli le programme fonctionne comme prévu.

Toute personne ayant une idée de la question est connecté avec le fichier que nous créons c'est xml format si nous ouvrons et simplement économiser de le convertir pour format Excel et il fonctionne bien.

Toute idée de télécharger Excel avec le type de fichier préféré?

Travailler avec un code plus ancien et suis tombé sur cette même exception générique. Très difficile à traquer la question, donc je pensais que je rajouterais ici au cas où il aide quelqu'un d'autre.

Dans mon cas, il y a le code était ailleurs dans le projet qui a été l'ouverture d'un StreamReader sur le fichier Excel avant la OleDbConnection a essayé d'ouvrir le fichier (cela a été fait dans une classe de base).

Donc, fondamentalement, je avais juste besoin d'appeler Close() sur l'objet StreamReader premier, alors je pourrais ouvrir avec succès la connexion OleDb. Cela n'a rien à voir avec lui-même fichier Excel, ou avec la chaîne OleDbConnection (qui est naturellement où je regardais d'abord).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top