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