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.
Lorsque je lis le fichier en Java avec POI, cela signifie que A2 est au format de cellule numérique.
.toString()
.Que puis-je faire pour lire la valeur sous forme de chaîne?
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.
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 .
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 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.
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
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.
Essayer:
new Java.text.DecimalFormat("0").format( cell.getNumericCellValue() )
Devrait formater le nombre correctement.
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:
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.
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:
Hey Presto tous les numéros mais stockés sous forme de texte.
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é.
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() + "";
}
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
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:
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.
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:
Ajouter une autre colonne
Sélectionnez la colonne complète créée à l'étape 1. et choisissez Édition-> 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 à l'aide de l'API POI ... après avoir lu en Java ... supprimez simplement le premier caractère, c'est-à-dire "!"
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
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);