J'ai un fichier Excel avec un tel contenu:
A1: SomeString
A2: 2
Tous les champs sont définis au format chaîne.
Lorsque je lis le fichier en java en utilisant POI, cela indique que A2 est au format de cellule numérique.
- Le problème est que la valeur dans A2 peut être 2 ou 2.0 (et je veux pouvoir les distinguer) donc je ne peux pas simplement utiliser
.toString()
.
Que puis-je faire pour lire la valeur sous forme de chaîne?
java
excel
apache-poi
joycollector
la source
la source
Je ne pense pas que nous ayons eu ce cours lorsque vous avez posé la question, mais aujourd'hui, il y a une réponse facile.
Ce que vous voulez faire, c'est utiliser la classe DataFormatter . Vous passez cette cellule et il fait de son mieux pour vous renvoyer une chaîne contenant ce qu'Excel vous montrerait pour cette cellule. Si vous lui passez une cellule de chaîne, vous récupérerez la chaîne. Si vous lui passez une cellule numérique avec des règles de mise en forme appliquées, il formatera le nombre en fonction de celles-ci et vous rendra la chaîne.
Pour votre cas, je suppose que les cellules numériques ont une règle de mise en forme entière qui leur est appliquée. Si vous demandez à DataFormatter de formater ces cellules, il vous rendra une chaîne contenant la chaîne entière.
Notez également que beaucoup de gens suggèrent de le faire
cell.setCellType(Cell.CELL_TYPE_STRING)
, mais les JavaDocs Apache POI indiquent clairement que vous ne devriez pas faire cela ! Faire cetsetCellType
appel perdra la mise en forme, car les javadocs expliquent que la seule façon de convertir en une chaîne avec le formatage restant est d'utiliser la classe DataFormatter .la source
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
Le code ci-dessous a fonctionné pour moi pour tout type de cellule.
la source
getCreationHelper().createFormulaEvaluator()
méthode. De cette façon, votre code ne sera pas couplé à la classe HSSFFormulaEvaluator.FormulaEvaluator
simplement être retiré de cette solution? Cela sert-il un but?Je recommanderais l'approche suivante lorsque la modification du type de cellule n'est pas souhaitable:
NumberToTextConverter peut convertir correctement une valeur double en texte en utilisant les règles d'Excel sans perte de précision.
la source
Comme déjà mentionné dans les JavaDocs du Poi ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) n'utilisez pas:
mais utilisez:
Plus d'exemples sur http://massapi.com/class/da/DataFormatter.html
la source
Oui, cela fonctionne parfaitement
conseillé:
vieux:
même si vous avez un problème avec la récupération d'une valeur à partir d'
cell
une formule, cela fonctionne toujours.la source
Essayer:
Doit formater le nombre correctement.
la source
2
et2.0
. Votre solution ne ferait pas cela. (MaisTant que la cellule est au format texte avant que l'utilisateur ne saisisse le nombre, POI vous permettra d'obtenir la valeur sous forme de chaîne. Une clé est que s'il y a un petit triangle vert dans le coin supérieur gauche de la cellule qui est formaté comme Texte, vous pourrez récupérer sa valeur sous forme de chaîne (le triangle vert apparaît chaque fois que quelque chose qui semble être un nombre est contraint dans un format texte). Si vous avez des cellules au format texte qui contiennent des nombres, mais que POI ne vous permettra pas de récupérer ces valeurs sous forme de chaînes, vous pouvez effectuer certaines opérations sur les données de la feuille de calcul pour le permettre:
Une dernière chose que vous pouvez faire est que si vous utilisez POI pour obtenir des données à partir d'une feuille de calcul Excel 2007, vous pouvez utiliser la méthode 'getRawValue ()' de la classe Cell. Cela ne se soucie pas du format. Il renverra simplement une chaîne avec les données brutes.
la source
Lorsque nous lisons la valeur de la cellule numérique de MS Excel à l'aide de la bibliothèque Apache POI, il la lit comme numérique. Mais parfois, nous voulons qu'il soit lu sous forme de chaîne (par exemple, numéros de téléphone, etc.). Voici comment je l'ai fait:
Insérez une nouvelle colonne avec la première cellule = CONCATENER ("!", D2). Je suppose que D2 est l'identifiant de votre colonne de numéro de téléphone. Faites glisser la nouvelle cellule jusqu'à la fin.
Maintenant, si vous lisez la cellule en utilisant POI, il lira la formule au lieu de la valeur calculée. Maintenant, procédez comme suit:
Ajouter une autre colonne
Sélectionnez la colonne complète créée à l'étape 1. et choisissez Edition-> COPIER
Accédez à la cellule supérieure de la colonne créée à l'étape 3. et sélectionnez Edition-> Collage spécial
Dans la fenêtre ouverte, sélectionnez le bouton radio "Valeurs"
Sélectionnez "OK"
Maintenant, lisez en utilisant l'API POI ... après avoir lu en Java ... supprimez simplement le premier caractère, c'est-à-dire "!"
la source
J'ai également eu un problème similaire sur un ensemble de données de milliers de chiffres et je pense avoir trouvé un moyen simple de le résoudre. J'avais besoin d'insérer l'apostrophe avant un nombre afin qu'une importation DB distincte voie toujours les nombres sous forme de texte. Avant cela, le numéro 8 était importé en tant que 8.0.
Solution:
Hey Presto tous les numéros mais stockés sous forme de texte.
la source
getStringCellValue renvoie NumberFormatException si le type de cellule est numérique. Si vous ne souhaitez pas changer le type de cellule en chaîne, vous pouvez le faire.
la source
Beaucoup de ces réponses font référence à de vieilles documentations et classes de POI. Dans le dernier POI 3.16, la cellule avec les types int est obsolète
Au lieu de cela, l' énumération CellType peut être utilisée.
Assurez-vous simplement de mettre à jour votre pom avec la dépendance poi ainsi que la dépendance poi-ooxml vers la nouvelle version 3.16, sinon vous continuerez à obtenir des exceptions. L'un des avantages de cette version est que vous pouvez spécifier le type de cellule au moment de la création de la cellule en éliminant toutes les étapes supplémentaires décrites dans les réponses précédentes:
la source
Je préférerais de loin suivre la voie de la réponse de Wil ou Vinayak Dornala, malheureusement ils ont beaucoup trop affecté ma performance. J'ai opté pour une solution HACKY de casting implicite:
Je ne vous suggère pas de faire cela, pour ma situation, cela a fonctionné en raison de la nature du fonctionnement du système et j'avais une source de fichiers fiable.
Note de bas de page: numericColumn Est un int qui est généré à partir de la lecture de l'en-tête du fichier traité.
la source
J'ai essayé ça et ça a marché pour moi
la source
Contrôlez-vous la feuille de calcul Excel de toute façon? Les utilisateurs disposent-ils d'un modèle pour vous donner leur avis? Si tel est le cas, vous pouvez mettre en forme le code des cellules d'entrée pour vous.
la source
Il semble que cela ne puisse pas être fait dans la version actuelle de POI, en raison du fait que ce bogue:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
est toujours en suspens.
la source
cell.setCellType (Cell.CELL_TYPE_STRING); fonctionne bien pour moi
la source
Cela a fonctionné parfaitement pour moi.
la source
Nous avons eu le même problème et avons obligé nos utilisateurs à formater les cellules en tant que «texte» avant d' entrer la valeur. De cette façon, Excel stocke correctement les nombres pairs sous forme de texte. Si le format est modifié par la suite, Excel ne modifie que la façon dont la valeur est affichée mais ne change pas la façon dont la valeur est stockée à moins que la valeur ne soit saisie à nouveau (par exemple en appuyant sur Entrée dans la cellule).
Le fait qu'Excel ait correctement stocké la valeur sous forme de texte est indiqué par le petit triangle vert qu'Excel affiche dans le coin supérieur gauche de la cellule s'il pense que la cellule contient un nombre mais est formatée sous forme de texte.
la source
transtyper en un int puis faire un
.toString()
. C'est moche mais ça marche.la source