[JAVA] So brechen Sie das Zusammenführen von Zellen innerhalb eines bestimmten Bereichs mit dem POI ab

Umgebung

java

Apache Poi

Abbrechen der Zellenzusammenführung innerhalb des angegebenen Bereichs

Vor der Ausführung base.PNG

Ich konnte eine solche Methode in der Sheet-Klasse nicht finden, also habe ich sie selbst gemacht. Code zum Auflösen von Zellen in 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 + "Ungebunden");
            
            book.write(out);
        }catch(Exception ex) {
            //Etwas tun
        }

    }
    
    /**
     *Bricht das Zusammenführen von Zellen innerhalb des angegebenen Bereichs ab<br>
     *Befindet sich auch nur ein Teil innerhalb des angegebenen Bereichs, wird die Kombination außerhalb des Bereichs ebenfalls abgebrochen.
     * @param targetRange Bereich zum Unterbrechen des Joins,not {@code null}
     * @param sheet Das freizugebende Blatt,not {@code null}
     * @return Anzahl der nicht verbundenen
     * @see org.apache.poi.xssf.usermodel.XSSFSheet#Sie können dies verwenden, wenn die Version removeMergedRegions nur xlsx ist
     */
    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);
        }
        //Wenn Sie es von vorne freigeben, stimmt der Index nicht überein. Löschen Sie ihn daher von hinten
        Collections.reverse(removeIndices);
        for(int removeIndex : removeIndices) 
            sheet.removeMergedRegion(removeIndex);
        
        return removeIndices.size();
    }

Ausführungsprotokoll result.PNG

Nach der Ausführung removeRagions.PNG

Zusammengeführte Zellen, die sich teilweise in "A2: C6" befanden, wurden nicht zusammengeführt

Methodenimplementierung:

  1. Holen Sie sich eine Liste der Join-Informationen aus dem Blatt und weisen Sie sie margeList zu
  2. Nehmen Sie eine nach der anderen aus der MargeList heraus und prüfen Sie, ob sie innerhalb des Zielbereichs liegt.
  3. Wenn es innerhalb des Bereichs liegt, setzen Sie den Index in removeIndices
  4. Kehren Sie den Inhalt von removeIndices um, um eine Indexinkongruenz zu vermeiden, wenn diese von vorne gelöscht wird
  5. Zum Schluss von hinten löschen

Klicken Sie hier, um nur das XSSF-Blatt anzuzeigen

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 + "Ungebunden");
            
            book.write(out);
        }catch(Exception ex) {
            //Etwas tun
        }

    }
    

    /**
     *Bricht das Zusammenführen von Zellen innerhalb des angegebenen Bereichs ab<br>
     *Befindet sich auch nur ein Teil innerhalb des angegebenen Bereichs, wird die Kombination außerhalb des Bereichs ebenfalls abgebrochen.
     * @param targetRange Bereich zum Unterbrechen des Joins,not {@code null}
     * @param xssfSheet Sheet wird freigegeben,not {@code null}
     * @return Anzahl der nicht verbundenen
     */
    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

So brechen Sie das Zusammenführen von Zellen innerhalb eines bestimmten Bereichs mit dem POI ab
Großschreibung nur des angegebenen Bereichs mit Teilzeichenfolge. (Verwendung von Teilzeichenfolgen)
So löschen Sie ein mit Rails erstelltes new_record-Objekt
So generieren Sie manuell ein JWT mit Knock in Rails
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
[So fügen Sie ein Video mit Rails in haml ein]
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
So machen Sie einen Screenshot mit dem Android Studio-Emulator
So fordern Sie mit jMeter eine CSV-Datei als JSON an
Ruby mit AtCoder lernen 13 So erstellen Sie ein zweidimensionales Array
So verschieben Sie eine andere Klasse mit einer Schaltflächenaktion einer anderen Klasse.
So wählen Sie ein bestimmtes Datum anhand des Codes im FS-Kalender aus
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
So richten Sie einen Proxy mit Authentifizierung in Feign ein
So registrieren Sie sich mit Tomcat als Kunde in Square
Wie hinterlasse ich einen Kommentar?
Wie man mit html.erb nummeriert (nummeriert)
So aktualisieren Sie mit activerecord-import
Verwendung von Apache POI
So fügen Sie ein Video ein
So erstellen Sie eine Methode
So erstellen Sie eine JAR-Datei ohne Abhängigkeiten in Maven
So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
So öffnen Sie eine Skriptdatei von Ubuntu mit VS-Code
Wie man mit der Generierung dynamischer SQL-Abfragen ein wenig knifflig baut
Wie fange ich mit schlank an?
So erstellen Sie einen Java-Container
Wie man ein Zeichen mit "~" einschließt
Wie unterschreibe ich Minecraft MOD?
So erstellen Sie einen JDBC-Treiber
Wie man mssql-tools mit alpine benutzt
[Swift] So senden Sie eine Benachrichtigung
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
So erstellen Sie ein Java-Array
So starten Sie Camunda mit Docker
So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt
[Persönliches Memo] Interaktion mit dem Zufallszahlengenerator in Java
[Java] So drehen Sie ein zweidimensionales Array mit einer erweiterten for-Anweisung
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 6.x)
So wenden Sie IP-Adressbeschränkungen nur auf bestimmte Verzeichnisse mit Laravel + Nginx an
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR
SSH in Ubuntu von einem Terminal mit öffentlicher Schlüsselauthentifizierung
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 5.x)
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume