Comment puis-je lire les chaînes numériques dans les cellules Excel comme chaîne (pas de chiffres)?

StackOverflow https://stackoverflow.com/questions/1072561

  •  21-08-2019
  •  | 
  •  

Question

  1. Je fichier Excel avec un tel contenu:

    • A1: SomeString

    • A2: 2

    Tous les champs sont définis au format String.

  2. Quand je lis le fichier en Java en utilisant POI, il indique que A2 est au format cellulaire numérique.

  3. Le problème est que la valeur A2 peut être 2 ou 2.0 (et je veux être en mesure de les distinguer), donc je ne peux pas utiliser .toString().

Que puis-je faire pour lire la valeur en tant que chaîne?

Était-ce utile?

La solution

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

Autres conseils

Je ne pense pas que nous avions cette classe quand vous posé la question, mais aujourd'hui il y a une réponse facile.

Qu'est-ce que vous voulez faire est d'utiliser la classe DataFormatter . Vous passez cette une cellule, et il fait de son mieux pour vous retourner une chaîne contenant ce que Excel vous montrera pour cette cellule. Si vous passez une cellule de chaîne, vous obtiendrez la chaîne de retour. Si vous passez une cellule numérique, avec des règles de mise en forme appliquée, il forme le nombre basé sur eux et vous donner la chaîne de retour.

Pour votre cas, je suppose que les cellules numériques ont une règle de formatage entier appliqué. Si vous demandez DataFormatter pour formater ces cellules, il vous donnera de nouveau une chaîne avec la chaîne entière en elle.

Notez également que beaucoup de gens suggèrent de faire cell.setCellType(Cell.CELL_TYPE_STRING), mais le JavaDocs Apache POI est aussi très clair que vous ne devriez pas faire ! Faire l'appel va perdre le formatage setCellType, comme javadocs expliquent la seule façon de convertir en une chaîne avec mise en forme restante est d'utiliser le classe DataFormatter .

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);

}

Je recommande l'approche suivante lors de la modification type de cellule est indésirable:

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

NumberToTextConverter peut convertir correctement la valeur double un texte en utilisant les règles de calcul Excel sans perte de précision.

Comme nous l'avons mentionné dans les JavaDocs de Poi ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) ne pas utiliser:

cell.setCellType(Cell.CELL_TYPE_STRING);

, mais l'utilisation:

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

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

Oui, cela fonctionne parfaitement

recommandé:

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

ancien:

cell.setCellType(Cell.CELL_TYPE_STRING);

même si vous avez un problème avec la récupération d'une valeur de formule cell, encore cela fonctionne.

Essayez:

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

formatez le nombre correctement.

Tant que la cellule est au format texte avant que les types d'utilisateur dans le nombre, POI vous permettra d'obtenir la valeur en tant que 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é en tant que texte, vous serez en mesure de récupérer sa valeur en tant que chaîne (le triangle vert apparaît à chaque fois quelque chose qui semble être un nombre est sous la contrainte dans un format de texte). Si vous avez un texte formaté cellules qui contiennent des nombres, mais POI ne vous laissera pas allez chercher ces valeurs sous forme de chaînes, il y a quelques choses que vous pouvez faire pour les données de feuille de calcul pour permettre que:

  • Double-cliquez sur la cellule de sorte que le curseur d'édition est présent dans la cellule, puis cliquez sur Entrée (qui peut être fait qu'une seule cellule à la fois).
  • Utilisez la fonction de conversion de texte Excel 2007 (qui peut être fait sur plusieurs cellules à la fois).
  • Couper les valeurs incriminées à un autre endroit, les reformater cellules de feuille de calcul sous forme de texte, puis repaste les valeurs hors précédemment coupé comme Valeurs non formatées retour 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 la classe Cell méthode « getRawValue () ». Cela ne se soucie pas ce que le format est. Il suffit de retourner une chaîne avec les données brutes.

