簡體   English   中英

如何使用 Apache POI 取消合並特定行中的單元格?

[英]How can I unmerge cell in a specific row using Apache POI?

我怎樣才能從這個代碼中取消合並單元格:

worksheet.addMergedRegion(new CellRangeAddress(
                        getRow, //first row (0-based)
                        getRow, //last row  (0-based)
                        1, //first column (0-based)
                        2  //last column  (0-based)
                ));

我嘗試將第四個參數“2”替換為“1”。

這就是我的做法,也許您使用的 removeMergedRegion() 是錯誤的。

        // Merge some cells
        spreadsheet.addMergedRegion(new CellRangeAddress(0,0,0,1));
        spreadsheet.addMergedRegion(new CellRangeAddress(1,1,0,1));
        spreadsheet.addMergedRegion(new CellRangeAddress(0,0,2,3));
        
        // Get all merged cells in document
        List<CellRangeAddress> lst = new ArrayList<CellRangeAddress>(spreadsheet.getMergedRegions());
        for(CellRangeAddress c : lst) {
            System.out.println(c);
        }
        
        // Remove the first(index 0) merged region
        spreadsheet.removeMergedRegion(0);
        System.out.println("-------");
        
        // See how it has been removed
        lst = new ArrayList<CellRangeAddress>(spreadsheet.getMergedRegions());
        for(CellRangeAddress c : lst) {
            System.out.println(c);
        }

輸出:

org.apache.poi.ss.util.CellRangeAddress [A1:B1]
org.apache.poi.ss.util.CellRangeAddress [A2:B2]
org.apache.poi.ss.util.CellRangeAddress [C1:D1]
-------
org.apache.poi.ss.util.CellRangeAddress [A2:B2]
org.apache.poi.ss.util.CellRangeAddress [C1:D1]

電子表格:

在此處輸入圖片說明

請注意,第一個合並的單元格A1:B1不再合並,並且不會影響其他單元格,即使它們在同一行和列上。

編輯

您在上一條評論中提出的問題:

因此,您需要確定要刪除的合並區域的索引。

            // Search index by position
            List<CellRangeAddress> lst = new ArrayList<CellRangeAddress>(spreadsheet.getMergedRegions());
            int i = 0;
            for(CellRangeAddress c : lst) {
                // replace the numbers with the ones matching the
                // merged cell you want to remove
                if(c.getFirstRow() == 1 &&
                    c.getFirstColumn() == 0 &&
                    c.getLastRow() == 1 &&
                    c.getLastRow() == 1)
                System.out.println(c);
                i++;
            }
            
            spreadsheet.removeMergedRegion(i);

您的問題不太清楚您知道哪些數據可以確定應從工作表中刪除哪個合並區域。

例如,如果您知道有一個特殊的CellRangeAddress是一個合並區域但不應是,那么您可以有一個方法removeMergedRegion(Sheet sheet, CellRangeAddress mergedRegionToRemove) 為此,必須使用索引 ( i ) 遍歷工作表中的所有合並區域。 如果CellRangeAddress找到的合並區域等於搜索CellRangeAddress時,將i指向正確的索引和sheet.removeMergedRegion(i)都可以使用。

完整示例:

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

class ExcelRemoveMergedRegion {
    
 static boolean removeMergedRegion(Sheet sheet, CellRangeAddress mergedRegionToRemove) {
  boolean removed = false;
  for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
   CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
   if (mergedRegionToRemove.equals(mergedRegion)) {
    sheet.removeMergedRegion(i);
    removed = true;
    break;
   }
  }
  return removed;
 }

 public static void main(String[] args) throws Exception {
     
  //Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelHavingMergedCells.xlsx")); String fileOutPath = "./ExcelHavingMergedCellsNew.xlsx";
  Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelHavingMergedCells.xls")); String fileOutPath = "./ExcelHavingMergedCellsNew.xls";

  Sheet sheet = workbook.getSheetAt(0);
  
  CellRangeAddress mergedRegionToRemove = new CellRangeAddress(1,3,1,1); //B2:B4
  boolean removed = removeMergedRegion(sheet, mergedRegionToRemove);
  if (removed) System.out.println("Merged region " + mergedRegionToRemove + " was removed");
  else System.out.println("Region " + mergedRegionToRemove + " was not merged");
      
  mergedRegionToRemove = new CellRangeAddress(0,0,4,6); //E1:G1
  removed = removeMergedRegion(sheet, mergedRegionToRemove);
  if (removed) System.out.println("Merged region " + mergedRegionToRemove + " was removed");
  else System.out.println("Region " + mergedRegionToRemove + " was not merged");
 
  mergedRegionToRemove = new CellRangeAddress(9,10,1,2); //B10:C11
  removed = removeMergedRegion(sheet, mergedRegionToRemove);
  if (removed) System.out.println("Merged region " + mergedRegionToRemove + " was removed");
  else System.out.println("Region " + mergedRegionToRemove + " was not merged");
   
  FileOutputStream out = new FileOutputStream(fileOutPath);
  workbook.write(out);
  out.close();
  workbook.close();
 }
}

注意:沒有方法可以更改合並區域的單元格范圍。 這就是需要,然后首先刪除舊的合並區域,然后創建一個具有所需單元格范圍的新合並區域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM