Zdaję sobie sprawę, że to pytanie jest trochę mylące, ale nie wiedziałem, jak inaczej to wyrazić. W każdym razie, tutaj jest oryginalny kod:Podczas pobierania zawartości komórki za pomocą biblioteki Apache-POI, pojawia się komunikat "Nie można uzyskać wartości liczbowej z komórki tekstowej" i odwrotnie. Jak mogę to naprawić?
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;
}
otrzymuję następujący błąd:
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)
Nawet jeśli zmienię go dostać albo ciąg używając XSSFCell.getStringCellValue()
lub nawet XFFSCell.getRichTextValue
, otrzymuję odwrocie powyższy komunikat o błędzie (i upewniam się, że ostatecznie zrobię to int używając Integer.parseInt(XSSFCell.getStringCellValue()
).
Błąd odczytuje:
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)
Wiem na fakt, że kolumna arkusza kalkulacyjnego Excel w rzeczywistości ciąg. Nie mogę zmienić arkusza programu Excel, gdy jest on przesyłany, gdzie zawsze przy użyciu tego samego formatu i formatowania każda kolumna najpierw zajmuje dużo czasu przetwarzania.
Wszelkie sugestie?
[Rozwiązanie] Oto kod rozwiązanie wymyśliłem od @ pomocy Wivani za:
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;
}
Sprawdź API; istnieją metody sprawdzania typu kolumny, więc możesz jej użyć do sprawdzenia, czy musisz dokonać konwersji, czy nie. PS Ten fragment kodu jest niewystarczający, aby naprawdę pomóc w debugowaniu. – Wivani
Aby wszyscy wiedzieli, co się stało, dowiedziałem się, że pierwsze 100 lub więcej liczb miało wiodącą 0. To spowodowało, że Excel automatycznie uczynił z tego ciąg. Musiałem więc napisać metodę, aby najpierw sprawdzić typ, a następnie odpowiednio sformatować. Dziękujemy @Wivani – crstamps2
Interesujące może być na przyszłość, aby dodać swój "kod rozwiązania"? – Wivani