我正在使用org.apache.poi 3.15读取excel文件(文件扩展名为xlsx)。
这是我的代码:
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()
已被弃用。谁能告诉我替代方案?
答案 0 :(得分:44)
接受的答案显示了弃用的原因,但没有注明替代名称:
CellType getCellTypeEnum()
其中CellType
是描述单元格类型的枚举。
计划是在POI 4.0中将getCellTypeEnum()
重命名为getCellType()
。
答案 1 :(得分:13)
您可以使用:
cell.getCellTypeEnum()
为了比较单元格类型,您必须按如下方式使用CellType: -
if(cell.getCellTypeEnum() == CellType.STRING){
.
.
.
}
您可以参考文档。它非常有帮助: -
https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html
答案 2 :(得分:6)
使用getCellType()
switch (cell.getCellType()) {
case BOOLEAN :
//To-do
break;
case NUMERIC:
//To-do
break;
case STRING:
//To-do
break;
}
答案 3 :(得分:5)
int getCellType()
已过时。 POI 3.15。将来会返回CellType
枚举。返回单元格类型。将在POI 4.0版中返回
CellType
。为了向前兼容,请不要在代码中对单元格类型文字进行硬编码。
答案 4 :(得分: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
。
答案 5 :(得分:2)
看起来3.15没有提供令人满意的解决方案:其中一个使用旧样式和Cell.CELL_TYPE_ *,或者我们使用标记为已弃用的方法getCellTypeEnum()。 很多干扰几乎没有增加价值......
答案 6 :(得分:0)
对于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;
}
答案 7 :(得分:-2)
您可以这样做:
private String cellToString(HSSFCell cell) {
CellType type;
Object result;
type = cell.getCellType();
switch (type) {
case NUMERIC : //numeric value in excel
result = cell.getNumericCellValue();
break;
case STRING : //String Value in Excel
result = cell.getStringCellValue();
break;
default :
throw new RuntimeException("There is no support for this type of value in Apche POI");
}
return result.toString();
}