Wenn ich Zelleninhalte mit der Apache-POI-Bibliothek erhalte, bekomme ich beides: "Kann keinen numerischen Wert von einer Textzelle bekommen" und umgekehrt. Wie repariere ich es?
Merke ich, die Frage ist ein wenig verwirrend, aber ich wusste nicht wie sonst zu Wort. Wie auch immer, hier ist der original code:
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;
}
Ich erhalte die folgende Fehlermeldung:
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)
Selbst wenn ich es ändern, um entweder einen string mit XSSFCell.getStringCellValue()
oder sogar XFFSCell.getRichTextValue
bekomme ich die Umkehrung der oben genannten Fehlermeldung (und ich bin dafür, dass letztlich machen es zu einem int mit Integer.parseInt(XSSFCell.getStringCellValue()
).
Den Fehler dann liest:
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)
Ich weiß, für eine Tatsache, dass die excel-Tabelle die Spalte ist in der Tat eine Zeichenfolge. Ich kann nicht ändern das excel-sheet, wie es hochgeladen wird, wo sonst immer mit dem gleichen format und Formatierung jeder einzelnen Spalte zuerst nimmt zu viel Verarbeitungszeit.
Irgendwelche Vorschläge?
[Lösung] Hier ist die Lösung, code kam ich mit von @Wivani Hilfe:
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;
}
InformationsquelleAutor der Frage crstamps2 | 2011-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort Mayank
Erhalten Sie den Wert als Zeichenfolge mit dem format definiert für diese Zelle :
Dank diese Antwort.
InformationsquelleAutor der Antwort Thierry
Nur Zellen verwenden.setCellType(1); vor dem Lesen der Zelle mit dem Wert und erhalten als String immer nach, dass Sie können verwenden Sie es in Ihrem eigenen format(Typ).
Ravi
InformationsquelleAutor der Antwort
Verwenden Sie den folgenden code zu Lesen beliebiger Datentyp xcels mit poi.
InformationsquelleAutor der Antwort Nirmal Dhara
Hab ich auch diesen bug mit den POI-version 3.12 endgültig.
Ich denke, dass der Fehler dort registriert : https://bz.apache.org/bugzilla/show_bug.cgi?id=56702 und ich habe dort einen Kommentar mit meiner Analyse.
Hier die Lösung die ich verwendet habe : Ausnahme wurde durch gestiegen HSSFCell.getNumericCellValue, die genannt wurde DateUtil.isCellDateFormatted. DateUtil.isCellDateFormatted tut 2 Dinge :
1) überprüfen Sie den Wert-Typ der Zelle durch Aufruf HSSFCell.getNumericCellValue und dann DateUtil.isValidExcelDate(), die ist fast sinnlos, hier, denke ich.
2) überprüfen Sie, ob das format der Zelle ist ein Datum-format
Kopierte ich den code von Thema 2) über in eine neue function 'myIsADateFormat' und verwendet es anstelle von DateUtil.isCellDateFormatted (das ist ziemlich schmutzig, kopieren Sie den Bibliotheks-code, aber es funktioniert...) :
Wenn Sie brauchen, um zu überprüfen, den Wert-Typ, ersten, können Sie auch dies :
InformationsquelleAutor der Antwort Herve
Dokumentation klar sagt, nicht zu setCellType zu 1 verwenden Sie stattdessen die DataFormatter wie Thierry erklärte:
https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType(int)
InformationsquelleAutor der Antwort Jobin Thomas
Ravi ' s Lösung funktioniert :
Nur Zellen verwenden.setCellType(1); vor dem Lesen der Zelle mit dem Wert und erhalten als String immer nach, dass Sie können verwenden Sie es in Ihrem eigenen format(Typ).
InformationsquelleAutor der Antwort JavaLover