web-dev-qa-db-fra.com

Comment puis-je lire des chaînes numériques dans des cellules Excel sous forme de chaîne (et non de chiffres)?

  1. J'ai un fichier Excel avec un tel contenu: 

    • A1: un peu de corde

    • A2: 2

    Tous les champs sont définis au format String.

  2. Lorsque je lis le fichier en Java avec POI, cela signifie que A2 est au format de cellule numérique.

  3. Le problème est que la valeur en 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?

130
joycollector

J'ai eu le même problème. J'ai fait cell.setCellType(Cell.CELL_TYPE_STRING); avant de lire la valeur de chaîne, ce qui a résolu le problème quelle que soit la façon dont l'utilisateur a formaté la cellule.

292
wil

Je ne pense pas que nous ayons eu ce cours lorsque vous avez posé la question, mais aujourd'hui, la réponse est simple.

Ce que vous voulez faire est d'utiliser la classe DataFormatter . Vous transmettez à cette cellule une cellule et il fait de son mieux pour vous renvoyer une chaîne contenant ce que Excel vous indiquerait pour cette cellule. Si vous lui transmettez une cellule de chaîne, vous récupérez la chaîne. Si vous lui transmettez une cellule numérique avec les règles de formatage appliquées, il formate le nombre en fonction de ces règles et vous renvoie la chaîne.

Dans votre cas, je suppose que les cellules numériques ont une règle de formatage entier qui leur est appliquée. Si vous demandez à DataFormatter de formater ces cellules, il vous restituera une chaîne contenant la chaîne entière.

Notez également que de nombreuses personnes suggèrent de faire cell.setCellType(Cell.CELL_TYPE_STRING), mais le JavaDocs POI Apache indique assez clairement que vous ne devriez pas le faire ! Faire l'appel setCellType perdra le formatage, comme l'explique le javadocs / le seul moyen de convertir en chaîne avec un formatage restant est d'utiliser la classe DataFormatter .

86
Gagravarr

Le code ci-dessous a fonctionné pour moi pour tout type de cellule.

InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);

Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();

while(objIterator.hasNext()){

    Row row = objIterator.next();
    Cell cellValue = row.getCell(0);
    objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
    String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);

}
44
Vinayak Dornala

Je recommanderais l'approche suivante lorsque la modification du type de cellule n'est pas souhaitable:

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

NumberToTextConverter peut convertir correctement une double valeur en texte à l'aide des règles d'Excel sans perte de précision.

24
Stanislav Mamontov

Comme déjà mentionné dans les JavaDocs de Poi ( https://poi.Apache.org/apidocs/org/Apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ), n'utilisez pas: 

cell.setCellType(Cell.CELL_TYPE_STRING);

mais utilisez:

DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);

Plus d'exemples sur http://massapi.com/class/da/DataFormatter.html

15
userM1433372

Oui, cela fonctionne parfaitement

conseillé:

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);

vieux:

cell.setCellType(Cell.CELL_TYPE_STRING);

même si vous ne parvenez pas à extraire une valeur de cell avec une formule, cela fonctionne quand même.

5
Rajesh Mbm

Essayer:

new Java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

Devrait formater le nombre correctement.

4
iTake

