xlsx-Datei mit Apache POI einlesen

reutila

Mitglied
Hallo liebe Community,

ich möchte gerne eine xlsx-Datei in Java einlesen.
Für jede Zeile soll ein neues Objekt "Schueler" angelegt werden,
wobei die einzelnen Zellen als Attribute diesem Objekt zugeodnert werden soll.
Alle Schueler Objekte sollen schließlich in einer Liste gespeichert werden.

Die Exceltabelle ist wie folgt aufgebaut:
1 | Klasse 1 | Musterfrau | Eva
2 | Klasse 2 | Mustermann | Max
Die erste Spalte ist hierbei eine Id.
Die erste Spalte ist in der xlsx-Datei als Standard formatiert.
Wenn ich diese Spalte in Java als Double einlesen möchte, dann funktioniert dies auch.
Allerdings funktioniert es nicht, wenn ich sie als Integer einlesen möchte.

Kann mir jemand von euch sagen was ich falsch mache und es mir bitte richtig programmieren?

Mein Code für die Klasse Schueler
Java:
package calc;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

public class Schueler {

    private double id;
    private String name;
    private String vorname;
    private String klasse;

    public double getId() {
        return id;
    }

    public void setId(double d) {
        this.id = d;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public String getKlasse() {
        return klasse;
    }

    public void setKlasse(String klasse) {
        this.klasse = klasse;
    }

    public Date getGeburtstag() {
        return geburtstag;
    }

    public void setGeburtstag(Date geburtstag) {
        this.geburtstag = geburtstag;
    }

    public String getBerechtigt() {
        return berechtigt;
    }

    public void setBerechtigt(String berechtigt) {
        this.berechtigt = berechtigt;
    }

    public Schueler(int id, String name, String vorname) {
        super();
        this.id = id;
        this.name = name;
        this.vorname = vorname;
        //this.geburtstag = geburtstag;
        //this.berechtigt = berechtigt;
    }

    public Schueler() {
        super();
    }

    public String toString() {
        return "Schueler [id=" + id + ", name=" + name + ", vorname=" + vorname + "]";
    }

    private Object getCellValue(Cell cell) {
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();

        case Cell.CELL_TYPE_BOOLEAN:
            return cell.getBooleanCellValue();

        case Cell.CELL_TYPE_NUMERIC:
            return cell.getNumericCellValue();
        }

        return null;
    }

    public List<Schueler> readSchuelersFromExcelFile(String excelFilePath) throws IOException {
        List<Schueler> listSchuelers = new ArrayList<>();
        FileInputStream inputStream = new FileInputStream(new File(excelFilePath));

        Workbook workSchueler = new XSSFWorkbook(inputStream);
        Sheet firstSheet = workSchueler.getSheetAt(0);
        Iterator<Row> iterator = firstSheet.iterator();

        while (iterator.hasNext()) {
            Row nextRow = iterator.next();
            Iterator<Cell> cellIterator = nextRow.cellIterator();
            Schueler aSchueler = new Schueler();

            while (cellIterator.hasNext()) {
                Cell nextCell = cellIterator.next();
                int columnIndex = nextCell.getColumnIndex();

                switch (columnIndex) {
                case 0:
                    aSchueler.setId((double) getCellValue(nextCell));
                    break;
                case 1:
                    aSchueler.setKlasse((String) getCellValue(nextCell));
                case 2:
                    aSchueler.setName((String) getCellValue(nextCell));
                    break;
                case 3:
                    aSchueler.setVorname((String) getCellValue(nextCell));
                    break;
                }

            }
            listSchuelers.add(aSchueler);
        }

        workSchueler.close();
        inputStream.close();

        return listSchuelers;
    }

}

Meine Testklasse hat folgenden Code:
Java:
package gui;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import calc.Schueler;

public class Test {

    public static void main(String[] args) throws IOException{
        String excelFilePath = "A://SchuelerListeTest.xlsx";
        Schueler reader = new Schueler();
        List<Schueler> listBooks = reader.readSchuelersFromExcelFile(excelFilePath);
        System.out.println(listBooks);

    }

}

In der angefügten zip-Datei findet ihr die xlsx-Datei, die Klasse Schueler und eine Test-Main-Klasse. Das Attribut id ist in der Klasse Schueler noch als double deklariert.
Die einzelnen jar files kann man auf der Apache Webseite downloaden.

P.S.: die beiden Attribute geburtstag und berechtigt in der Klasse Schueler sollen erst später umgesetzt werden.
 

Anhänge

  • Anlage.zip
    10,5 KB · Aufrufe: 2
Zuletzt bearbeitet:

reutila

Mitglied
Hallo Klaus,

danke für deine Nachricht.
Erstens:
ich habe einen Denkfehler gemacht.
Die Id ist mir egal, da jedes Schueler-Objekt in der Liste über .get() angesprochen werden kann.

