[JAVA] Ich möchte den Wert von Cell unabhängig vom CellType (Apache POI) transparent erhalten.

Solange ich als Java-liebender SIer arbeite, der Systeme an japanische Unternehmen liefert, die Excel lieben, ist Apache POI unvermeidlich. POI hat eine Klasse (Schnittstelle) namens "Zelle", die Excel-Zellen abstrahiert, aber es ist überraschend schwierig, Werte aus dieser "Zelle" abzurufen. Insbesondere ist es notwendig, Methoden gemäß dem Anzeigeformat von __ Zellen (CellType) aufzurufen, und wenn eine Methode aufgerufen wird, die nicht mit CellType übereinstimmt, wird sofort eine Ausnahme __ ausgelöst. Wurde es gemacht (´ ´ ω ・ `)

Aus diesem Grund habe ich beschlossen, eine Dienstprogrammmethode __ vorzubereiten, mit der der Zellenwert unabhängig von __CellType transparent abgerufen werden kann. Die einfachen Spezifikationen sind wie folgt.

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

Verwenden wir es tatsächlich (´ ´ ω ・ `) Bereiten Sie zuerst die folgende sample.xlsx vor.

sample.PNG

Schreiben Sie danach den folgenden Code und prüfen Sie, ob er korrekt gelesen werden kann.

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); //Holen Sie sich die Zelle in Spalte B.
                Object value = CellUtils.getCellValue(cell);
                System.out.println(value);
            }
        } catch (IOException 
                    | InvalidFormatException 
                    | EncryptedDocumentException e) {
            e.printStackTrace();
        } 
    }
 }

Wenn Sie sich die Ergebnisse des Kompilierens und Ausführens ansehen, werden Sie feststellen, dass es wie erwartet funktioniert. Ich habe es getan (´ ・ ω ・ `)

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

Recommended Posts

Ich möchte den Wert von Cell unabhängig vom CellType (Apache POI) transparent erhalten.
Ich möchte den Wert in Ruby erhalten
Wenn ich in Apache POI 3.15 das Ergebnis einer Formel erhalte, erhalte ich eine FormulaParseException (die Formel bezieht sich auf "Zellen mit Blattnamen, die" ・ "enthalten).
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
Ich möchte den Inhalt der Absicht var_dump
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
[Java] So erhalten Sie den Maximalwert von HashMap
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Ich möchte eine Liste des Inhalts einer Zip-Datei und ihrer unkomprimierten Größe erhalten
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Ich möchte die Eingabe begrenzen, indem ich den Zahlenbereich einschränke
Ich möchte die Standardfehlermeldung von Spring Boot steuern
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
[Controller] Ich möchte den numerischen Wert einer bestimmten Spalte aus der Datenbank abrufen (mein Memo).
[Spring Boot] Ich möchte meine eigene Eigenschaftendatei hinzufügen und den Wert mit env.getProperty () abrufen.
Ich möchte die JSP des offenen Portlets bei der Entwicklung von Liferay kennen
Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Ich möchte eine Liste nur eindeutiger Zeichenfolgen erhalten, indem feste Zeichenfolgen vom Dateinamen ausgeschlossen werden
Was ich versucht habe, als ich alle Felder einer Bohne bekommen wollte
[Rails / ActiveRecord] Ich möchte den Wert überprüfen, bevor der Typ konvertiert wird (_before_type_cast).
Ich möchte nur die Zeit aus Zeittypdaten abrufen ...! [Strftime] * Zusätzliche Hinweise
Ich habe es geschafft, ein Leerzeichen zu bekommen, als ich den Inhalt von Beans in den Textbereich gebracht habe
Ich möchte den Inhalt der Anfrage sehen, ohne vier oder fünf zu sagen
Wie komme ich zum heutigen Tag?
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
Installieren Sie mehrere Senden-Schaltflächen in der Rails-Ansicht, um den Wert der gedrückten Schaltfläche abzurufen
[Active Admin] Ich möchte den Umfang der Sammlung angeben, die in select_box angezeigt werden soll
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten
[Java] So erhalten Sie die URL der Übergangsquelle
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte eine TraceId in das Protokoll einbetten
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich möchte den Bereich anhand des monatlichen Abschlusses beurteilen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte den Dunkelmodus mit der SWT-App verwenden