Lecture de la valeur de chaîne à partir d'Excel avec HSSF mais c'est double
Je suis en utilisant HSSF-PI pour la lecture de données excel. Le problème est que j'ai des valeurs dans une cellule qui ressemble à un numéro, mais vraiment sont des chaînes de caractères. Si je regarde le format de cellule dans Excel, il est dit que le type "texte". Encore la HSSF Cellules pense que c'est numérique. Comment puis-je obtenir la valeur sous forme de chaîne de caractères?
Si j'essaie d'utiliser cell.getRichStringValue
je reçois exception; si cell.toString
ce n'est pas exactement la même valeur que dans la feuille Excel.
Modifier: jusqu'à ce est résolu, je vais utiliser
new BigDecimal(cell.getNumericCellValue()).toString()
source d'informationauteur egaga
Vous devez vous connecter pour publier un commentaire.
Vous dire HSSF-POI dit
cell.getCellType() == Cell.CELL_TYPE_NUMERIC
PAS
Cell.CELL_TYPE_STRING
comme il faut?Je pense que c'est un bug en PVE, mais chaque cellule contient une Variante, et la Variante a un type. C'est un peu dur de faire un bug là, donc je pense que Excel utilise des données supplémentaires ou heuristiques pour signaler le champ de texte. D'habitude MS façon, hélas.
P. S. Vous ne pouvez pas utiliser toute
getString()
sur un Variant contenant numérique, comme la représentation binaire de la Variante de données dépend du type, et en essayant d'obtenir une chaîne de caractères à partir de ce qui est en fait un nombre conséquent de déchets, et donc l'exception.La classe que vous soyez à la recherche de POI est DataFormatter
Lorsque Excel écrit le fichier, certaines cellules sont stockées comme des Chaînes de caractères littérales, tandis que d'autres sont stockées comme des numéros. Pour ce dernier, une valeur à virgule flottante représentant la cellule est stocké dans le fichier, de sorte que lorsque vous demandez POI pour la valeur de la cellule qui est ce qu'il a fait.
Parfois, cependant, surtout quand on fait de l'Extraction du Texte (mais pas toujours), vous voulez faire de la valeur de la cellule regardez comme il le fait dans Excel. Il n'est pas toujours possible d'obtenir exactement dans une Chaîne de caractères (sans espace rembourrage par exemple), mais le DataFormatter classe, vous obtiendrez près.
Si vous êtes après une Chaîne de caractères de la cellule, à la recherche autant que vous à la recherche dans Excel, il suffit de faire:
Le formateur sera de retour de la Chaîne de cellules, et pour les cellules appliquera les règles de mise en forme sur le style pour le nombre de la cellule
Si les documents que vous êtes d'analyse sont toujours dans une mise en page particulière, vous pouvez modifier le type de cellule de "chaîne" à la volée et ensuite récupérer la valeur. Par exemple, si la colonne 2 doit toujours être la chaîne de données, définissez son type de cellule à la chaîne et ensuite le lire avec la chaîne-type de méthodes get.
Dans mes tests, en changeant le type de cellule n'a pas modifié le contenu de la cellule, mais ne lui permettent d'être récupéré avec l'une des approches suivantes:
Sans exemple d'une valeur qui n'est pas de convertir correctement, il est difficile de savoir si cela va se comporter différemment de la cellule.toString() de l'approche que vous avez décrits dans la description.
Ce code ci-dessous fonctionne très bien pour lire tout celltype mais que la cellule doit contenir une valeur numérique
par exemple
où la variable de l'esg est de type BigDecimal.
Excel convertit tout ce qui ressemble à un nombre ou une date ou de l'heure à partir d'une chaîne. Voir MS article de base de Connaissancesqui suggère d'entrer le numéro avec un caractère supplémentaire qui rend une chaîne de caractères.
Vous êtes probablement traiter avec un Excel problème. Lorsque vous créez une feuille de calcul, la valeur par défaut de la cellule est de type Générique. Avec ce type, Excel devine le type sur la base d'informations et de ce type sont enregistrées avec chaque cellule.
Plus tard lorsque vous modifiez le format de cellule de Texte, vous êtes simplement en changeant la valeur par défaut. Excel ne change pas chaque cellule est de type automatique. Je n'ai pas trouvé le moyen de le faire automatiquement.
Pour confirmer cela, vous pouvez aller à Excel et retaper un des nombres et de voir si c'est du texte dans HSSF.
Vous pouvez aussi regarder le vrai type de cellule à l'aide de cette fonction,
A1 est la cellule pour le nombre. Il montre "l" pour le texte, "v" pour les nombres.
Le problème avec Excel, c'est que le format par défaut est générique. Avec ce format Excel stocke les nombres entrés dans la cellule sous la forme numérique. Vous devez modifier le format de texte avant entrer les valeurs. En rentrant les valeurs après avoir changé le format sera également le travail.
Qui va conduire à petits triangles verts dans le coin supérieur gauche de l'cellules si le contenu ressemble à un certain nombre d'Excel. Si c'est le cas, la valeur est en fait stockés en tant que texte.
Avec new BigDecimal(de la cellule.getNumericCellValue()).toString (), vous aurez toujours beaucoup de problèmes. Par exemple, si vous avez des numéros d'identification (par exemple numéro de pièce ou les numéros de classement) vous avez probablement des cas qui ont des zéros qui sera un problème avec le getNumericCellValue() approche.
J'essaie d'expliquer en détail comment créer correctement le Excel pour le parti de créer les fichiers que j'ai à gérer avec PI. Si les fichiers sont téléchargés par les utilisateurs finaux, j'ai même créé un programme de validation pour vérifier prévu types de cellules si je sais que les colonnes à l'avance. En tant que sous-produit, vous pouvez également consulter diverses autres choses des fichiers fournis (par exemple, le droit de colonnes ou de valeurs impératives).
"Le problème est que j'ai des valeurs dans une cellule qui ressemble à un numéro de" => ressembler nombre dans Excel?
"mais vraiment, sont des chaînes de caractères" => ça veut dire quoi? Comment SAVEZ-vous qu'ils sont vraiment les ficelles?
"Si je regarde le format de cellule" => quel est le "format de cellule"???
... dans Excel, il est dit que le type est "texte"' => Veuillez expliquer.
"Toujours le HSSF Cellules pense que c'est numérique." => voulez-vous dire que the_cell.getCellType() renvoie la Cellule.CELL_TYPE_NUMERIC?
"Comment puis-je obtenir la valeur sous forme de chaîne de caractères?" => si c'est NUMÉRIQUE, obtenir la valeur numérique à l'aide de the_cell.getNumericCellValue(), puis les mettre en forme dans une chaîne de caractères de la manière que vous voulez.
"Si j'essaie d'utiliser la cellule.getRichStringValue, je reçois exception;" => il n'est donc pas une chaîne de caractères.
"si la cellule.toString, ce n'est pas exactement la même valeur que dans la feuille Excel." => si la cellule.toString() n'est pas le format de la manière que le format Excel.
Quelle que soit heuristique Excel utilise pour déterminer le type n'est pas pertinent pour vous. C'est le RÉSULTAT de cette décision, tel qu'il est stocké dans le fichier et révélée par getCellType() qui compte.