nun habe ich aber ein anderes Problem:
Ich habe in der xlsx-Datei eine weitere Spalte mit Geburtstagsdatum stehen,
diese sollen auch über die POI eingelesen werden.

Der Code für die Klasse schueler sieht nun wie folgt aus:
Java:
package calc;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

public class Schueler2 {

    private String name;
    private String vorname;
    private String klasse;
    private Date geburtstag;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public String getKlasse() {
        return klasse;
    }

    public void setKlasse(String klasse) {
        this.klasse = klasse;
    }

    public Date getGeburtstag() {
        return geburtstag;
    }

    public void setGeburtstag(Date geburtstag) {
        this.geburtstag = geburtstag;
    }

    public Schueler2(String name, String vorname, String klasse, Date geburtstag) {
        super();
        this.name = name;
        this.vorname = vorname;
        this.klasse = klasse;
        this.geburtstag = geburtstag;
    }

    public Schueler2() {
        super();
    }

    public String toString() {
        return "Schueler [klasse=" + klasse + ", name=" + name + ", vorname=" + vorname + ", geb=" + geburtstag + "]";
    }

    private Object getCellValue(Cell cell) {
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();

        case Cell.CELL_TYPE_BOOLEAN:
            return cell.getBooleanCellValue();

        case Cell.CELL_TYPE_NUMERIC:
            if (DateUtil.isCellDateFormatted(cell)) {
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
                cell.getDateCellValue();
            } else {
                return cell.getNumericCellValue();
            }
        }

        return null;
    }

    public List<Schueler2> readSchuelersFromExcelFile(String excelFilePath) throws IOException {
        List<Schueler2> listSchueler2 = new ArrayList<>();
        FileInputStream inputStream = new FileInputStream(new File(excelFilePath));

        Workbook workSchueler = new XSSFWorkbook(inputStream);
        Sheet firstSheet = workSchueler.getSheetAt(0);
        Iterator<Row> iterator = firstSheet.iterator();

        while (iterator.hasNext()) {
            Row nextRow = iterator.next();
            Iterator<Cell> cellIterator = nextRow.cellIterator();
            Schueler2 aSchueler = new Schueler2();

            while (cellIterator.hasNext()) {
                Cell nextCell = cellIterator.next();
                int columnIndex = nextCell.getColumnIndex();

                switch (columnIndex) {
                case 0:
                    aSchueler.setKlasse((String) getCellValue(nextCell));
                case 1:
                    aSchueler.setName((String) getCellValue(nextCell));
                    break;
                case 2:
                    aSchueler.setVorname((String) getCellValue(nextCell));
                    break;
                case 3:
                    aSchueler.setGeburtstag((Date) getCellValue(nextCell));
                    break;
                }

            }
            listSchueler2.add(aSchueler);
        }

        workSchueler.close();
        inputStream.close();

        return listSchueler2;
    }

}

und meine Testklasse wie folgt:
Java:
package calc;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import calc.Schueler2;

public class Test2 {

    public static void main(String[] args) throws IOException {
        String excelFilePath = "A://SchuelerListeTest.xlsx";
        Schueler2 reader = new Schueler2();
        List<Schueler2> listSchueler = reader.readSchuelersFromExcelFile(excelFilePath);
        System.out.println(listSchueler);
        System.out.println("Anzahl der Elemente: " + listSchueler.size());
        System.out.println("erste Element aus der liste" + listSchueler.get(0));

        Random r = new Random();
        int i = r.nextInt(listSchueler.size());
        System.out.println("Position " + i + " gehört Schüler: " + listSchueler.get(i));
      
        int j = r.nextInt(listSchueler.size());
        System.out.println("Position " + j + " gehört Schüler: " + listSchueler.get(j));

    }

}

Nun wird folgender Fehler ausgegeben:
Java:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.poi.openxml4j.util.ZipSecureFile$1 (file:/A:/01%20Schule/Schuljahr%202017_2018/EclipseArbeitsbereich/Programme/Gluecksspiel/lib/poi-ooxml-3.17.jar) to field java.io.FilterInputStream.in
WARNING: Please consider reporting this to the maintainers of org.apache.poi.openxml4j.util.ZipSecureFile$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Exception in thread "main" java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.util.Date
   at calc.Schueler2.readSchuelersFromExcelFile(Schueler2.java:114)
   at calc.Test2.main(Test2.java:18)

In Anlage2 findet man die relevanten Dateien dazu.
 

Anhänge

  • Anlage2.zip
    10,8 KB · Aufrufe: 2

VfL_Freak

Top Contributor
Moin,
also ...
Wie da schon steht, ist Dein Fehler, dass Du einen String nicht einfach nach Date casten kannst!

