繁体   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