7
votes

J'ai besoin d'une solution de contournement pour les types de données de deviniers Excel

Je crée une utilitaire pour importer des données d'Excel vers la base de données Oracle,

J'ai un modèle fixe pour le fichier Excel,

maintenant, lorsque j'essaie d'importer les données par Jet Fournisseur et Ado.net - Outils de connexion OLE, j'ai trouvé le problème suivant: Certaines colonnes n'ont pas été importées car il existe des types de données mixtes dans leurs colonnes [chaîne et numéro],

i Vous avez cherché ce problème sur Internet que j'ai trouvé la raison est Deviner Types de données d'Excel

Le code de charge: xxx

Que dois-je faire pour dire Excel Arrêter de deviner et me donner les données comme texte?

S'il n'y a pas 't, pouvez-vous m'aider avec des solutions de contournement?

Merci d'avance


5 commentaires

Comment importe-vous les enregistrements d'Excel à Oracle? code s'il vous plaît? Où échoue-t-il?


Pouvez-vous non seulement définir la colonne entière comme texte dans Excel?


@ Shahkalpeh: Cela ne jette aucune exception, il ignore simplement les données de texte car elle devine que le type de données de la colonne est le numéro des 8 premiers enregistrements et renvoie null pour les valeurs non numériques.


Merci. Pouvez-vous publier un code que vous utilisez pour lire des données d'Excel?


La solution de contournement habituelle est de créer la table de destination vide et d'importer dans cela, au lieu de créer la table à chaque fois que vous exécutez l'importation. De cette façon, vous avez le contrôle total sur les types de données de destination.


4 Réponses :


1
votes

Pouvez-vous travailler à partir de l'extrémité Excel? Cet exemple exécuté dans Excel mettra des données mixtes Tyoes dans une table SQL Server:

Dim cn As New ADODB.Connection

scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
& sFullName _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

cn.Open scn

s = "SELECT Col1, Col2, Col3 INTO [ODBC;Description=TEST;DRIVER=SQL Server;" _
& "SERVER=Some\Instance;Trusted_Connection=Yes;" _
& "DATABASE=test].TableZ  FROM [Sheet1$]"
cn.Execute s


4 commentaires

Merci Remou, mais cela ne convient pas à mon cas, mais ma question est pourquoi je ne peux pas utiliser imex = 1 à ado.net? Et existe-t-il une propriété étendue similaire fonctionne avec Ado.net?


Pourquoi ne pouvez-vous pas utiliser imex = 1? C'est juste une partie de la chaîne de connexion. Dans ce PCReview.fr/forums/thread-1863969.php, Paul, MVP, suggère que vous le pouvez.


@ Remou: Merci beaucoup, cela fonctionne, il a été nécessaire (CHAR) 34 dans la chaîne de connexion (à partir du lien que vous avez ajouté).


@Homam Notez que le mélange doit démarrer avant la valeur de typeGuessRows dans la clé de registre: HKEY_LOCAL_MACHINE / LOGICIEL / Microsoft / Jet / 4.0 / Moteurs / Excel / Sauf si vous souhaitez définir TypeGuessRows sur 0, ce qui signifie que toutes les lignes seront numérisées.



8
votes

J'ai trouvé une solution en ajoutant IMEX = 1 pour la chaîne de connexion, mais il y a un format spécial pour celui qui est décrit dans ce qui suit Link .

Le paramètre IMEX est destiné aux colonnes utilisant des valeurs numériques mixtes et alpha. Le pilote Excel scannera généralement les premières premières lignes Afin de déterminer le type de données à utiliser pour chaque colonne. Si une colonne est déterminée à être numérique Sur la base d'une analyse des premières lignes, toutes les lignes avec des caractères alpha dans cette colonne vont être retourné comme null. Le paramètre IMEX (1 est le mode d'entrée) force le type de données de la colonne à texte de sorte que les valeurs alphanumériques soient traitées correctement.

considère


0 commentaires

2
votes

Ce n'est pas complètement juste! Apparemment, Jet / Ace assume toujours un type de chaîne si les 8 premières lignes sont vides, quels que soient IMEX = 1, et utilise toujours un type numérique si les 8 premières lignes sont des chiffres (à nouveau, indépendamment de IMEX = 1). Même lorsque j'ai fait lire les lignes à 0 dans le registre, j'ai toujours eu le même problème. C'était le seul moyen sûr de l'incendie de le faire fonctionner:

try
{
    Console.Write(wsReader.GetDouble(j).ToString());
}
catch   //Lame unfixable bug
{
    Console.Write(wsReader.GetString(j));
}


3 commentaires

Tout dépend de si vous avez altéré le registre ou non, tapeguessRows en particulier msdn.microsoft.com/en-us/library/bb177610 (v = bureau.12) .aspx


Essayez d'utiliser wsreader.getvalue (j) .tostring (), puis si vous le souhaitez comme un double, vous pouvez essayer de l'analyser à partir de la chaîne.


Le problème avec cela, Jim, est que si vos premières valeurs de la colonne sont des chiffres, mais que vous avez plus tard des valeurs telles que "CDF62738", ces valeurs seront prises comme NULL Becouse Numéro invalide: /



1
votes

Une solution alternative consiste à ajouter ou à modifier le réglage TypeGuessRows dans le registre. En définissant sa valeur à 0, le document complet sera numérisé.

Malheureusement, les paramètres peuvent être trouvés sur divers endroits du registre, en fonction des bibliothèques et des versions que vous avez installées.

Par exemple: [HKEY_LOCAL_MACHINE \ LOGICIEL \ WOW6432NODE \ Microsoft \ Jet \ 4.0 \ Moteurs \ Excel] "TypeGuessRows" = DWORD: 00000000

[HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Office \ 14.0 \ Access Connectivitect Engine \ Moteurs \ Excel] "TypeGuessRows" = DWORD: 00000000

Cela empêchera également la troncature de données textuelles de plus de 255 caractères. Cela se produit si vous avez un numéro pour TypeguessRows de plus de 0% et que le premier texte plus de 255 caractères se produit au-delà de ce nombre.

Voir aussi Réglage TypeGuessRows pour Excel Ace pilote .


0 commentaires