Tant que la cellule est au format texte avant que l'utilisateur ne saisisse le nombre, le POI vous permettra d'obtenir la valeur sous forme de chaîne. Une des clés est que s'il y a un petit triangle vert dans le coin supérieur gauche de la cellule qui est mis en forme en tant que 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 forcé dans un format texte). Si vous avez des cellules au format texte contenant des chiffres, mais que POI ne vous permet pas d'extraire ces valeurs sous forme de chaînes, vous pouvez modifier les données de la feuille de calcul de différentes manières: 

  • Double-cliquez sur la cellule pour que le curseur d'édition soit présent à l'intérieur de la cellule, puis cliquez sur Entrée (ce qui ne peut être fait qu'une cellule à la fois).
  • Utilisez la fonction de conversion de texte Excel 2007 (qui peut être effectuée sur plusieurs cellules à la fois).
  • Découpez les valeurs incriminées à un autre emplacement, reformatez les cellules de la feuille de calcul en tant que texte, puis repâchez les valeurs précédemment découpées sous la forme/ Valeurs non formatées dans la zone appropriée.

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 fait rien au format. Il retournera simplement une chaîne avec les données brutes.

1
Mark Farnsworth

J'ai également eu un problème similaire sur un ensemble de données de milliers de nombres et je pense avoir trouvé un moyen simple de le résoudre. J'avais besoin d'insérer l'apostrophe avant un numéro afin qu'une importation distincte dans la base de données considère toujours les nombres sous forme de texte. Avant cela, le numéro 8 serait importé en tant que 8.0.

Solution:

  • Gardez toute la mise en forme en tant que général.
  • Je suppose ici que les numéros sont stockés dans la colonne A à partir de la ligne 1. 
  • Insérez le dans la colonne B et notez autant de lignes que nécessaire. Rien n’apparaissant dans la feuille de calcul, mais en cliquant sur la cellule, vous pouvez voir l’apostophe dans la barre de formule. 
  • Dans la colonne C: = B1 & A1. 
  • Sélectionnez toutes les cellules de la colonne C et faites un collage spécial dans la colonne D à l'aide de l'option Valeurs.

Hey Presto tous les numéros mais stockés sous forme de texte.

0
Mark Holmes

Je préférerais de loin suivre le chemin de la réponse de Wil ou Vinayak Dornala, malheureusement, ma performance a été beaucoup trop lourde… .. Je suis allé chercher une HACKY solution de diffusion implicite:

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

Je ne vous suggère pas de faire cela. Dans mon cas, cela a fonctionné en raison de la nature du système et du fait que je disposais d’une source de fichiers fiable.

Note de bas de page: numericColumnIl s'agit d'un entier généré à partir de la lecture de l'en-tête du fichier traité.

0
KeaganFouche

getStringCellValue renvoie une exception NumberFormatException si le type de cellule est numérique. Si vous ne souhaitez pas modifier le type de cellule en chaîne, vous pouvez le faire.

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}
0
zawhtut
public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
    String retVal=null;
    try {
        FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
        Workbook wb=WorkbookFactory.create(fis);
        Sheet s=wb.getSheet(sheetname);
        Row r=s.getRow(rownum);
        Cell c=r.getCell(cellnum);
        if(c.getCellType() == Cell.CELL_TYPE_STRING)
        retVal=c.getStringCellValue();
        else {
            retVal = String.valueOf(c.getNumericCellValue());
        }

J'ai essayé cela et cela a fonctionné pour moi 

0
Prasanna

Lorsque nous lisons la valeur de cellule numérique de MS Excel à l'aide de la bibliothèque de points d'intérêt Apache, celle-ci est lue sous forme numérique. Mais parfois, nous voulons qu’il se lise sous forme de chaîne (numéros de téléphone, etc.). Voici comment je l'ai fait:

  1. Insérez une nouvelle colonne avec la première cellule = CONCATENATE ("!", D2). Je suppose que D2 est l'identifiant de cellule de votre colonne de numéro de téléphone. Faites glisser la nouvelle cellule jusqu'à la fin.

  2. Maintenant, si vous lisez la cellule en utilisant POI, il lira la formule au lieu de la valeur calculée. Maintenant fais ce qui suit:

  3. Ajouter une autre colonne

  4. Sélectionnez la colonne complète créée à l'étape 1. et choisissez Édition-> COPIER

  5. Accédez à la cellule supérieure de la colonne créée à l'étape 3. et sélectionnez Edition -> Collage spécial.

  6. Dans la fenêtre ouverte, sélectionnez le bouton radio "Valeurs"

  7. Sélectionnez "OK"

  8. Maintenant, lisez à l'aide de l'API POI ... après avoir lu en Java ... supprimez simplement le premier caractère, c'est-à-dire "!"

0
Asif Shahzad

Beaucoup de ces réponses font référence à de la documentation et des classes de POI. Dans le dernier POI 3.16, Cellule avec les types int est obsolète 

Cell.CELL_TYPE_STRING

 enter image description here

Au lieu de cela, le CellType enum peut être utilisé.

CellType.STRING 

Veillez simplement à mettre à jour votre dépendance avec la dépendance poi ainsi que la dépendance poi-ooxml vers la nouvelle version 3.16, sinon vous continuerez à obtenir des exceptions. Un avantage de cette version est que vous pouvez spécifier le type de cellule au moment de sa création en éliminant toutes les étapes supplémentaires décrites dans les réponses précédentes:

titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
0