Fusion des en-têtes de tableau dans les exports Excel avec EasyPoi

Cette technique permet de créer des en-têtes fusionnés lors de l'exportation de données au format Excel à l'aide de la bibliothèque Java EasyPoi. Le processus se décompose en trois étapes principales : la définition de la structure des en-têtes, le remplissage des données selon les clés des en-têtes, et la génération du fichier Excel final.

Conception des en-têtes avec fusion

La première étape consiste à construire une hiérarchie d'entités d'export Excel. Chaque entité principale peut contenir des sous-entités pour les colonnes enfants, permettant ainsi la fusion automatique des cellules dans l'en-tête du fichier exporté.


/**
 * Prépare la structure des en-têtes avec des sections fusionnées verticalement.
 */
private List<ExcelExportEntity> preparerEnTetesExport() {
    List<ExcelExportEntity> entetes = new ArrayList<>();

    // Section pour les données de paiement
    ExcelExportEntity sectionPaiement = new ExcelExportEntity("Détails Paiement", "dataPaiement");
    List<ExcelExportEntity> colonnesPaiement = new ArrayList<>();
    colonnesPaiement.add(new ExcelExportEntity("N° Commande", "refCommande"));
    colonnesPaiement.add(new ExcelExportEntity("Mode de paiement", "methodePay"));
    colonnesPaiement.add(new ExcelExportEntity("Quantité totale", "totalArticles"));
    colonnesPaiement.add(new ExcelExportEntity("Montant total", "montantTotal"));
    colonnesPaiement.add(new ExcelExportEntity("Déduction remise", "montantRemise"));
    colonnesPaiement.add(new ExcelExportEntity("Paiement espèces", "paiementEspece"));
    colonnesPaiement.add(new ExcelExportEntity("Paiement crédit", "paiementCredit"));
    sectionPaiement.setList(colonnesPaiement);

    // Section pour les informations de scan d'entrée
    ExcelExportEntity sectionScan = new ExcelExportEntity("Scan Entrée Stock", "infoScan");
    List<ExcelExportEntity> colonnesScan = new ArrayList<>();
    colonnesScan.add(new ExcelExportEntity("Nombre scannés", "qteScan"));
    colonnesScan.add(new ExcelExportEntity("Nombre retours", "qteRetour"));
    colonnesScan.add(new ExcelExportEntity("Entrée nette", "entreeNette"));
    sectionScan.setList(colonnesScan);

    // Section pour les remboursements clients
    ExcelExportEntity sectionRemboursement = new ExcelExportEntity("Remboursements Clients", "donnesRemboursement");
    List<ExcelExportEntity> colonnesRemboursement = new ArrayList<>();
    colonnesRemboursement.add(new ExcelExportEntity("Nombre remboursé", "nbRembourse"));
    colonnesRemboursement.add(new ExcelExportEntity("Montant remboursé", "totalRemboursement"));
    colonnesRemboursement.add(new ExcelExportEntity("Remise remboursée", "remiseRemboursee"));
    colonnesRemboursement.add(new ExcelExportEntity("Espèces remboursées", "especeRemboursee"));
    colonnesRemboursement.add(new ExcelExportEntity("Crédit remboursé", "creditRembourse"));
    sectionRemboursement.setList(colonnesRemboursement);

    // Section pour les retours non entrés en stock
    ExcelExportEntity sectionRetourStock = new ExcelExportEntity("Retours Hors Stock", "retourNonStock");
    List<ExcelExportEntity> colonnesRetour = new ArrayList<>();
    colonnesRetour.add(new ExcelExportEntity("Non scannés", "nonScannes"));
    colonnesRetour.add(new ExcelExportEntity("Montant retour total", "montantRetourTotal"));
    colonnesRetour.add(new ExcelExportEntity("Remise retournée", "remiseRetournee"));
    colonnesRetour.add(new ExcelExportEntity("Espèces retournées", "especeRetournee"));
    colonnesRetour.add(new ExcelExportEntity("Crédit retourné", "creditRetourne"));
    sectionRetourStock.setList(colonnesRetour);

    // Section simple avec fusion verticale pour le montant final
    ExcelExportEntity montantFinal = new ExcelExportEntity("Montant Remise Final", "soldeRemise");
    montantFinal.setMergeVertical(true);

    entetes.add(sectionPaiement);
    entetes.add(sectionScan);
    entetes.add(sectionRemboursement);
    entetes.add(sectionRetourStock);
    entetes.add(montantFinal);
    return entetes;
}

Préparation des données pour l'export

