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:
- 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. - Erstellen Sie eine Methode, die Ihren
ItemReader
konfiguriert Bean und stellen Sie sicher, dass die Methode einenItemReader<StudentDTO>
zurückgibt Objekt. - Implementieren Sie die erstellte Methode, indem Sie diesen Schritten folgen:
- Erstellen Sie einen neuen
PoiItemReader<StudentDTO>
Objekt. - Stellen Sie sicher, dass der erstellte Reader die Kopfzeile Ihrer Tabelle ignoriert.
- Konfigurieren Sie das erstellte Lesegerät, um die Schülerinformationen von
data/students.xlsx
zu lesen Datei, die aus dem Klassenpfad gefunden wird. - Konfigurieren Sie den Reader so, dass er eine Zeile mit Schülerinformationen in einen
StudentDTO
umwandelt Objekt mit demBeanWrapperRowMapper
Klasse. Diese Klasse füllt die Felder des erstelltenStudentDTO
Objekt, indem Sie die Spaltennamen verwenden, die in der Kopfzeile Ihrer Tabelle angegeben sind. - Gib den erstellten
PoiItemReader<StudentDTO>
zurück Objekt.
- Erstellen Sie einen neuen
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:
- Erstellen Sie einen
StudentExcelRowMapper
Klasse. - Implementieren Sie
RowMapper<T>
Schnittstelle und übergeben Sie den Typ des erstellten Objekts (StudentDTO
) als Typparameter. - Implementieren Sie den
T mapRow(RowSet rowSet)
Methode desRowMapper<T>
Schnittstelle, indem Sie diesen Schritten folgen:- Erstellen Sie einen neuen
StudentDTO
Objekt. - 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 desRowSet
Schnittstelle. Außerdem müssen Sie daran denken, dass der Index der ersten Spalte 0 ist. - Gib den erstellten
StudentDTO
zurück Objekt.
- Erstellen Sie einen neuen
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:
- Stellen Sie sicher, dass Ihr
ItemReader
ignoriert nicht die erste Zeile der Eingabedaten. - Ersetzen Sie den alten
excelRowMapper()
Methode mit einer Methode, die einen neuenStudentExcelRowMapper
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 demBeanWrapperRowMapper<T>
Klasse, solange Ihre Excel-Tabelle eine Kopfzeile hat und die Spaltennamen der Kopfzeile in die Feldnamen desT
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 denRowMapper<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.