Un fichier Excel analyse en C #, les cellules semblent avoir coupé à 255 caractères ... Comment puis-je arrêter ça?
-
06-09-2019 - |
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
La solution
Juste d'une recherche sur Google rapide du sujet, il semble que c'est une limite d'Excel.
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.
-
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.
-
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).