2010-07-08 15 views
5

J'utilise OleDB pour lire un fichier Excel. Une des colonnes a un format "commun" et contient à la fois des chaînes avec des lettres et des valeurs composées de chiffres seulement. Les valeurs de chaîne sont récupérées sans problème, mais les valeurs numériques pures sont récupérées sous la forme DBNull.DBNull dans une cellule non vide lors de la lecture d'un fichier Excel via OleDB

Comment résoudre?

J'utilise la chaîne de connexion suivante pour ouvrir fichier Excel 2003 (xls):

"Provider=Microsoft.Jet.OLEDB.4.0; 
Data Source=C:\\file.xls; 
Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"" 

Répondre

6

Je trouve un peu de documentation sur le site Web de Microsoft qui s'applique à votre scénario. Ils recommandent de convertir toutes les valeurs numériques en chaînes.

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

Comme indiqué précédemment, ADO doit deviner le type de données pour chaque colonne dans votre feuille de calcul Excel ou une plage. (Ceci n'est pas affecté par les paramètres de mise en forme des cellules Excel.) Un problème sérieux peut survenir si vous avez des valeurs numériques mélangées avec des valeurs de texte dans la même colonne. Le Jet et le fournisseur ODBC renvoient tous deux les données du type majoritaire, mais renvoient des valeurs NULL (vides) pour le type de données minoritaire. Si les deux types sont mélangés de manière égale dans la colonne, le fournisseur choisit le texte sur le texte.

Par exemple:

* In your eight (8) scanned rows, if the column contains five (5) numeric values and three (3) text values, the provider returns five (5) numbers and three (3) null values. 
* In your eight (8) scanned rows, if the column contains three (3) numeric values and five (5) text values, the provider returns three (3) null values and five (5) text values. 
* In your eight (8) scanned rows, if the column contains four (4) numeric values and four (4) text values, the provider returns four (4) numbers and four (4) null values. 
+3

J'ai ajouté 'IMEX = 1' pour appliquer le mode texte (j'ai besoin de récupérer ces cellules sous forme de texte non numérique) mais cela n'a pas aidé. Il est impossible de réentrer des valeurs en mode texte car il y en a beaucoup. Est-il possible de l'automatiser d'une manière ou d'une autre? – flashnik

+0

Que se passe-t-il si vous essayez cette suggestion d'utiliser une requête au lieu du nom direct de table/feuille? Un léger inconvénient est que toutes les colonnes se présentent alors comme des cordes. http://munishbansal.wordpress.com/2009/12/15/importing-data-from-excel-having-mixed-data-types-in-a-column-ssis/ – jdot

1

J'ai le même problème mais avec des valeurs de chaîne. Les valeurs numériques sont renvoyées mais les valeurs de chaîne sont renvoyées comme NULL. Je veux charger des valeurs numériques sous forme de valeurs de chaîne. La colonne peut contenir des chiffres et des codes non numériques (exemple: 100344567 et PRD001X01).

Le pilote Excel considère que la colonne est de type numérique car les valeurs des 8 premières lignes sont de type numérique.

Même si je définis les cellules comme du texte (cellule de format), cela ne fonctionne pas.

Pour forcer le pilote à "voir" la colonne sous forme de chaîne, j'ai simplement mis une citation devant la valeur numérique ('100344567). Cela transforme la valeur numérique en une chaîne.

Cette valeur de 8 lignes est définie dans le Registre HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Moteurs \ Excel \ -> TypeGuessRows = 8.

J'espère que cela aidera.