Java >> Java Tutorial >  >> Tag >> Spring

Spring Batch Tutorial:Lesen von Informationen aus einer Excel-Datei

Es ist ziemlich einfach, einen Spring Batch-Job zu erstellen, der seine Eingabedaten aus einer CSV- oder einer XML-Datei liest, da diese Dateiformate standardmäßig unterstützt werden.

Wenn Sie jedoch die Eingabedaten Ihres Batch-Jobs aus einer .XLS- oder .XLSX-Datei lesen möchten, die mit Excel erstellt wurde, müssen Sie sich etwas mehr anstrengen. Dieser Blogbeitrag hilft Ihnen, dieses Problem zu lösen.

Fangen wir an.

Einführung in die Beispielanwendung

In diesem Blogbeitrag erfahren Sie, wie Sie einen ItemReader konfigurieren Bean, die die Eingabedaten Ihres Batch-Jobs aus einer Excel-Datei lesen kann. Diese Datei enthält eine Studentenliste, die die folgenden Informationen für Ihren Batch-Job bereitstellt:

  • Der Name des Schülers.
  • Die E-Mail-Adresse des Kursteilnehmers.
  • Der Name des gekauften Pakets.

Wenn Sie die Schülerinformationen aus einer Excel-Datei lesen, müssen Sie diese Informationen in StudentDTO umwandeln Objekte, die von Ihrem Batch-Job verarbeitet werden. Die StudentDTO Klasse enthält die Informationen eines einzelnen Schülers und ihr Quellcode sieht wie folgt aus:

public class StudentDTO {
 
    private String emailAddress;
    private String name;
    private String purchasedPackage;
 
    public StudentDTO() {}
 
    public String getEmailAddress() {
        return emailAddress;
    }
 
    public String getName() {
        return name;
    }
 
    public String getPurchasedPackage() {
        return purchasedPackage;
    }
 
    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setPurchasedPackage(String purchasedPackage) {
        this.purchasedPackage = purchasedPackage;
    }
}

Vorher können Sie den ItemReader konfigurieren die Schülerinformationen aus Ihrer Excel-Datei liest, müssen Sie dem Klassenpfad einige Abhängigkeiten hinzufügen.

Erforderliche Abhängigkeiten abrufen

Wenn Sie die Eingabedaten Ihres Spring Batch-Jobs aus einem Excel-Dokument lesen möchten, müssen Sie dem Klassenpfad die folgenden Abhängigkeiten hinzufügen:

  • Spring Batch Excel ist eine Spring Batch-Erweiterung, die ItemReader bereitstellt Implementierungen für Excel. Leider ist im Moment die einzige Möglichkeit, die erforderliche JAR-Datei zu erhalten, sie aus der Quelle zu erstellen.
  • Apache-POI stellt eine Java-API bereit, die Ihnen beim Lesen (und Erstellen) von Microsoft Office-Dokumenten hilft. Es ist eine optionale Abhängigkeit von Spring Batch Excel und Sie können es zum Lesen der Eingabedaten Ihres Batch-Jobs aus .XLS- und .XLSX-Dokumenten verwenden.

Nachdem Sie dem Klassenpfad die erforderlichen Abhängigkeiten hinzugefügt haben, können Sie abschließend den ItemReader konfigurieren die die Schülerinformationen aus Ihrer Excel-Tabelle liest.

Informationen aus einer Excel-Datei lesen

Die students.xlsx Datei enthält die Studentenliste eines Online-Kurses. Diese Datei wird im Klassenpfad gefunden und ihr vollständiger Pfad lautet:data/students.xlsx . Der Inhalt dieser Excel-Tabelle sieht wie folgt aus:

NAME			|EMAIL_ADDRESS				|PURCHASED_PACKAGE
Tony Tester		|[email protected]		|master
Nick Newbie		|[email protected]		|starter
Ian Intermediate|[email protected]	|intermediate

Wie Sie bereits wissen, können Sie die Eingabedaten für Ihren Spring-Batch-Job bereitstellen, indem Sie einen ItemReader konfigurieren Bohne. Da Sie die Eingabedaten Ihres Batch-Jobs aus einem Excel-Dokument lesen müssen, können Sie den ItemReader konfigurieren Bean, indem Sie diesen Schritten folgen:

  1. Erstellen Sie einen ExcelFileToDatabaseJobConfig Klasse und kommentieren Sie sie mit dem @Configuration Anmerkung. Diese Klasse ist die Konfigurationsklasse Ihres Batch-Jobs und enthält die Beans, die den Ablauf Ihres Batch-Jobs beschreiben.
  2. Erstellen Sie eine Methode, die Ihren ItemReader konfiguriert Bean und stellen Sie sicher, dass die Methode einen ItemReader<StudentDTO> zurückgibt Objekt.
  3. Implementieren Sie die erstellte Methode, indem Sie diesen Schritten folgen:
    1. Erstellen Sie einen neuen PoiItemReader<StudentDTO> Objekt.
    2. Stellen Sie sicher, dass der erstellte Reader die Kopfzeile Ihrer Tabelle ignoriert.
    3. Konfigurieren Sie das erstellte Lesegerät, um die Schülerinformationen von data/students.xlsx zu lesen Datei, die aus dem Klassenpfad gefunden wird.
    4. Konfigurieren Sie den Reader so, dass er eine Zeile mit Schülerinformationen in einen StudentDTO umwandelt Objekt mit dem BeanWrapperRowMapper Klasse. Diese Klasse füllt die Felder des erstellten StudentDTO Objekt, indem Sie die Spaltennamen verwenden, die in der Kopfzeile Ihrer Tabelle angegeben sind.
    5. Gib den erstellten PoiItemReader<StudentDTO> zurück Objekt.

