Lors de l'obtention du contenu d'une cellule à l'aide d'Apache-POI de la Bibliothèque, je reçois à la fois “Impossible d'obtenir une valeur numérique à partir d'une cellule de texte” et à l'inverse de celle. Comment puis-je résoudre ce problème?
Je me rends compte que la question est un peu confuse, mais je ne savais pas comment l'exprimer. De toute façon, voici le code original:
private void readFile(String excelFileName) throws FileNotFoundException, IOException {
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(excelFileName));
if (workbook.getNumberOfSheets() > 1){
System.out.println("Please make sure there is only one sheet in the excel workbook.");
}
XSSFSheet sheet = workbook.getSheetAt(0);
int numOfPhysRows = sheet.getPhysicalNumberOfRows();
XSSFRow row;
XSSFCell num;
for(int y = 1;y < numOfPhysRows;y++){ //start at the 2nd row since 1st should be category names
row = sheet.getRow(y);
poNum = row.getCell(1);
item = new Item(Integer.parseInt(poNum.getStringCellValue());
itemList.add(item);
y++;
}
}
private int poiConvertFromStringtoInt(XSSFCell cell){
int x = Integer.parseInt(Double.toString(cell.getNumericCellValue()));
return x;
}
J'obtiens l'erreur suivante:
Exception in thread "main" java.lang.IllegalStateException: Cannot get a numeric value from a text cell
at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:781)
at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:199)
Même si je le modifier pour obtenir une chaîne de caractères à l'aide de XSSFCell.getStringCellValue()
ou même XFFSCell.getRichTextValue
, j'ai l'inverse de ce qui précède message d'erreur (et je suis veiller à, finalement, de prendre un int à l'aide de Integer.parseInt(XSSFCell.getStringCellValue()
).
L'erreur de lit ensuite:
Exception in thread "main" java.lang.IllegalStateException: Cannot get a text value from a numeric cell
at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:781)
at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:199)
Je sais pour un fait que la feuille de calcul excel colonne est en fait une chaîne de caractères. Je ne peux pas changer la feuille excel comme il est transféré ailleurs où en utilisant toujours le même format et la mise en forme de chaque colonne de la première prend beaucoup de temps de traitement.
Des suggestions?
[Solution] Voici la solution de code, je suis venu avec de @Wivani aide:
private long poiGetCellValue(XSSFCell cell){
long x;
if(cell.getCellType() == 0)
x = (long)cell.getNumericCellValue();
else if(cell.getCellType() == 1)
x = Long.parseLong(cell.getStringCellValue());
else
x = -1;
return x;
}
- Vérifier l'API; il existe des méthodes pour interroger le type d'une colonne, de sorte que vous pouvez l'utiliser pour vérifier si vous devez convertir ou pas. PS Que l'extrait de code est insuffisante pour vraiment vous aider à déboguer.
- Que tout le monde sache ce qui s'est passé, j'ai découvert que les 100 premiers ou les numéros eu un 0. Cela a provoqué excel automatiquement en faire une chaîne de caractères. Donc j'ai dû écrire une méthode pour vérifier le type de premier et ensuite le format en conséquence. Merci @Wivani
- Intéressant peut-être pour la future référence pour ajouter votre solution de code"?
Vous devez vous connecter pour publier un commentaire.
XSSFCell.CELL_TYPE_...
Vous pouvez obtenir une valeur en tant que Chaîne de caractères en utilisant le format défini pour cette cellule :
Grâce à cette réponse.
Suffit d'utiliser la cellule.setCellType(1); avant de lire la valeur de la cellule et de l'obtenir en tant que Chaîne de toujours, après que vous pouvez utiliser dans votre propre format(type).
Ravi
Utiliser le code ci-dessous pour lire tout type de données à partir de xcels à l'aide de poi.
J'ai eu aussi ce bug avec POI version 3.12 final.
Je pense que le bug est-il enregistré : https://bz.apache.org/bugzilla/show_bug.cgi?id=56702 et j'ai mis un commentaire avec mon analyse.
Voici la solution que j'ai utilisé : L'exception a été ressuscité par HSSFCell.getNumericCellValue qui a été appelé par DateUtil.isCellDateFormatted. DateUtil.isCellDateFormatted fait 2 choses :
1) vérifiez le type de la valeur de la cellule en appelant HSSFCell.getNumericCellValue et puis DateUtil.isValidExcelDate(), qui est presque inutile ici, je pense.
2) vérifiez si le format de la cellule est un format de date
J'ai copié le code de la rubrique 2) ci-dessus dans une nouvelle fonction "myIsADateFormat" et l'a utilisé à la place de DateUtil.isCellDateFormatted (c'est assez sale, de copier le code de bibliothèque, mais il fonctionne...) :
Si vous avez besoin de vérifier le type de la valeur tout d'abord, vous pouvez utiliser ce trop :
De Documentation clairement dit de ne pas setCellType à 1 au lieu d'utiliser le DataFormatter comme la façon dont Thierry a expliqué:
https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType(int)
Ravi solution fonctionne :
Suffit d'utiliser la cellule.setCellType(1); avant de lire la valeur de la cellule et de l'obtenir en tant que Chaîne de toujours, après que vous pouvez utiliser dans votre propre format(type).