Quand on lit la valeur de cellule numérique de la MS Excel à l'aide bibliothèque Apache POI, il lu comme numérique. Mais quelque temps que nous voulons lire comme chaîne (par exemple les numéros de téléphone, etc.). Voici comment je l'ai fait:

  1. Insérez une nouvelle colonne avec la première cellule = CONCATENER ( "!", D2). Je suppose que D2 est id cellulaire de votre colonne téléphone numéro. Faites glisser 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, ne suit:

  3. Ajouter une autre colonne

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

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

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

  7. Sélectionnez "OK"

  8. lire maintenant en utilisant l'API de POI ... après avoir lu en Java ... il suffit de retirer le premier caractère à savoir "!"

J'ai aussi eu un problème similaire sur un ensemble de données de milliers de chiffres et je pense que je l'ai trouvé un moyen simple à résoudre. Je avais besoin de lapostrophe inséré avant un numéro pour qu'une importation DB séparée voit toujours les chiffres sous forme de texte. Auparavant, le numéro 8 serait importé en 8.0.

Solution:

  • Gardez tout le formatage en général.
  • Ici, je suppose chiffres sont stockés dans la colonne A partir de la ligne 1.
  • Mettez dans le 'dans la colonne B et copier vers le bas autant de lignes que nécessaire. Rien n'apparaît dans la feuille de calcul, mais en cliquant sur la cellule que vous pouvez voir le apostophe dans la barre de formule.
  • Dans la colonne C: = B1 et A1.
  • Sélectionnez toutes les cellules dans la colonne C et faire une pâte spéciale dans la colonne D en utilisant l'option Valeurs.

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

getStringCellValue retourne NumberFormatException si le type de cellule est numérique. Si vous ne voulez pas changer le type de cellule à chaîne, vous pouvez le faire.

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}

Un grand nombre de ces réponses font référence aux anciens documents de POI et des classes. Dans le plus récent POI 3,16, cellule avec les types int a été désapprouvée

Cell.CELL_TYPE_STRING

Au lieu peut ENUM type de cellule être utilisé.

CellType.STRING 

Assurez-vous de mettre à jour votre pom avec la dépendance poi ainsi que la dépendance poi-OOXML à la nouvelle 3.16 la version sinon vous continuerez à obtenir des exceptions. Un avantage de cette version est que vous pouvez spécifier le type de cellule au moment où la cellule est créée l'élimination de toutes les étapes supplémentaires décrites dans les réponses précédentes:

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

Je préférerais aller la route de la réponse ou Vinayak Dornala du wil, malheureusement, ils effectuent mes performances loin pour beaucoup. Je suis allé pour un Hačky solution de coulée implicite:

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

Je ne suggère pas que vous faites cela, pour ma situation, il a travaillé en raison de la nature de la façon dont le système fonctionnait et j'avais une source de fichier fiable.

Note:     numericColumn Est un entier qui est généré à la lecture de l'en-tête du fichier traité.

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é et cela a fonctionné pour moi

Nous avons eu le même problème et contraint nos utilisateurs à formater les cellules comme «texte avant en entrant 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 change 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 est entrée à nouveau (par exemple en appuyant sur retour lorsque dans la cellule).

Si oui ou non Excel stocké correctement la valeur sous forme de texte est indiquée par le petit triangle vert Excel affiche dans le coin supérieur gauche de la cellule si elle pense que la cellule contient un certain nombre, mais est formatté sous forme de texte.

Avez-vous contrôlez la feuille de calcul Excel de toute façon? Y at-il un modèle les utilisateurs ont pour vous donner l'entrée? Si oui, vous pouvez avoir le format de code les cellules d'entrée pour vous.

On dirait que cela ne peut pas être fait dans la version actuelle de POI, basée sur le fait que ce bug:

https://issues.apache.org/bugzilla/show_bug.cgi? id = 46136

est toujours en suspens.

cell.setCellType (Cell.CELL_TYPE_STRING); fonctionne bien pour moi

à un casting int puis faire un .toString(). Il est laid, mais cela fonctionne.

Cela a fonctionné parfait pour moi.

Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
    legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top