Der Quellcode von ExcelFileToDatabaseJobConfig Klasse sieht wie folgt aus:

import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.excel.RowMapper;
import org.springframework.batch.item.excel.mapping.BeanWrapperRowMapper;
import org.springframework.batch.item.excel.poi.PoiItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;

@Configuration
public class ExcelFileToDatabaseJobConfig {

    @Bean
    ItemReader<StudentDTO> excelStudentReader() {
        PoiItemReader<StudentDTO> reader = new PoiItemReader<>();
        reader.setLinesToSkip(1);
        reader.setResource(new ClassPathResource("data/students.xlsx"));
        reader.setRowMapper(excelRowMapper());
        return reader;
    }

    private RowMapper<StudentDTO> excelRowMapper() {
        BeanWrapperRowMapper<StudentDTO> rowMapper = new BeanWrapperRowMapper<>();
        rowMapper.setTargetType(StudentDTO.class);
        return rowMapper;
    }
}

Dieser Ansatz funktioniert, solange Ihre Excel-Tabelle eine Kopfzeile hat und die Spaltennamen der Kopfzeile in die Feldnamen der StudentDTO aufgelöst werden können Klasse.

Es ist jedoch durchaus möglich, dass Sie die Eingabedaten aus einer Tabelle ohne Kopfzeile lesen müssen. In diesem Fall müssen Sie einen benutzerdefinierten RowMapper erstellen die die Zeilen Ihrer Tabelle in StudentDTO umwandelt Objekte.

Sie können einen benutzerdefinierten RowMapper erstellen indem Sie diesen Schritten folgen:

  1. Erstellen Sie einen StudentExcelRowMapper Klasse.
  2. Implementieren Sie RowMapper<T> Schnittstelle und übergeben Sie den Typ des erstellten Objekts (StudentDTO ) als Typparameter.
  3. Implementieren Sie den T mapRow(RowSet rowSet) Methode des RowMapper<T> Schnittstelle, indem Sie diesen Schritten folgen:
    1. Erstellen Sie einen neuen StudentDTO Objekt.
    2. Füllen Sie die Feldwerte des erstellten Objekts aus. Sie können die Spaltenwerte der verarbeiteten Zeile lesen, indem Sie getColumnValue(int columnIndex) aufrufen Methode des RowSet Schnittstelle. Außerdem müssen Sie daran denken, dass der Index der ersten Spalte 0 ist.
    3. Gib den erstellten StudentDTO zurück Objekt.

Der Quellcode von StudentExcelRowMapper Klasse sieht wie folgt aus:

import org.springframework.batch.item.excel.RowMapper;
import org.springframework.batch.item.excel.support.rowset.RowSet;

public class StudentExcelRowMapper implements RowMapper<StudentDTO> {

    @Override
    public StudentDTO mapRow(RowSet rowSet) throws Exception {
        StudentDTO student = new StudentDTO();

        student.setName(rowSet.getColumnValue(0));
        student.setEmailAddress(rowSet.getColumnValue(1));
        student.setPurchasedPackage(rowSet.getColumnValue(2));

        return student;
    }
}

Nachdem Sie Ihren benutzerdefinierten Zeilenzuordner erstellt haben, müssen Sie die folgenden Änderungen an der Konfiguration Ihres ItemReader vornehmen Bohne:

  1. Stellen Sie sicher, dass Ihr ItemReader ignoriert nicht die erste Zeile der Eingabedaten.
  2. Ersetzen Sie den alten excelRowMapper() Methode mit einer Methode, die einen neuen StudentExcelRowMapper zurückgibt Objekt.

Nachdem Sie diese Änderungen an ExcelFileToDatabaseJobConfig vorgenommen haben Klasse sieht der Quellcode wie folgt aus:

import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.excel.RowMapper;
import org.springframework.batch.item.excel.poi.PoiItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

@Configuration
public class ExcelFileToDatabaseJobConfig {

    @Bean
    ItemReader<StudentDTO> excelStudentReader() {
        PoiItemReader<StudentDTO> reader = new PoiItemReader<>();
        reader.setResource(new ClassPathResource("data/students.xlsx"));
        reader.setRowMapper(excelRowMapper());
        return reader;
    }

	private RowMapper<StudentDTO> excelRowMapper() {
       return new StudentExcelRowMapper();
    }
}

Fassen wir zusammen, was Sie aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogbeitrag hat Ihnen vier Dinge beigebracht:

  • Wenn Sie die Eingabedaten eines Spring Batch-Jobs aus einer Excel-Tabelle lesen möchten, müssen Sie Spring Batch Excel- und Apache-POI-Abhängigkeiten zum Klassenpfad hinzufügen.
  • Wenn Sie die Eingabedaten Ihres Batch-Jobs mit Spring Batch Excel und Apache POI lesen möchten, müssen Sie den PoiItemReader verwenden Klasse.
  • Sie können die Zeilen Ihrer Tabelle in T abbilden Objekte mit dem BeanWrapperRowMapper<T> Klasse, solange Ihre Excel-Tabelle eine Kopfzeile hat und die Spaltennamen der Kopfzeile in die Feldnamen des T aufgelöst werden können Klasse.
  • Wenn Ihre Excel-Tabelle keine Kopfzeile hat oder die Spaltennamen der Kopfzeile nicht in die Feldnamen des T aufgelöst werden können Klasse müssen Sie eine benutzerdefinierte Row-Mapper-Komponente erstellen, die den RowMapper<T> implementiert Schnittstelle.

Im nächsten Teil dieses Tutorials wird beschrieben, wie Sie die Ausgabedaten Ihres Batch-Jobs in eine CSV-Datei schreiben können.

P.S. Sie können die Beispielanwendungen dieses Blogposts von Github abrufen:Spring example und Spring Boot example.


Java-Tag