Альтернатива устаревшему getCellType
Я читаю excel файл (расширение файла xlsx), используя org.apache.poi 3.15.
Это мой код:
try (FileInputStream fileInputStream = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(file)) {
XSSFSheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "(Integer)\t");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "(String)\t");
break;
}
}
System.out.println("");
}
} catch (Exception e) {
e.printStackTrace();
}
Я получаю предупреждение о том, что cell.getCellType()
устарел. Может ли кто-нибудь сказать мне альтернативу?
Ответы
Ответ 1
Принятый ответ показывает причину устаревания, но пропускает имя альтернативы:
CellType getCellTypeEnum()
где CellType
- это перечисление, описывающее тип ячейки.
План состоит в том, чтобы переименовать getCellTypeEnum()
обратно в getCellType()
в POI 4.0.
Ответ 2
Вы можете использовать:
cell.getCellTypeEnum()
Далее, чтобы сравнить тип ячейки, вы должны использовать CellType следующим образом: -
if(cell.getCellTypeEnum() == CellType.STRING){
.
.
.
}
Вы можете обратиться к документации. Его очень полезно: -
https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html
Ответ 3
Используйте getCellType()
switch (cell.getCellType()) {
case BOOLEAN :
//To-do
break;
case NUMERIC:
//To-do
break;
case STRING:
//To-do
break;
}
Ответ 4
Из документации:
int getCellType()
Устаревший. POI 3.15. CellType
перечисление CellType
в будущем.
Верните тип ячейки. CellType
в версии 4.0 POI. Для передовой совместимости не производите в коде код типа ячейки с жестким кодом.
Ответ 5
FileInputStream fis = new FileInputStream(new File("C:/Test.xlsx"));
//create workbook instance
XSSFWorkbook wb = new XSSFWorkbook(fis);
//create a sheet object to retrieve the sheet
XSSFSheet sheet = wb.getSheetAt(0);
//to evaluate cell type
FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
for(Row row : sheet)
{
for(Cell cell : row)
{
switch(formulaEvaluator.evaluateInCell(cell).getCellTypeEnum())
{
case NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t");
break;
case STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
default:
break;
}
}
System.out.println();
}
Этот код будет работать нормально. Используйте getCellTypeEnum()
и для сравнения используйте только NUMERIC
или STRING
.
Ответ 6
Похоже, что 3.15 не предлагает удовлетворительного решения: либо использует старый стиль с Cell.CELL_TYPE_ *, либо мы используем метод getCellTypeEnum(), который помечен как устаревший.
Много нарушений для небольшой добавленной стоимости...
Ответ 7
Для POI 3.17 это сработало для меня
switch (cellh.getCellTypeEnum()) {
case FORMULA:
if (cellh.getCellFormula().indexOf("LINEST") >= 0) {
value = Double.toString(cellh.getNumericCellValue());
} else {
value = XLS_getDataFromCellValue(evaluator.evaluate(cellh));
}
break;
case NUMERIC:
value = Double.toString(cellh.getNumericCellValue());
break;
case STRING:
value = cellh.getStringCellValue();
break;
case BOOLEAN:
if(cellh.getBooleanCellValue() == true){
value = "true";
} else {
value = "false";
}
break;
default:
value = "";
break;
}