已弃用的getCellType的替代方案

use*_*169 47 java apache-poi

我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

我收到了一个cell.getCellType()被弃用的警告.谁能告诉我替代方案?

Tom*_*zak 49

接受的答案显示了弃用的原因,但未命中替代方案:

CellType    getCellTypeEnum()
Run Code Online (Sandbox Code Playgroud)

其中CellType是enum描述细胞的类型.

计划是重新命名getCellTypeEnum()getCellType()POI 4.0.

  • 哇.此(计划的)更改是未来二进制不兼容性的直接方式.大!:-)(是的,我知道,你不应该在没有检查升级指南的情况下升级到新的主要版本......但是一旦POI 4.0出来,它将成为第一个问题之一) (7认同)
  • @Gagravarr弃用警告告诉我根本不使用int返回方法.如果我使用int文字或库中的常量对弃用没有影响.想象一下:我使用POI 3.x和getCellType()编写了一个库.我使用库中的常量.现在,您在项目中使用我的库,但也直接使用POI,并决定升级到POI 4.0.****将******运行时****的二进制不可用性**.是的,错误是升级到POI 4.0而不检查所有依赖项.但你真的希望没有人能做到这个错误吗? (2认同)

小智 14

您可以使用:

cell.getCellTypeEnum()
Run Code Online (Sandbox Code Playgroud)

为了比较单元格类型,您必须按如下方式使用CellType: -

if(cell.getCellTypeEnum() == CellType.STRING){
      .
      .
      .
}
Run Code Online (Sandbox Code Playgroud)

您可以参考文档.它非常有帮助: -

https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html

  • cell.getCellTypeEnum() 现在已折旧,而使用 cell.getCellType() 应该可以正常工作 (2认同)

Ben*_*les 9

使用getCellType()

switch (cell.getCellType()) {
   case BOOLEAN :
                 //To-do
                 break;
   case NUMERIC:
                 //To-do
                 break;
   case STRING:
                 //To-do
                 break;
}
Run Code Online (Sandbox Code Playgroud)


Dim*_*San 5

文档:

int getCellType() 已过时.POI 3.15.将来会返回CellType枚举.

返回单元格类型.将返回CellTypePOI 4.0版.为了向前兼容,请不要在代码中对单元格类型文字进行硬编码.


小智 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();
    }
Run Code Online (Sandbox Code Playgroud)

此代码可以正常工作。使用getCellTypeEnum()和比较使用just NUMERICSTRING