167 votes

Excel "Le tableau externe n'est pas dans le format attendu".

J'essaie de lire un fichier Excel (xlsx) à l'aide du code ci-dessous. J'obtiens une erreur "External table is not in the expected format." à moins que le fichier ne soit déjà ouvert dans Excel. En d'autres termes, je dois d'abord ouvrir le fichier dans Excel avant de pouvoir le lire à partir de mon programme C#. Le fichier xlsx se trouve sur un partage de notre réseau. Comment puis-je lire le fichier sans avoir à l'ouvrir au préalable ? 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);
}

0 votes

Pour information, j'ai reçu ce message sur une feuille Excel. Lorsque j'ai tenté de l'ouvrir, j'ai utilisé l'ACE actuel et les propriétés étendues suggérées. Quand j'ai ouvert manuellement le fichier, il y avait cette invite en haut pour activer l'édition, je dois trouver comment retourner cette partie automatiquement, mais si vous obtenez ceci, vous devez juste ouvrir le fichier, et ensuite activer l'édition. Je vais peut-être regarder si je peux ouvrir le fichier en lecture seule, j'ai vu quelque chose très loin dans ce fil de discussion à ce sujet.

252voto

GeorgeMcDowd Points 2392

« 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 Extended Properties = Excel 8.0 La chaîne de connexion suivante semble résoudre la plupart des problèmes.

11 votes

Ironiquement, j'ai reçu cette erreur à partir de l'application de quelqu'un d'autre (Scribe), mais l'explication a quand même résolu le problème pour moi : "Enregistrer sous" Excel 97-2003, et l'erreur est corrigée.

3 votes

Vous devrez peut-être l'installer d'abord : microsoft.com/fr/download/confirmation.aspx?id=23734

11 votes

C'est peut-être incroyable, mais je change simplement le nom de la feuille en minuscules et j'utilise sheet1$.

28voto

Trex Points 141

Merci pour ce code :) Je l'apprécie vraiment. Il 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 une version différente du fichier Excel, récupérez le nom du 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 c'est le cas .xls utiliser :

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

5 votes

Pour votre information : une exception OleDb sera levée si vous essayez d'ouvrir un fichier de type .xls sur un PC qui n'a pas le Jet OleDb installé dessus.

0 votes

@Trex êtes-vous sûr que votre dernière ligne de code est correcte ? Pouvez-vous la revérifier dans un autre éditeur ?

16voto

cederlof Points 1656

(Ma réputation est trop faible pour que je puisse commenter, mais il s'agit d'un commentaire sur l'entrée de JoshCaba, utilisant le moteur Ace au lieu de Jet pour Excel 2007)

Si vous n'avez pas installé/enregistré Ace sur votre machine, vous pouvez l'obtenir à l'adresse suivante : http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en

Cela s'applique également à Excel 2010.

0 votes

J'ai installé le moteur ACE, mais j'ai besoin de savoir quelle référence je dois inclure dans mon projet pour que mon installateur l'inclue. Toutes les machines sur lesquelles mon application est installée n'ont pas nécessairement MS Office installé.

1 votes

Le lien donne maintenant un message d'erreur - We're sorry, this download is no longer available .

0 votes

Le lien fonctionne à nouveau

3voto

jordanhill123 Points 1679

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

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

L'essentiel est que l'installation de plusieurs versions d'Office et de divers sdk d'Office, assemblages, etc. a conduit à ce que la référence ACEOleDB.dll dans le registre pointe vers le dossier OFFICE12 au lieu de OFFICE14 dans la base de données.

C:\Program Fichiers \Common Fichiers \Microsoft Partagé \OFFICE14\ACEOLEDB.DLL

Du lien :

Vous pouvez également modifier la clé de registre en changeant le chemin de la dll pour qu'il corresponde à celui de votre version d'Access.

Access 2007 doit utiliser OFFICE12, Access 2010 - OFFICE14 et Access 2013 - BUREAU15

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

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

Nom de la valeur : (Par défaut)

Données de valeur : C:\Program Fichiers \Common Fichiers \Microsoft Partagé \OFFICE14\ACEOLEDB.DLL

(OS : 64bit Office : 32bit)

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

Nom de la valeur : (Par défaut)

Données de valeur : C:\Program Fichiers (x86) \Common Fichiers \Microsoft Partagé \OFFICE14\ACEOLEDB.DLL

0 votes

J'ai trouvé plus facile d'aller dans Programmes et fonctionnalités et Réparer ACE. (Pour moi, ACE s'appelle Microsoft Access Runtime 2016). Je suppose que j'avais cette variante du problème et que Repair a juste réinitialisé toutes les clés de registre pour moi sans que je doive m'embêter avec regedit ;-).

2voto

John M. Black Points 66

J'ai également constaté cette erreur en essayant d'utiliser des formules INDIRECT() complexes sur la feuille qui est importée. Je l'ai remarqué parce que c'était la seule différence entre deux classeurs dont l'un était importé et l'autre non. Les deux étaient des fichiers .XLSX 2007+, et le moteur 12.0 était installé.

J'ai confirmé que c'était le problème en :

  • Je fais une copie du fichier (le problème persiste, il ne s'agit donc pas d'une différence de sauvegarde).
  • Sélection de toutes les cellules de la feuille avec les formules indirectes
  • Collage en tant que valeurs uniquement

et l'erreur a disparu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X