Tôi nhận ra câu hỏi hơi khó hiểu một chút, nhưng tôi không biết làm cách nào khác để nói. Dù sao, đây là mã gốc:Khi nhận nội dung ô bằng Thư viện Apache-POI, tôi nhận được cả hai "Không thể nhận được giá trị số từ ô văn bản" và ngược lại. Làm thế nào để tôi sửa chữa nó?
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;
}
Tôi nhận được lỗi sau:
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)
Thậm chí nếu tôi thay đổi nó để có được hoặc là một chuỗi sử dụng XSSFCell.getStringCellValue()
hoặc thậm chí XFFSCell.getRichTextValue
, tôi nhận được sự đảo ngược của thông báo lỗi ở trên (và tôi đảm bảo cuối cùng sẽ biến nó thành int bằng cách sử dụng Integer.parseInt(XSSFCell.getStringCellValue()
).
Các lỗi sau đó đọc:
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)
Tôi biết một thực tế rằng các bảng tính excel cột là trong thực tế một chuỗi. Tôi không thể thay đổi bảng excel vì nó được tải lên ở nơi khác luôn luôn sử dụng cùng một định dạng và định dạng mỗi cột đầu tiên sẽ mất nhiều thời gian xử lý.
Mọi đề xuất?
[Giải pháp] Đây là mã giải pháp tôi đã đưa ra từ @ giúp đỡ Wivani của:
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;
}
kiểm tra API; có các phương pháp để truy vấn loại cột, vì vậy bạn có thể sử dụng để kiểm tra xem bạn có phải chuyển đổi hay không. PS Đoạn mã đó là không đủ để thực sự giúp bạn gỡ lỗi. – Wivani
Để cho mọi người biết điều gì đã xảy ra, tôi phát hiện ra rằng 100 số đầu tiên có số 0 dẫn đầu. Điều này khiến cho excel tự động tạo chuỗi này. Vì vậy, tôi đã phải viết một phương pháp để kiểm tra loại đầu tiên và sau đó định dạng cho phù hợp. Cảm ơn bạn @Wivani – crstamps2
Thú vị có lẽ để tham khảo trong tương lai để thêm 'mã giải pháp' của bạn? – Wivani