Les données doivent être transformées en une liste de maps, où chaque map correspond à une ligne et contient des sous-listes pour les sections d'en-têtes. Les clés dans les maps doivent correspondre exactement aux clés définies dans la structure des en-têtes.


/**
 * Convertit les objets de données en structure adaptée pour l'export avec EasyPoi.
 */
private List<Map<String, Object>> preparerDonneesExport(List<RebateOffsetVO> donneesSource) {
    List<Map<String, Object>> lignesExport = new ArrayList<>();
    for (RebateOffsetVO element : donneesSource) {
        Map<String, Object> ligneCourante = new HashMap<>();

        // Données pour la section paiement
        List<Map<String, Object>> donneesPaiement = new ArrayList<>();
        Map<String, Object> valeursPaiement = new HashMap<>();
        valeursPaiement.put("refCommande", element.getNumeroCommande());
        valeursPaiement.put("methodePay", RebateOffsetPayTypeEnum.getLibelleParCode(element.getTypePaiement()));
        valeursPaiement.put("totalArticles", element.getNombreArticles());
        valeursPaiement.put("montantTotal", element.getMontantCommande());
        valeursPaiement.put("montantRemise", element.getMontantDeduction());
        valeursPaiement.put("paiementEspece", element.getMontantEspece());
        valeursPaiement.put("paiementCredit", element.getMontantCredit());
        donneesPaiement.add(valeursPaiement);
        ligneCourante.put("dataPaiement", donneesPaiement);

        // Données pour la section scan
        List<Map<String, Object>> donneesScan = new ArrayList<>();
        Map<String, Object> valeursScan = new HashMap<>();
        valeursScan.put("qteScan", element.getQuantiteScan());
        valeursScan.put("qteRetour", element.getQuantiteRetour());
        valeursScan.put("entreeNette", element.getEntreeNette());
        donneesScan.add(valeursScan);
        ligneCourante.put("infoScan", donneesScan);

        // Données pour la section remboursement
        List<Map<String, Object>> donneesRemboursement = new ArrayList<>();
        Map<String, Object> valeursRemboursement = new HashMap<>();
        valeursRemboursement.put("nbRembourse", element.getNombreRemboursements());
        valeursRemboursement.put("totalRemboursement", element.getMontantTotalRemboursement());
        valeursRemboursement.put("remiseRemboursee", element.getRemiseRemboursee());
        valeursRemboursement.put("especeRemboursee", element.getEspeceRemboursee());
        valeursRemboursement.put("creditRembourse", element.getCreditRembourse());
        donneesRemboursement.add(valeursRemboursement);
        ligneCourante.put("donnesRemboursement", donneesRemboursement);

        // Données pour la section retour stock
        List<Map<String, Object>> donneesRetour = new ArrayList<>();
        Map<String, Object> valeursRetour = new HashMap<>();
        valeursRetour.put("nonScannes", element.getQuantiteNonEntree());
        valeursRetour.put("montantRetourTotal", element.getMontantRetourTotal());
        valeursRetour.put("remiseRetournee", element.getRemiseRetournee());
        valeursRetour.put("especeRetournee", element.getEspeceRetournee());
        valeursRetour.put("creditRetourne", element.getCreditRetourne());
        donneesRetour.add(valeursRetour);
        ligneCourante.put("retourNonStock", donneesRetour);

        // Données pour le montant final
        ligneCourante.put("soldeRemise", element.getSoldeRemise());

        lignesExport.add(ligneCourante);
    }
    return lignesExport;
}

Exécution de l'export Excel

En combinant la structure des en-têtes et les données préparées, on utilise la classe ExportUtil d'EasyPoi pour générer le classeur Excel. Les paramètres d'export permettent de définir le titre, le type de fichier et le style.


// Initialisation des composants
List<ExcelExportEntity> structureEnTetes = preparerEnTetesExport();
List<RebateOffsetVO> donneesSource = recupererDonneesRebateOffset(requete);
List<Map<String, Object>> donneesFormatees = preparerDonneesExport(donneesSource);

// Configuration de l'export
ExportParams parametres = new ExportParams("Rapport de Compensation Remise", "RAPPORT_REMISE");
parametres.setType(ExcelType.HSSF);
parametres.setStyle(ExcelStyleHandler.class);

// Génération du classeur Excel
Workbook classeurFinal = ExcelExportUtil.exportExcel(parametres, structureEnTetes, donneesFormatees);
// Le classeurFinal peut ensuite être écrit dans un flux de sortie pour le téléchargement

Étiquettes: EasyPoi Java ExcelExport TableHeaders DataExport

Publié le 11 juin à 19h22