Die Exception fliegt hier :
at calc.Schueler2.readSchuelersFromExcelFile(Schueler2.java:114)
ich weiß aber nicht wie dieser Code ausschaut !

BTW: unbekannte Anlagen öffne ich NIE !!
Poste den entsprechenden Code hier!!

VG Klaus
 

reutila

Mitglied
Hallo Klaus,

der Code habe ich gepostet. s.o.
in Zeile 114 steht folgender Code:
Java:
aSchueler.setGeburtstag((Date) getCellValue(nextCell));

Danke
 

reutila

Mitglied
Hallo Klaus,

den SimpleDateFormatter habe ich schon verwendet s.o.
hier nochmal die Umsetzung:
Java:
 private Object getCellValue(Cell cell) {
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();

        case Cell.CELL_TYPE_BOOLEAN:
            return cell.getBooleanCellValue();

        case Cell.CELL_TYPE_NUMERIC:
            if (DateUtil.isCellDateFormatted(cell)) {
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
                cell.getDateCellValue();
            } else {
                return cell.getNumericCellValue();
            }
        }

        return null;
    }

    public List<Schueler2> readSchuelersFromExcelFile(String excelFilePath) throws IOException {
        List<Schueler2> listSchueler2 = new ArrayList<>();
        FileInputStream inputStream = new FileInputStream(new File(excelFilePath));

        Workbook workSchueler = new XSSFWorkbook(inputStream);
        Sheet firstSheet = workSchueler.getSheetAt(0);
        Iterator<Row> iterator = firstSheet.iterator();

        while (iterator.hasNext()) {
            Row nextRow = iterator.next();
            Iterator<Cell> cellIterator = nextRow.cellIterator();
            Schueler2 aSchueler = new Schueler2();

            while (cellIterator.hasNext()) {
                Cell nextCell = cellIterator.next();
                int columnIndex = nextCell.getColumnIndex();

                switch (columnIndex) {
                case 0:
                    aSchueler.setKlasse((String) getCellValue(nextCell));
                case 1:
                    aSchueler.setName((String) getCellValue(nextCell));
                    break;
                case 2:
                    aSchueler.setVorname((String) getCellValue(nextCell));
                    break;
                case 3:
                    aSchueler.setGeburtstag((Date) getCellValue(nextCell));
                    break;
                }

            }
            listSchueler2.add(aSchueler);
        }

        workSchueler.close();
        inputStream.close();

        return listSchueler2;
    }

In der Zelle steht ein Datum
habe darauf geachtet, dass das Format auch stimmt, siehe Bild

Hast du noch andere Ideen??
 

Anhänge

  • Ausschnitt.JPG
    Ausschnitt.JPG
    120,1 KB · Aufrufe: 82

reutila

Mitglied
die Lösungen habe ich auch schon gefunden, bringen mich allerdings leider nicht weiter.
Kannst du mir bitte die nötige Änderung in meinem Quellcode sagen?!

Vielen Dank
 

fhoffmann

Top Contributor
Fang doch mal an mit:
Java:
  case 3:
    String geb = (String)getCellValue(nextCell);
    System.out.println(geb);
 

VfL_Freak

Top Contributor
Moin,
nochmal: Du kannst einen String NICHT in ein Date casten !!!
aSchueler.setGeburtstag( (Date) getCellValue(nextCell) );
Du musst den Wert dann hier mit einem SimpleDateFormatter entsprechend umwandeln!!
Du hast oben zwar eine deklariert, anwenden tust Du ihn aber nicht!!

Was bringt Dich denn an den Links nicht weiter?
Gleich im ersten Ergebnis von stackoverflow ist es doch hinreichend erklärt!!!
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date convertedCurrentDate = sdf.parse("2013-09-18");
String date=sdf.format(convertedCurrentDate );
System.out.println(date);
Ein bisschen Eigeninitiative wäre schon nicht schlecht :)

VG Klaus
 

reutila

Mitglied
Danke für die Antworten:
mich hat folgendes weiter gebracht:
Java:
                case 3:
                    String geb = (String) getCellValue(nextCell);
                    try {
                        SimpleDateFormat sdf = new SimpleDateFormat("DD.MM.YYYY");
                        Date date1 = sdf.parse(geb);
                        aSchueler.setGeburtstag(date1);
                    } catch (ParseException ex2) {
                        ex2.printStackTrace();
                    }
                    break;

Auf der Konsole wird mir nun folgendes als Beispiel ausgegeben:
[klasse=Klasse 1, name=Max, vorname=Köhler, geb=Mon Dec 29 00:00:00 CET 1997]
Was muss ich tun, dass folgendes ausgegeben wird:
[klasse=Klasse 1, name=Max, vorname=Köhler, geb=29.12.1997]
 

