L'accès à la feuille de calcul Excel avec C # renvoie parfois une valeur vide pour certaines cellules
J'ai besoin d'accéder à une feuille de calcul excel et insérez les données de la feuille de calcul dans une Base de données SQL. Toutefois, les Clés Primaires sont mitigés, la plupart sont des numériques, et certains sont des alpha-numérique.
Le problème que j'ai c'est que quand le numérique et alphanumérique Touches sont dans la même feuille de calcul de l'alpha-numérique cellules retournent des valeurs vides, alors que toutes les autres cellules de la restitution de leurs données sans problèmes.
Je suis en utilisant le OleDb méthode pour accéder au fichier Excel. Après l'extraction des données avec une chaîne de Commande je mets les données dans un DataAdapter et puis je remplir un DataSet. Je itérer sur toutes les lignes (dr) dans la première Table de données dans le DataSet.
Je référence les colonnes à l'aide d', dr["..."].ToString()
Si je déboguer le projet dans Visual Studio 2008 et j'ai vue les "propriétés étendues", en retenant ma souris sur le "dr" je peux afficher les valeurs de la DataRow, mais la Clé Primaire qui devrait être l'alpha-numérique est {}. Les autres valeurs sont entourées de guillemets, mais la valeur à blanc a accolades.
Est-ce un C# problème ou un Excel problème?
Quelqu'un a déjà rencontré ce problème avant, ou peut-être trouvé une solution de contournement/fix?
Merci d'avance.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Solution:
Chaîne De Connexion:
HDR=Yes;
indique que la première ligne contient les en-columnnames, pas de données.HDR=No;
indique le contraire.IMEX=1;
indique au conducteur de toujours lire les "mélangés" (nombres, des dates, des chaînes, etc) colonnes de données sous forme de texte. Notez que cette option peut affecter la feuille excel à l'accès en écriture négative.Syntaxe SQL
SELECT * FROM [sheet1$]
. I. e. feuille de calcul excel nom suivi d'un$
et enveloppé dans[
]
crochets.Important:
Découvrez l' [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] situé registre REG_DWORD "TypeGuessRows". C'est la clé pour ne pas laisser Excel utiliser uniquement les 8 premières lignes de deviner les colonnes de type de données. Définissez cette valeur à 0 pour analyser toutes les lignes. Cela pourrait nuire à la performance.
Si le classeur Excel est protégé par un mot de passe, vous ne pouvez pas ouvrir pour l'accès aux données, même en fournissant le mot de passe correct avec votre chaîne de connexion. Si vous essayez, vous recevez le message d'erreur suivant: "impossible de décrypter un fichier."
La source de données Excel sélectionne un type de colonne pour l'ensemble de la colonne. Si l'une des cellules qui ne correspond pas à ce type exactement, il laisse des blancs comme ça. Nous avons eu des problèmes où notre dactylo entrée dans un "8" (un espace avant le nombre, de sorte Excel converti en une chaîne pour la cellule) dans une colonne numérique. Il serait logique pour moi qu'il allait essayer de l' .Net Analyser les méthodes, car ils sont plus robustes, mais je suppose que ce n'est pas la façon dont le pilote Excel fonctionne.
Notre corriger, puisque nous avons été à l'aide de la base de données de services à l'importation, a été pour enregistrer toutes les lignes qui ont "échoué" de cette façon. Ensuite, nous sommes retournés à la XLS document et re-tapé ces cellules, pour assurer le type sous-jacent, était correcte. (Nous avons trouvé tout simplement en supprimant l'espace n'ont pas le fixer, nous avons eu pour Effacer l'ensemble de la cellule, que de la re-tapez le '8'.) Se sent hacky et n'est pas elagent, mais c'était la meilleure méthode, nous avons trouvé. Si le pilote Excel ne peut pas lire correctement par lui-même, il n'y a rien que vous pouvez faire pour obtenir que les données de là, une fois que vous êtes dans .Net.
Juste un autre cas où l'Office se cache les détails importants d'utilisateurs dans le nom de la simplicité, et donc de rendre plus difficile quand vous avez pour être exact, pour le pouvoir utilise.
Le {} signifie que c'est une sorte de vide d'objet, et non une chaîne de caractères. Lorsque vous passez la souris sur l'objet que vous devriez être capable de voir son type. De même, lorsque vous utilisez espion express pour afficher le dr["..."] vous devriez voir le type d'objet. Ce type est l'objet que vous recevez?
La ItemArray est un Tableau d'Objets. Donc je suppose que la "colonne" dans le DataRow, que je suis en train de référence, est de type object.
Pour la compatibilité avec VISTA, vous pouvez utiliser EXCEL 12.0 pilote dans la chaîne de connexion. Cela devrait résoudre votre problème. Elle a fait la mienne.
Solution:
Chaîne De Connexion: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Chemin;Extended Properties="Excel 8.0;HDR=Non;IMEX=1";
Il a travaillé pour moi. De cette façon, vous n'aurez pas à modifier les registres!
J'ai répondu à une question similaire ici. Ici, j'ai copié et collé la même réponse pour votre confort:
J'ai eu ce même problème, mais a été en mesure de travailler autour d'elle sans avoir recours à l'Excel de l'interface COM ou 3ème partie logiciel. Elle implique un peu de la charge de traitement, mais il semble fonctionner pour moi.
jeu de données. Voila scientifique
la notation est maintenant disparu et tout est lu comme une chaîne de caractères.
Voici un code qui illustre cela, et comme un bonus supplémentaire, il est même StyleCopped!
Trier les enregistrements dans le fichier xls en code ascii dans l'ordre décroissant, de sorte que l'alpha-numérique champs apparaissent en haut en dessous de la ligne d'en-tête. Cela garantit que la première ligne de lecture de données permettra de définir le type de données de type "varchar" ou "nvarchar"
salut à tous, ce code est obtient des valeurs alphanumériques aussi
Ce n'est pas tout à fait le droit! Apparemment, Jet/ACE suppose TOUJOURS un type de chaîne si les 8 premières lignes sont vides, indépendamment de la société IMEX=1. Même quand j'ai fait les lignes lues à 0 dans le registre, j'avais toujours le même problème. C'était la seule sûr moyen de le faire fonctionner: