la lecture Excel Open XML est ignorer les cellules vides
Je suis en utilisant le solution retenue ici pour convertir une feuille excel dans une datatable. Cela fonctionne bien si j'ai "parfait" de données, mais si j'ai une cellule vide au milieu de mes données, il semble mettre le mauvais de données dans chaque colonne.
Je pense que c'est parce que dans le code ci-dessous:
row.Descendants<Cell>().Count()
est le nombre de peuplé de cellules (pas toutes les colonnes) ET:
GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
semble trouver la prochaine peuplée de la cellule (pas nécessairement ce qui est de l'indice), donc si la première colonne est vide et je l'appelle ElementAt(0), il retourne la valeur de la deuxième colonne.
Voici tout le code d'analyse.
DataRow tempRow = dt.NewRow();
for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
{
tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
if (tempRow[i].ToString().IndexOf("Latency issues in") > -1)
{
Console.Write(tempRow[i].ToString());
}
}
- Merci de voir ceci réponse dans le même thread que vous avez mentionnés. Il a le correctif pour les cellules vides.
Vous devez vous connecter pour publier un commentaire.
Ce sens depuis Excel ne sera pas stocker une valeur dans une cellule qui est nulle. Si vous ouvrez votre fichier à l'aide du SDK Open XML 2.0 Outil de Productivité et de traverser le XML vers le bas au niveau de la cellule, vous verrez que seules les cellules qui ont des données dans ce fichier.
Sont vos options pour insérer les données vides dans la plage de cellules que vous allez traverser ou par programme figure une cellule a été ignoré et ajuster votre index de façon appropriée.
J'ai fait un exemple de document excel avec une chaîne de référence de la cellule A1 et C1. J'ai ensuite ouvert le document excel dans le format XML Ouvert Outil de Productivité et voici le XML qui a été stockée:
Ici, vous verrez que les données correspondent à la première ligne et que seulement deux cellules de données sont enregistrés pour cette ligne. Les données enregistrées correspond à A1 et C1, et qu'aucune des cellules avec des valeurs null sont enregistrés.
Afin d'obtenir les fonctionnalités dont vous avez besoin, que vous pouvez parcourir sur les Cellules comme vous le faites ci-dessus, mais vous aurez besoin de vérifier ce que la valeur de la Cellule est de référencement et de déterminer si toutes les Cellules ont été ignorés. pour cela, vous aurez besoin de deux fonctions de l'utilitaire d'obtenir le Nom de la Colonne à partir de la référence de la cellule, puis de traduire ce nom de colonne dans un index de base zéro:
Ensuite, vous pouvez effectuer une itération sur les Cellules et vérifier pour voir ce que la cellule de référence est comparée à la columnIndex. Si c'est moins que vous ajoutez des données vierges pour votre tempRow, sinon il suffit de lire dans la valeur contenue dans la cellule. (Note: je n'ai pas tester le code ci-dessous, mais l'idée générale devrait aider):
Voici une implémentation de
IEnumerable
qui devrait faire ce que vous voulez, de la compilation et de l'unité testée.Voici les fonctions qu'il repose sur:
De le jeter dans une classe et lui donner un essai.
Voici une version légèrement modifiée de Waylon réponse qui s'est également fondé sur d'autres réponses. Il est un condensé de sa méthode dans une classe.
J'ai changé
à
Voici la classe, vous n'avez pas besoin d'instancier, il sert juste comme une classe utilitaire:
Maintenant, vous êtes en mesure d'obtenir toutes les lignes des " cellules de cette façon:
Il contiendra toutes les cellules, même si elles sont vides.
Voir ma mise en œuvre:
HeaderLetters sont recueillies à l'aide de cette classe:
Et les méthodes d'assistance sont:
La solution traite avec cellule partagée éléments (SST indexé cellules).
Tous de bons exemples. Voici celui que je suis de l'aide car j'ai besoin de garder une trace de toutes les lignes, des cellules, des valeurs et des titres de corrélation et d'analyse.
La méthode ReadSpreadsheet ouvre un xlxs fichier et passe par chaque feuille de calcul, de ligne et de colonne. Puisque les valeurs sont stockées dans un référencés chaîne de table, j'ai aussi utiliser explicitement que par feuille de calcul. Il y a d'autres classes utilisées: DSFunction et StaticVariables. Celui-ci tient souvent utilisé les valeurs des paramètres, tels que la référencées 'quotdouble' ( quotdouble = "\u0022"; ) et "crlf' (crlf = "\u000D" + "\u000A"; ).
Pertinentes DSFunction méthode GetIntColIndexForLetter est inclus ci-dessous. Elle retourne une valeur entière pour l'index de colonne correspondant à la lettre des noms tels que (A,B, AA, ADE, etc.). Ce est utilisé avec le paramètre "ncellcolref" pour déterminer si les colonnes ont été ignorées et d'entrer vide de la chaîne de valeurs pour chaque celui qui manque.
Je fais aussi un peu de nettoyage de l'valeurs avant de les stocker temporairement dans une Liste d'objet (à l'aide de remplacement de la méthode).
Par la suite, j'utilise une table de hachage (Dictionnaire) des noms de colonnes à extraire les valeurs dans les différentes feuilles de calcul, de les corréler, de créer des valeurs normalisées, et ensuite créer un objet utilisé dans notre produit qui est ensuite stocké dans un fichier XML. Rien de ce qui est montré mais pourquoi cette approche est utilisée.
La lettre de code est une base de 26 encodage, donc cela devrait fonctionner pour la convertir en décalage.
Vous pouvez utiliser cette fonction pour extraire une cellule à partir d'une ligne passant à l'en-tête de l'indice:
D'accord, je ne suis pas un expert sur ce sujet, mais les autres réponses ne semblent comme la tuer pour moi, donc voici ma solution:
Espère que quelqu'un trouve cette pratique!
Avec mes excuses pour annonce encore une autre réponse à cette question, voici le code que j'ai utilisé.
J'ai eu des problèmes avec OpenXML ne fonctionne pas correctement si une feuille de calcul a une ligne vide dans la partie supérieure. Il serait parfois juste de retour d'un DataTable avec 0 lignes et 0 colonnes en elle. Le code ci-dessous s'adapte à cette et toutes les autres feuilles de calcul.
Voici comment vous appelez mon code. Il suffit de passer un nom de fichier et le nom de la Feuille de calcul à lire dans:
Et voici le code lui-même:
Je ne peux pas résister à l'optimisation de la sous-routines de Amurra réponse à retirer besoin de Regex est.
La première fonction n'est pas réellement nécessaire puisque la seconde, on peut acceptera une référence de cellule (C3) ou un nom de colonne (C) (mais encore une belle fonction d'assistance). Les indices sont également d'une fonction (uniquement parce que notre mise en œuvre utilisé une base pour les lignes à correspondre visuellement avec Excel).
Ajouté encore une autre mise en œuvre, ce moment où le nombre de colonnes est connu à l'avance:
Appel à l'aide:
Où 38 est le nombre de colonnes.
De lire des cellules vides, je suis en utilisant une variable nommée "CN" attribué à l'extérieur de la ligne de lecteur et dans la boucle while, je vérifie si l'index de colonne est supérieure ou non à partir de ma variable comme c'est incrémenté après chaque cellule de lecture. si cela ne correspond pas, je suis de remplir ma colonne avec des valeurs que je veux. C'est le truc que j'ai utilisé pour rattraper les cellules vides dans mon respectant la valeur de la colonne. Voici le code:
Code fonctionne pour:
Voici ma solution. J'ai trouvé le ci-dessus ne semble pas bien fonctionner lorsque les champs manquants où à la fin d'une ligne.
En supposant que la première ligne de la feuille Excel dispose de TOUTES les colonnes (via les en-têtes), puis saisir le nombre de colonnes prévu par ligne (row == 1). Ensuite une boucle à travers les lignes de données (ligne > 1). La clé de la transformation des cellules manquantes est dans la méthode getRowCells, où le nombre connu de cellules de colonne est transmis en tant que bien que la ligne en cours de processus.
Méthode getRowCells a une limitation de courant de seulement être en mesure de soutenir une feuille (ligne) qui a moins de 26 colonnes. Une boucle basée sur l'connu nombre de colonnes est utilisée pour trouver des colonnes manquantes (cellules). Si elle est trouvée, une nouvelle valeur de la Cellule est inséré dans les cellules de la collection, avec la nouvelle Cellule ayant une valeur par défaut de "" au lieu de "nulle". Les Cellules modifiées collection est alors retourné.