4 votes

Lecture d'une feuille Excel à l'aide de ACE.OLEDB.12.0 avec IMEX=1 ne fonctionne pas

J'utilise la chaîne de connexion ci-dessous avec ACE.OLEDB.12.0 pour lire les données d'une feuille de calcul XLSX, mais si je fixe IMEX=1, cela ne fonctionne pas, alors que si je supprime complètement IMEX=1, cela fonctionne bien.

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Working Folder\ICDE\Ramsden 4.xlsx;Extended Properties=""Excel 12.0 xml;HDR=No;IMEX=1;"""

Quelqu'un peut-il expliquer pourquoi ? Parce que j'avais l'impression que IMEX=1 lit toutes les données en tant que texte, et qu'il était donc plus sûr !

Gracias

JP

IMEX= <0/1/2> IMEX fait référence au mode IMport EXport. Il peut prendre trois valeurs possibles.

Si IMEX=0 et IMEX=2, ImportMixedTypes sera ignoré et la valeur par défaut de 'Majority Types' sera utilisée. Dans ce cas, les 8 premières lignes seront prises en compte, puis le type de données de chaque colonne sera déterminé.

IMEX=1 est le seul moyen de définir la valeur de ImportMixedTypes en tant que texte. Ici, tout sera traité comme du texte.

9voto

Ciarán Points 1439

IMEX=1 n'est pas retourner toutes les données sous forme de texte. Il s'agit d'une idée fausse très courante.

Ce que fait OLEDB est de scanner les n premières lignes (par défaut=8) et de déterminer un type de données. Si vous ne tenez pas compte de IMEX=1, il retournera Null pour toutes les valeurs qui ne correspondent pas à ce type de données. Si vous incluez IMEX=1 et que l'analyse rencontre des types de données mixtes, elle renvoie du texte. Si votre feuille a un en-tête de texte, vous pouvez faciliter ce processus en spécifiant HDR=No et en éliminant l'en-tête. Cependant, OLEDB toujours parcourt les n premières lignes pour déterminer le type de données et renvoie les résultats en conséquence.

Le nombre de rangs à analyser est déterminé par la valeur de TypeGuessRows.

L'ancien pilote Microsoft.Jet.OLEDB.4.0 vous permettait de spécifier TypeGuessRows dans la chaîne de connexion mais Microsoft.ACE.OLEDB.12.0 ne le fait pas. TypeGuessRows est maintenant conservé dans le registre sous...

Excel 2007: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows
Excel 2010: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows
Excel 2013: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows

Les applications 32 bits fonctionnant sur une machine 64 bits les trouveront sous le Wow6432Node. Par exemple...

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows

C'est un pas en arrière à mon avis, mais il doit y avoir une raison valable. Si vous en trouvez une, faites-le nous savoir.

0voto

Yoismel Points 38

Ce qui a fonctionné pour moi, c'est de définir IMEX=0 dans la chaîne de connexion. J'ai une instruction SELECT et une UPDATE et seule l'instruction SELECT fonctionnait lorsque IMEX=1. Maintenant, les deux fonctionnent avec IMEX=0.

<add name="ExcleConn" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\ServerPath\Folder\GroupScheduling.xlsm;
     Extended Properties='Excel 12.0 Macro;HDR=YES;IMEX=0;Persist Security Info=False;ReadOnly=0;'"/>

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