60 votes

Alternative à la version dépréciée getCellType

Je lis un fichier Excel (extension de fichier xlsx) en utilisant org.apache.poi 3.15.

Voici mon code :

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();
}

Je reçois un avertissement disant que cell.getCellType() est déprécié. Quelqu'un peut-il m'indiquer l'alternative ?

66voto

Tomasz Stanczak Points 4790

La réponse acceptée indique la raison de la dépréciation mais omet de nommer l'alternative :

CellType    getCellTypeEnum()

où le CellType est l'enum décrivant le type de la cellule.

Le plan consiste à renommer getCellTypeEnum() retour à getCellType() dans POI 4.0.

8 votes

Wow. Ce changement (prévu) est la voie directe vers les futures incompatibilités binaires. Super ! :-) (oui, je sais, vous ne devriez pas mettre à niveau vers une nouvelle version majeure sans vérifier les guides de mise à niveau etc... mais ce sera l'une des premières questions ici dès que POI 4.0 sera sorti)

1 votes

Yep. Bien que - ce n'est qu'un plan, c'est ce qui est dans les commentaires maintenant, cela pourrait ne pas arriver. Je ne suis pas sûr de l'influence que peut avoir une publicité sur un projet open source.

1 votes

@FlorianAlbrecht Tant que vous utilisez des choses comme Cell.CELL_TYPE_NUMERIC pas 0 dans vos instructions switch / if, POI devrait être capable de maintenir la compatibilité du code source pour votre code et vous n'aurez qu'à recompiler

20voto

user7171758 Points 136

Vous pouvez utiliser :

cell.getCellTypeEnum()

En outre, pour comparer le type de cellule, vous devez utiliser CellType comme suit:-

if(cell.getCellTypeEnum() == CellType.STRING){
      .
      .
      .
}

Vous pouvez vous référer à la documentation. Elle est très utile:-

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

2 votes

Cell.getCellTypeEnum() est déprécié maintenant ; utilisez plutôt cell.getCellType() ; cela devrait fonctionner correctement.

0 votes

Oui. Si vous utilisez la version 4.1.2, getCellTypeEnum() fonctionne toujours bien, mais a été déprécié dans la version 5.0.0, et déplacé vers getCellType().

9voto

Arindam Points 41
    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();
    }

Ce code fonctionnera parfaitement. Utilisez getCellTypeEnum() et pour comparer, utilisez simplement NUMERIC o STRING .

7voto

DimaSan Points 6296

De la [documentation](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#getCellType()) :

int getCellType() Déprécié. POI 3.15. Retourne un CellType dans le futur.

Retourner le type de cellule. Retournera CellType dans la version 4.0 de POI. Pour des raisons de compatibilité ascendante, ne codez pas en dur les littéraux de type de cellule dans votre code.

3voto

frva Points 56

Il semble que la version 3.15 n'offre pas de solution satisfaisante : soit on utilise l'ancien style avec Cell.CELL_TYPE_*, soit on utilise la méthode getCellTypeEnum() qui est marquée comme dépréciée. Beaucoup de perturbations pour peu de valeur ajoutée...

10 votes

Vous pouvez utiliser calmement la méthode getCellTypeEnum() en 3.15. Sa marque "Deprecated" est un bogue connu 60228 . Il devrait être corrigé dans la version 3.16.

1 votes

Interdiction stricte du code déprécié = gros bug stupide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X