2009-05-22 5 views
11

J'utilise la classe OleDbConnection pour récupérer des données à partir d'un classeur Excel 2000/2003:cellules valeurs Excel sont tronquées par OLEDB fournisseur

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
          "Data Source=" + filename + ";" + 
          "Extended Properties=\"Excel 8.0;IMEX=1\";"; 

OleDbConnection connection = new OleDbConnection(connectionString); 
connection.Open(); 

// code to get table name from schema omitted 

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection); 
var myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "ExcelInfo"); 

Maintenant, il se trouve que les cellules de la feuille de calcul avec une plus grande longueur que 255 caractères sont tronqués. Est-ce une limitation dans le fournisseur Microsoft.Jet.OLEDB, ou y at-il quelque chose que je peux faire à ce sujet?

Quelqu'un?

Répondre

17

Le fournisseur OLEDB pour Excel tentera de déterminer automatiquement les types de données basés sur les 8 premières lignes de données, ce qui peut être défini avec la propriété HDR = Oui/Non dans la chaîne de connexion. En outre, il existe plusieurs types qu'il peut appliquer aux colonnes de texte. Le type de mémo contient plus de 255 caractères, donc si aucune des 8 premières lignes ne possède cela, alors le type de données sera incorrectement défini.

La façon de changer cela est en changeant un paramètre de Registre appelé TypeGuessRows, comme décrit ici: Microsoft Support

NOTE: La plage de valeurs valides pour la clé TypeGuessRows est de 0 à 16. Cependant, si la valeur est 0 , le nombre de lignes sources analysées est 16384. Donc, si vous avez un très gros fichier, assurez-vous que les plus grandes lignes sont en premier.

+1

Merci. C'est une solution un peu moche, car mon installateur devra modifier le registre de l'utilisateur, mais je pense que cela fonctionnera. Tant que l'administrateur exécute l'installateur .. –

+1

je ne comprends pas la suggestion de microsoft ici/si vous le changez en 16 ne le vérifie-t-il pas juste les 16 premières rangées ?? – leora

+1

@ooo Si vous le modifiez à 0, il balaie toutes les lignes. Attention toutefois car cela peut avoir un impact sur les performances des tables plus grandes. – rmoore

1

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

I peuplé d'une cellule de feuille de calcul (lignes [0] [4]) w/445 caractères et il a bien fonctionné ... Ajouter cela à la fin du code pour le ouput

// DataSet:   
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2]; 
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4]; 

string rowZeroColumn3 = row0Col3.ToString(); 
string rowZeroColumn4 = row0Col4.ToString(); 

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);   
Questions connexes