java
Apache Poi
Avant l'exécution

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

Après exécution

Les cellules fusionnées qui étaient partiellement dans "A2: C6" ont été dissociées
Mise en œuvre de la méthode:
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