[JAVA] Je veux obtenir la valeur de Cell de manière transparente quel que soit CellType (Apache POI)

Tant que je travaille en tant que SIer épris de Java et qui fournit des systèmes aux entreprises japonaises qui aiment Excel, Apache POI est inévitable. POI a une classe (interface) appelée «Cell» qui résume les cellules Excel, mais il est étonnamment difficile de récupérer les valeurs de cette «Cellule». En particulier, il est nécessaire d'appeler des méthodes en fonction du format d'affichage de __ cells (CellType), et lorsqu'une méthode qui ne correspond pas à CellType est appelée, une exception est immédiatement levée __. At-il été fait (´ ・ ω ・ `)

Par conséquent, j'ai décidé de préparer une méthode utilitaire __ qui peut obtenir de manière transparente la valeur de la cellule indépendamment de __CellType. Les spécifications simples sont les suivantes.

package my.excel;

import java.util.Objects;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;

final public class CellUtils {

    public static Object getCellValue(Cell cell) {
        Objects.requireNonNull(cell, "cell is null");
        
        CellType cellType = cell.getCellTypeEnum();
        if (cellType == CellType.BLANK) {
            return null;
        } else if (cellType == CellType.BOOLEAN) {
            return cell.getBooleanCellValue();
        } else if (cellType == CellType.ERROR) {
            throw new RuntimeException("Error cell is unsupported");
        } else if (cellType == CellType.FORMULA) {
            throw new RuntimeException("Formula cell is unsupported");
        } else if (cellType == CellType.NUMERIC) {
            if (DateUtil.isCellDateFormatted(cell)) {
                return cell.getDateCellValue();
            } else {
                return cell.getNumericCellValue();
            }
        } else if (cellType == CellType.STRING) {
            return cell.getStringCellValue();
        } else {
            throw new RuntimeException("Unknow type cell");
        }
    }
    
}

Utilisons-le réellement (´ ・ ω ・ `) Tout d'abord, préparons le sample.xlsx suivant.

sample.PNG

Après cela, écrivez le code suivant et vérifiez s'il peut être lu correctement.

package my.excel;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class Main {
    public static void main(String ... args) {
        Path path = Paths.get("C:\\hogehoge\\sample.xlsx");
        try (Workbook workbook = WorkbookFactory.create(Files.newInputStream(path))) {
            Sheet sheet = workbook.getSheetAt(0);
            for (int i = 0; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                Cell cell = row.getCell(1); //Obtenez la cellule de la colonne B.
                Object value = CellUtils.getCellValue(cell);
                System.out.println(value);
            }
        } catch (IOException 
                    | InvalidFormatException 
                    | EncryptedDocumentException e) {
            e.printStackTrace();
        } 
    }
 }

Si vous regardez les résultats de la compilation et de l'exécution, vous verrez que cela fonctionne comme prévu. Je l'ai fait (´ ・ ω ・ `)

ABC
true
100.0
Mon Jan 02 00:00:00 JST 2017

Recommended Posts

Je veux obtenir la valeur de Cell de manière transparente quel que soit CellType (Apache POI)
Je veux obtenir la valeur en Ruby
Dans Apache POI 3.15, lorsque j'obtiens le résultat d'une formule, FormulaParseException se produit (la formule fait référence à "cellule avec le nom de la feuille comprenant" ・ ")
Je veux changer la valeur de l'attribut dans Selenium of Ruby
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
Je veux var_dump le contenu de l'intention
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
[Java] Comment obtenir la valeur maximale de HashMap
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je veux retourner la position de défilement de UITableView!
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
[Ruby] Je souhaite inverser l'ordre de la table de hachage
Je veux obtenir une liste du contenu d'un fichier zip et sa taille non compressée
Je veux comprendre le flux des paramètres de demande de traitement Spring
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Je veux limiter l'entrée en réduisant la plage de nombres
Je veux contrôler le message d'erreur par défaut de Spring Boot
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
[Controller] Je veux récupérer la valeur numérique d'une colonne spécifique de la base de données (mon mémo)
[Spring Boot] Je veux ajouter mon propre fichier de propriétés et obtenir la valeur avec env.getProperty ().
Je veux connaître le JSP du portlet ouvert lors du développement de Liferay
Je veux passer l'argument d'Annotation et l'argument de la méthode d'appel à aspect
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Je souhaite obtenir une liste de chaînes de caractères uniques uniquement en excluant les chaînes de caractères fixes du nom de fichier
Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot
[Rails / ActiveRecord] Je souhaite valider la valeur avant la conversion du type (_before_type_cast)
Je veux obtenir uniquement l'heure à partir des données de type Time ...! [Strftime] * Notes supplémentaires
J'ai réussi à obtenir un blanc lorsque j'ai apporté le contenu de Beans dans la zone de texte
Je veux voir le contenu de Request sans dire quatre ou cinq
Comment obtenir le jour d'aujourd'hui
Je veux tronquer après la virgule décimale
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
Installez plusieurs boutons de soumission dans la vue Rails pour obtenir la valeur du bouton enfoncé
[Active Admin] Je souhaite spécifier l'étendue de la collection à afficher dans select_box
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères
[Java] Comment obtenir l'URL de la source de transition
[Java] Je souhaite calculer la différence par rapport à la date
Je veux intégrer n'importe quel TraceId dans le journal
J'étais accro au record du modèle associé
05. J'ai essayé de supprimer la source de Spring Boot
Je veux juger la gamme en utilisant le diplôme mensuel
J'ai essayé de réduire la capacité de Spring Boot
Je souhaite utiliser le mode sombre avec l'application SWT