reutila

Mitglied
In meiner Schueler-Klasse:
Java:
    public String toString() {
        return "Schueler [klasse=" + klasse + ", name=" + name + ", vorname=" + vorname + ", geb="
                + geburtstag.getDate() + "." + geburtstag.getMonth() + "." + geburtstag.getYear() + "]";
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S XLSX-File NoSuchMethodError XML & JSON 7
Mike90 -xlsx Dateien in Java lesen XML & JSON 3
T Tags in XML Datei mit Java erstellen XML & JSON 3
S XML Datei speichern nicht möglich XML & JSON 13
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
D XML-Datei per Button erstellen XML & JSON 3
K JAR-File mit XML-Datei XML & JSON 1
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
E JTreedaten in eine XML Datei speichern XML & JSON 3
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
B xsd-Datei ins jar file XML & JSON 5
T Formulardaten in XML Datei speichern XML & JSON 5
H Wsdl datei XML & JSON 2
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
S Neue Inhalte in XML-Datei einfügen XML & JSON 0
S JDOM XML Datei darstellen Fehler! XML & JSON 2
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
J XML - Datei wird nicht ganz angezeigt XML & JSON 2
P (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF XML & JSON 12
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
E ResultSet als XML Datei speichern XML & JSON 7
M XStream, CSV Datei XML & JSON 9
A Frage zu bestehender XML Datei XML & JSON 6
A Simple Constructor Injection Datei-Pfad XML & JSON 6
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
A XML datei lesbar speichern (eingerückt) XML & JSON 7
M XML Datei Parsen XML & JSON 4
Airwolf89 HTML Datei mit SAXBuilder laden hängt sich auf XML & JSON 4
N Java Code aus XML Datei generieren XML & JSON 8
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
K Kurze XML Datei Parsen XML & JSON 5
S XSD-Datei zulässige Werte auslesen XML & JSON 3
M XML Datei heapspace erreicht XML & JSON 3
M Große Datei auslesen/in dieser suchen XML & JSON 2
S Konforme XML Datei über XSD erstellen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
M XML Datei drucken XML & JSON 8
T Daten aus Programm in XML Datei speichern XML & JSON 2
D XSD Datei erstellen XML & JSON 4
L [SAX] Geschachtelte XML Datei parsen XML & JSON 3
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
G txt. Datei in xml datei konvertieren XML & JSON 21
K XML Datei in ein Java package „einbinden" XML & JSON 3
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
L xml Datei parsen ohne End-Tag XML & JSON 6
C if-Abfrage mit Datei Variable aus XML-Datei XML & JSON 2
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
sylo DOM Document in XML Datei schreiben XML & JSON 5
F XML Datei in Java einlesen XML & JSON 4
J Objektstruktur aus XML-Datei erzeugen XML & JSON 21
D ID's aus XML Datei rauslesen und in Java ausgeben XML & JSON 7
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
ARadauer Aus XML Datei Objekte erstellen... XML & JSON 3
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
H xml-Datei mit Attributen einlesen XML & JSON 3
A XML-Datei: Ab wann kritische Größe erreicht? XML & JSON 4
multiholle XML Datei elegant verarbeiten XML & JSON 14
M XMI-Datei auslesen XML & JSON 4
T Ließt keine XML Datei XML & JSON 2
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
J XML-Datei ein Array einlesen XML & JSON 10
M xml - datei erstellen XML & JSON 2
T Wie einen String(XML Inhalt) in eine XML Datei speichern? XML & JSON 8
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
H XML-Datei in einzelne XML-Dateien zerlegen XML & JSON 2
G Tags oder Zeilen der Not-Validen XML-Datei XML & JSON 7
C Suche in XML-Datei XML & JSON 6
D Zeilennummer in der XML - Datei XML & JSON 5
S Einlesen einer xml Datei XML & JSON 4
M Datei parsen XML & JSON 5
S PDF Erzeugung - Probleme mit der XML Datei bei Schema-Infos XML & JSON 2
S XML Datei einlesen, aber root überspringen XML & JSON 2
T Werte in XML Datei an entsprechender Stelle einfügen XML & JSON 3
Saxony unbekannte XML Datei parsen und ausgeben XML & JSON 10
L XML Datei in Java angeben Pfad? XML & JSON 3
A Mehrere Anwender sollen auf eine XML-Datei zugreifen XML & JSON 4
A SVG Datei auslesen und Batik XML & JSON 1
N neue XML-Datei erstellen mit vorhandener Struktur XML & JSON 18
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M brauche große XML-Datei für XPath-Tests XML & JSON 4
L mit Java eine HTML-Datei erstellen XML & JSON 3
L bz2-Datei parsen XML & JSON 9

Ähnliche Java Themen

Neue Themen


Oben