Un fichier Excel analyse en C #, les cellules semblent avoir coupé à 255 caractères ... Comment puis-je arrêter ça?

StackOverflow https://stackoverflow.com/questions/926453

Question

Je suis un analyse syntaxique à travers des fichiers Excel téléchargés (xlsx) dans asp.net avec c #. Je suis en utilisant le code suivant (simplifié):

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";");
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connString);
DataSet ds = new DataSet();
adapter.Fill(ds);
adapter.Dispose();
DataTable dt = ds.Tables[0];
var rows = from p in dt.AsEnumerable() select new { desc = p[2] };

Cela fonctionne parfaitement, mais s'il y a quelque chose de plus de 255 caractères dans la cellule, il coupe la parole. Toute idée de ce que je fais mal? Merci.

EDIT:. Lorsque vous affichez la feuille Excel, il montre beaucoup plus de 255 caractères, donc je ne crois pas que la feuille elle-même est limitée

Était-ce utile?

La solution

Juste d'une recherche sur Google rapide du sujet, il semble que c'est une limite d'Excel.

EDIT : Solution possible (malheureusement en VB)

Autres conseils

La solution!

Je suis bats aujourd'hui aussi bien. Je l'ai finalement obtenu de travailler en modifiant certaines clés de registre avant d'analyser la feuille de calcul Excel.

Vous devez mettre à jour cette clé de Registre avant l'analyse de la feuille de calcul Excel:

// Excel 2010
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\
or
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\

// Excel 2007
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\

// Excel 2003
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\

Changement TypeGuessRows à 0 et ImportMixedTypes à Text sous cette clé. Vous aurez également besoin de mettre à jour votre chaîne de connexion pour inclure IMEX=1 dans les propriétés étendues:

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";");

Références

http: //blogs.vertigo.com/personal/aanttila/Blog/archive/2008/03/28/excel-and-csv-reference.aspx

http://msdn.microsoft.com/en-us/library/ ms141683.aspx

  

... caractères peuvent être tronqués. Pour importer   les données d'une colonne de mémoire sans   troncature, vous devez vous assurer que   la colonne de mémoire dans au moins l'un des   les lignes de l'échantillon contient une valeur plus   de 255 caractères, ou vous devez   augmenter le nombre de lignes de l'échantillon par   le conducteur d'inclure une telle ligne. Vous   peut augmenter le nombre de lignes   échantillonner en augmentant la valeur de   TypeGuessRows sous la   HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel   clé de Registre ....

Je suis tombé sur cela, et la solution qui a fonctionné pour moi était de déplacer les cellules avec un long texte en haut de la feuille de calcul.

J'ai trouvé ce commentaire dans un forum décrivant la question

  

Ceci est un problème avec le fournisseur OLEDB Jet. Il regarde la première 8 lignes   du   feuille de calcul pour déterminer le type de données dans chaque colonne. Si la colonne ne
  contient pas de   une valeur de champ au-dessus de 256 caractères dans les premiers 8 rangées , puis assume la
  Type de données   est un texte qui a une limite de caractères de 256. L'article suivant KB a
  plus   informations sur cette question: http://support.microsoft.com/kb/281517

L'espoir de cette aide quelqu'un d'autre!

Avez-vous essayé de placer les colonnes type de données en texte dans le tableur? Je crois que faire cela permettra aux cellules de contenir beaucoup plus de 255 caractères.

[Modifier] Pour ce que ça vaut cette dialogue avec le MS- équipe Excel est une lecture intéressante. Dans la section des commentaires au fond ils entrent dans des discussions à ce sujet coupure 255. Ils disent Excel 12 peut prendre en charge 32k caractères par cellule.

Si cela est vrai, il doit y avoir un moyen d'obtenir ces données. Voici deux choses à considérer.

  1. Dans le passé, j'ai utilisé l'option « IMEX = 1 » dans ma chaîne de connexion à traiter avec des colonnes contenant des données mixtes montrant comme vide. Il est un Longshot, mais vous pouvez donner qu'un essai.

  2. Pouvez-vous exporter le fichier vers un fichier plat délimité par des tabulations? À mon humble avis c'est le moyen le plus fiable de traiter les données Excel, car Excel ne tant gotchas.

SpreadsheetGear .NET peut lire et écrire (et plus) xls et xlsx classeurs et prend en charge les mêmes limitations Excel pour le texte - en d'autres termes, il sera tout simplement travailler. Il y a une évaluation gratuite si vous voulez essayer.

Disclaimer: Je détiens SpreadsheetGear LLC

En ce qui concerne le dernier message, je l'utilise aussi SpreadsheetGear et trouve qu'il souffre aussi de 255 caractères par limitation de la cellule lors de la lecture de l'ancien format XLS (non XLSX).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top