Dépendance Maven
Pour intégrer EasyExcel à votre projet, ajoutez la configuration suivante dans votre fichier pom.xml :
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
Modèle de données
EasyExcel repose sur l'utliisation de POJOs pour mapper les colonnes du fichier Excel. Les annotations @ExcelProperty définissent le nom de l'en-tête et la position de la colonne.
@Data
public class Employe {
@ExcelProperty(value = "Nom complet", index = 0)
private String nomComplet;
@ExcelProperty(value = "Département", index = 1)
private String departement;
@ExcelProperty(value = "Bureau", index = 2)
private String bureau;
@ExcelProperty(value = "Genre", index = 3)
private String genre;
@ExcelProperty(value = "Âge", index = 4)
private Integer age;
@ExcelProperty(value = "Adresse", index = 5)
private String adresse;
}
Écriture de données dans Excel
L'exemple ci-dessous illustre la génération d'un volume massif de données. Nous créons 50 feuilles de calcul, chacune contenant 60 000 lignes, pour un total de 3 millions d'enregistrements.
private static List<Employe> preparerDonneesTest() {
List<Employe> donnees = new ArrayList<>();
Employe emp = new Employe();
emp.setNomComplet("Jean Dupont");
emp.setAdresse("123 Rue de la Paix, Paris");
emp.setAge(35);
emp.setDepartement("Recherche et Développement");
emp.setGenre("Masculin");
emp.setBureau("B-204");
for (int i = 0; i < 60000; i++) {
donnees.add(emp);
}
return donnees;
}
public static void exporterDonnees(String cheminFichier) {
ExcelWriter ecrivain = EasyExcel.write(cheminFichier, Employe.class).build();
for (int i = 0; i < 50; i++) {
WriteSheet feuille = EasyExcel.writerSheet(i, "Feuille_" + i).build();
ecrivain.write(preparerDonneesTest(), feuille);
}
ecrivain.finish();
}
Lecture synchrone
La lecture synchrone charge toutes les données d'une feuille en mémoire sous forme de liste. Cette approche est simple mais peut consommer beaucoup de ressources sur des fichiers très volumineux.
public static void importerSynchrone(String cheminFichier) {
List<Employe> listeEmployes = EasyExcel.read(cheminFichier).head(Employe.class).sheet().doReadSync();
for (Employe emp : listeEmployes) {
System.out.println("Lecture de l'employé : " + emp.toString());
}
}
Lecture asynchrone (SAX)
Pour traiter de gros fichiers sans saturer la mémoire, il est recommandé d'utiliser un écouteur d'analyse (Listener). Les données sont lues ligne par ligne via le parseur SAX.
public static class GestionnaireDonneesEmploye extends AnalysisEventListener<Employe> {
private int compteur = 0;
@Override
public void invoke(Employe employe, AnalysisContext context) {
System.out.println("Donnée extraite : " + employe.toString());
compteur++;
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("Fin de l'analyse. Total traité : " + compteur + " lignes.");
}
}
public static void importerAsynchrone(String cheminFichier) {
EasyExcel.read(cheminFichier, Employe.class, new GestionnaireDonneesEmploye()).sheet().doRead();
}