Java 不推荐使用的getCellType的替代方案

Java 不推荐使用的getCellType的替代方案,java,apache-poi,Java,Apache Poi,我正在使用org.apache.poi3.15读取一个excel文件(文件扩展名xlsx) 这是我的代码: try (FileInputStream fileInputStream = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(file)) { XSSFSheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterato

我正在使用org.apache.poi3.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();
}
try(FileInputStream FileInputStream=newfileinputstream(文件);xssf工作簿=newxssf工作簿(文件)){
XSSFSheet sheet=workbook.getSheetAt(0);
迭代器rowIterator=sheet.Iterator();
while(roweiterator.hasNext()){
行=行迭代器。下一步();
迭代器cellIterator=row.cellIterator();
while(cellIterator.hasNext()){
Cell=cellIterator.next();
开关(cell.getCellType()){
case Cell.Cell\u类型\u数值:
System.out.print(cell.getNumericCellValue()+“(整数)\t”);
打破
case Cell.Cell\u类型\u字符串:
System.out.print(cell.getStringCellValue()+“(字符串)\t”);
打破
}
}
System.out.println(“”);
}
}捕获(例外e){
e、 printStackTrace();
}
我收到了一条警告,
cell.getCellType()
已被弃用。有人能告诉我备选方案吗?

来自:

int getCellType()
不赞成。POI 3.15。将来将返回一个
CellType
enum

返回单元格类型。将在POI的4.0版中返回
CellType
。为了向前兼容,不要在代码中硬编码单元格类型的文字


接受的答案显示了不推荐的原因,但未列出备选方案的名称:

CellType    getCellTypeEnum()
其中,
CellType
是减少单元格类型的枚举


计划将POI 4.0中的
getCellTypeEnum()
重新命名为
getCellType()

看起来3.15没有提供令人满意的解决方案:要么使用Cell.Cell\u TYPE\u*的旧样式,要么使用标记为不推荐的方法getCellTypeEnum()。 大量干扰带来的附加值很小…

您可以使用:

cell.getCellTypeEnum()
为了进一步比较单元格类型,您必须使用CellType,如下所示:-

if(cell.getCellTypeEnum() == CellType.STRING){
      .
      .
      .
}
您可以参考文档。这很有帮助:-

这个代码可以正常工作。使用
getCellTypeEnum()
进行比较,只需使用
NUMERIC
STRING

使用getCellType()


对于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()){
            value = "true";
        } else {
            value = "false";
        }
        break;
    default:
        value = "";
        break;
}
您可以这样做:

专用字符串cellToString(HSSFCell单元格){
细胞型;
客观结果;
type=cell.getCellType();
开关(类型){
case NUMERIC://excel中的数值
结果=cell.getNumericCellValue();
打破
大小写字符串://Excel中的字符串值
结果=cell.getStringCellValue();
打破
违约:
抛出新的RuntimeException(“Apche POI中不支持这种类型的值”);
}
返回result.toString();
}

Wow。这种(计划中的)变化是未来二进制不兼容的直接途径。太好了!:-)(是的,我知道,在没有查看升级指南等的情况下,你不应该升级到新的主要版本……但这将是POI 4.0发布后的第一个问题)是的。虽然-这只是一个计划,这是现在评论中的内容,但仍然可能不会发生。我不确定宣传对开源项目的影响有多大。@FlorianAlbrecht只要您在switch/if语句中使用
Cell.Cell\u TYPE\u NUMERIC
而不是
0
,POI就应该能够保持代码的源代码兼容性,所以您只需要recompile@Gagravarr对这正是“二进制不兼容”的定义。@Gagravarr弃用警告告诉我不要使用int返回方法。如果我使用int文本或库中的常量,对弃用没有影响。设想如下:我使用POI 3.x和getCellType()编写了一个库。我使用库中的常量。现在,您可以在项目中使用my library,但也可以直接使用POI,并决定升级到POI 4.0。您将在运行时获得二进制不匹配性。是的,错误是升级到POI 4.0时没有检查所有依赖项。但您真的希望没有人会犯这种错误吗?您可以在3.15中平静地使用方法
getCellTypeEnum()
。它的“弃用”标记是一个标记。应该在3.16中修复。严格禁止不推荐的代码=大而愚蠢的错误。cell.getCellTypeEnum()现在被折旧,而使用cell.getCellType()应该可以正常工作是的。如果您使用的是4.1.2,getCellTypeEnum()仍然可以正常工作。但在版本5.0.0中被弃用,并移动到getCellType()。您的代码缺少另外两种类型:BLANK和FORMULA。。。或者添加“默认值:”嘿,欢迎加入StackOverflow!正如OP在他们的帖子中所说的,他们收到了一条警告,说
cell.getCellType()
已被弃用。你的答案是用同样的方法,所以它不能解决这个问题。请考虑更新!
switch (cell.getCellType()) {
   case BOOLEAN :
                 //To-do
                 break;
   case NUMERIC:
                 //To-do
                 break;
   case STRING:
                 //To-do
                 break;
}
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()){
            value = "true";
        } else {
            value = "false";
        }
        break;
    default:
        value = "";
        break;
}