[JAVA] Comment annuler la fusion de cellules dans une plage spécifiée avec POI

environnement

java

Apache Poi

Annuler la fusion de cellules dans la plage spécifiée

Avant l'exécution base.PNG

Je n'ai pas trouvé une telle méthode dans la classe Sheet, alors je l'ai créée moi-même. Code pour annuler la fusion des cellules dans A2: C6

Sample.java



import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;

    public static void main(String[] args) { 
        try(Workbook book = WorkbookFactory.create(Sample.class.getResourceAsStream("sample.xlsx"));
                OutputStream out = new FileOutputStream("sample.xlsx");) {
            XSSFSheet sheet = (XSSFSheet) book.getSheetAt(0);
            
            CellRangeAddress targetRange = CellRangeAddress.valueOf("A2:C6");
            int removeCount = removeMergedRagions(targetRange, sheet);
            System.out.println(removeCount + "Non lié");
            
            book.write(out);
        }catch(Exception ex) {
            //Faire quelque chose
        }

    }
    
    /**
     *Annule la fusion de cellules dans la plage spécifiée<br>
     *Si même une pièce se trouve dans la plage spécifiée, la combinaison en dehors de la plage est également annulée.
     * @param targetRange Plage pour rompre la jointure,not {@code null}
     * @feuille de param La feuille à libérer,not {@code null}
     * @return Nombre de non jointes
     * @see org.apache.poi.xssf.usermodel.XSSFSheet#Vous pouvez l'utiliser si la version removeMergedRegions est xlsx uniquement
     */
    private static int removeMergedRegions(CellRangeAddress targetRange ,Sheet sheet) {
        List<CellRangeAddress> mergeList = sheet.getMergedRegions();
        List<Integer> removeIndices = new ArrayList<>();
        
        for(int mergeIndex = 0; mergeIndex < mergeList.size(); mergeIndex++) {
            CellRangeAddress mergedAddress = mergeList.get(mergeIndex);
            if(targetRange.intersects(mergedAddress)) 
                removeIndices.add(mergeIndex);
        }
        //Si vous le relâchez par l'avant, l'index ne correspondra pas, supprimez-le donc de l'arrière
        Collections.reverse(removeIndices);
        for(int removeIndex : removeIndices) 
            sheet.removeMergedRegion(removeIndex);
        
        return removeIndices.size();
    }

Journal d'exécution result.PNG

Après exécution removeRagions.PNG

Les cellules fusionnées qui étaient partiellement dans "A2: C6" ont été dissociées

Mise en œuvre de la méthode:

  1. Obtenez une liste des informations de jointure de la feuille et affectez-la à margeList
  2. Extrayez un par un de la margeList et vérifiez s'il se trouve dans la plage targetRange.
  3. S'il se trouve dans la plage, placez l'index dans removeIndices
  4. Inversez le contenu de removeIndices pour éviter une incohérence d'index en cas de suppression de l'avant
  5. Enfin supprimer par derrière

Cliquez ici pour la feuille XSSF uniquement

Sample.java



import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;

    public static void main(String[] args) { 
        try(Workbook book = WorkbookFactory.create(Sample.class.getResourceAsStream("sample.xlsx"));
                OutputStream out = new FileOutputStream("sample.xlsx");) {
            XSSFSheet sheet = (XSSFSheet) book.getSheetAt(0);
            
            CellRangeAddress targetRange = CellRangeAddress.valueOf("A2:C6");
            int removeCount = removeMargedRagions(targetRange, sheet);
            System.out.println(removeCount + "Non lié");
            
            book.write(out);
        }catch(Exception ex) {
            //Faire quelque chose
        }

    }
    

    /**
     *Annule la fusion de cellules dans la plage spécifiée<br>
     *Si même une pièce se trouve dans la plage spécifiée, la combinaison en dehors de la plage est également annulée.
     * @param targetRange Plage pour rompre la jointure,not {@code null}
     * @Param xssfSheet Sheet à publier,not {@code null}
     * @return Nombre de non jointes
     */
    private static int removeMergedRagions(CellRangeAddress targetRange ,XSSFSheet xssfSheet) {
        List<CellRangeAddress> mergeList = xssfSheet.getMergedRegions();
        List<Integer> removeIndices = new ArrayList<>();
        
        for(int mergeIndex = 0; mergeIndex < mergeList.size(); mergeIndex++) {
            CellRangeAddress mergedAddress = mergeList.get(mergeIndex);
            if(targetRange.intersects(mergedAddress)) 
                removeIndices.add(mergeIndex);
        }
        
        xssfSheet.removeMergedRegions(removeIndices);

        return removeIndices.size();
    }

Recommended Posts

Comment annuler la fusion de cellules dans une plage spécifiée avec POI
Mettez en majuscule uniquement la plage spécifiée avec la sous-chaîne. (Comment utiliser la sous-chaîne)
Comment supprimer un objet new_record construit avec Rails
Comment générer manuellement un JWT avec Knock in Rails
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Comment insérer une vidéo dans un hameau avec Rails]
[Java] Comment rompre une ligne avec StringBuilder
Comment faire une capture d'écran avec l'émulateur Android Studio
Comment demander un fichier CSV au format JSON avec jMeter
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Comment déplacer une autre classe avec une action de bouton d'une autre classe.
Comment sélectionner une date spécifiée par code dans le calendrier FS
Mappage à une classe avec un objet de valeur dans How to My Batis
Comment configurer un proxy avec authentification dans Feign
Comment s'inscrire en tant que client dans Square à l'aide de Tomcat
Comment laisser un commentaire
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import
Comment utiliser Apache POI
Comment insérer une vidéo
Comment créer une méthode
Comment créer un fichier jar sans dépendances dans Maven
Comment renommer un modèle avec des contraintes de clé externes dans Rails
Comment ouvrir un fichier de script à partir d'Ubuntu avec du code VS
Comment construire un peu délicat avec la génération de requêtes SQL dynamiques
Comment démarrer avec Slim
Comment créer un conteneur Java
Comment entourer n'importe quel caractère avec "~"
Comment signer Minecraft MOD
Comment créer un pilote JDBC
Comment utiliser mssql-tools avec Alpine
[Swift] Comment envoyer une notification
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment faire un projet Maven
Comment créer un tableau Java
Comment démarrer Camunda avec Docker
Comment interagir avec un serveur qui ne plante pas l'application
[Mémo personnel] Comment interagir avec le générateur de nombres aléatoires en Java
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 6.x)
Comment appliquer les restrictions d'adresse IP uniquement à des répertoires spécifiques avec laravel + nginx
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
Comment SSH dans Ubuntu à partir d'un terminal avec authentification par clé publique
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 5.x)
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Comment démarrer un conteneur Docker avec un volume monté dans un fichier de commandes