2009-11-25 5 views
0

Je souhaite autoriser mon application à importer des données à partir de fichiers XLS. Je le fais déjà avec CSV fichiers et XML fichiers, mais je voudrais ouvrir la portée pour les utilisateurs. J'ai des problèmes avec le chargement du fichier. Nous chargeons les fichiers (XLS, CSV, XML) dans un ensemble de données et travaillons dessus à partir de là. Le code de chargement pour XLS est inférieure àLecture d'un fichier XLS avec Microsoft Jet Engine

FileInfo fi = new FileInfo(filename); 

//create and open a connection with the supplied string 
OleDbConnection objOleDBConn; 
objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", fi.FullName)); 
objOleDBConn.Open(); 

DataTable dt = objOleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

if (dt == null || dt.Rows.Count == 0) 
{ 
    return; 
} 

string sheet = dt.Rows[0]["TABLE_NAME"].ToString(); 

//then read the data as usual. 
OleDbDataAdapter objOleDBDa; 
objOleDBDa = new OleDbDataAdapter(string.Format("select * from [{0}]",sheet), objOleDBConn); 
objOleDBDa.Fill(data); 
objOleDBConn.Close(); 

Alors mes données se charge OK, mais il semble définir les types de données de différentes colonnes, ce qui est un problème pour un de mes colonnes. C'est un champ de bit et nous avons choisi d'accepter False, True, Yes, No, Y, et N. Il y a du code qui transfère ceci dans un booléen plus tard. Cela fonctionne bien dans un fichier CSV (pour lequel la chaîne de connexion est différente) mais dans un XLS, si les 10 premières lignes sont dites FALSE ou TRUE, puis que le 11 dit YES, alors je viens d'obtenir une entrée nulle. Je devine qu'il lit les premières entrées et détermine le type de données basé sur cela?

Question: Existe-t-il un moyen de désactiver le mécanisme qui identifie le type de données d'une colonne en fonction des premières entrées?

+0

Vous pouvez essayer d'ajouter MaxScanRows = 1 aux propriétés étendues de la chaîne de connexion, puis avoir des champs de texte dans la première ligne de la feuille. Je n'ai jamais essayé cela mais cela pourrait fonctionner? – Tester101

Répondre

0

Cette question est très similaire à Excel cell-values are truncated by OLEDB-provider et Excel reading in ASP.NET : Data not being read if column has different data formats On dirait que quelques solutions réalisables sont abordées dans ces autres questions.

+0

Merci, mais il n'offre pas tout à fait la solution complète, ou pas celui que je cherchais. Modification du Registre peut ne pas fonctionner si la stratégie de sécurité des utilisateurs l'a verrouillé à droite? – wdhough

0

Il existe un paramètre de registre pour indiquer au fournisseur Jet le nombre de lignes à lire pour déduire le type de données de la colonne. Il vaut par défaut 8 je crois. C'est:

HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows 

(changer la version selon le cas). Dans votre cas, il a déduit booléen et ignore donc la valeur de chaîne "oui".

+0

Merci, mais que se passe-t-il si vous n'avez pas accès au registre parce que la politique de sécurité de cet utilisateur est verrouillée. Je ne peux pas croire que Microsoft écrit une fonctionnalité et afin de l'éteindre, vous devez définir la fonctionnalité pour tester tout juste pour savoir que vous ne voulez pas utiliser la fonctionnalité, semble en arrière. Remerciements Will – wdhough

+0

À moins de diviser la feuille en lots de 8 feuilles, pas grand-chose que vous puissiez faire. –

0

Essayez ceci OleDBAdapter Excel QA J'ai posté via le débordement de la pile.

Je peuplaient une colonne de feuille de calcul w/all VRAI ou FAUX puis jeté dans plusieurs « oui » ou valeurs « non » au hasard et il a bien fonctionné ...

Exécuter en mode débogage, puis cliquez sur le DataSet Visualizer après qu'il a été rempli pour voir les résultats. Ou, ajouter à la fin du code pour la sortie

// DataSet:   
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3]; 
string rowElevenColumn3 = row11Col3.ToString(); 
Questions connexes