# dotNet.ReoGrid 扩展库 - 合并与取消合并单元格

## 合并单元格

要合并单元格范围，可以使用以下两种方式之一：

```aardio
// 获取当前活动工作表
var sheet1 = reoGridControl.CurrentWorksheet;

// 方式1：调用工作表的合并方法
sheet1.MergeRange("B3:E5");

// 方式2：通过范围实例合并
var range = sheet1.Ranges["B3:E5"];
range.Merge();
```

![合并单元格示例](document/images/22_2.png)

## 取消合并单元格

```aardio
// 取消合并指定范围
sheet1.UnmergeRange("B3:E5");

// 或者通过范围实例取消合并
var range = sheet1.Ranges["B3:E5"];
range.Unmerge();
```

## 撤销与重做

合并与取消合并操作可以通过动作执行，这样允许撤销操作。

### 通过动作合并单元格

```aardio
// 使用动作合并单元格范围
grid.DoAction(ReoGrid.MergeRangeAction("B3:E5"));
```

### 通过动作取消合并单元格

```aardio
// 使用动作取消合并单元格范围
grid.DoAction(ReoGrid.UnmergeRangeAction("B3:E5"));
```

## 运行脚本

使用扩展版本时，可以执行脚本进行合并和取消合并操作：

```aardio
var sheet1 = workbook.CurrentWorksheet;
sheet1.mergeRange(ReoGrid.Range("B3:E5"));  // 合并范围
sheet1.unmergeRange(ReoGrid.Range("B3:E5")); // 取消合并范围
```

### 示例：合并或取消合并当前选中的范围

```aardio
var sheet1 = workbook.CurrentWorksheet;
sheet1.mergeRange(grid.selection);    // 合并选中范围
sheet1.unmergeRange(grid.selection);  // 取消合并选中范围
```

## 注意事项

`UnmergeRange`方法会查找并取消合并指定范围内的所有已合并单元格。例如，下图中如果传入红色范围作为参数，则已合并的单元格A、B和C都会被取消合并。

![取消合并范围示例](document/images/9_2.png)

## 合并单元格的特性

### 检查单元格是否合并

只有合并范围左上角的单元格才是合并单元格。除了左上角单元格外，合并到范围内的其他单元格都会变为无效。

![合并单元格示意图](document/images/1010.png)

要检查单元格是否合并，使用工作表的`IsMergedCell`方法：

```aardio
var isMergedCell = sheet1.IsMergedCell(2, 1);  // false
isMergedCell = sheet1.IsMergedCell(2, 2);     // true
isMergedCell = sheet1.IsMergedCell(2, 3);      // false
```

### 行跨度和列跨度

合并单元格有两个属性`RowSpan`和`ColSpan`，用于确定每个方向合并了多少个单元格：

![行跨度和列跨度示意图](document/images/11-1.png)

B3单元格是一个合并单元格，它的`rowspan`为4，`colspan`为3。

通过获取单元格实例可以获取更多信息，获取`rowspan`和`colspan`：

```aardio
var rowspan = cell.GetRowspan();  // 行跨度数量
var colspan = cell.GetColspan();  // 列跨度数量
```

属性`IsMergedCell`用于检查单元格是否是合并单元格：

```aardio
var cell = sheet1.Cells["B3"];
var isMergedCell = cell.IsMergedCell;  // true
```

### 从范围中查找合并单元格

ReoGrid提供了`GetMergedCellOfRange`方法，用于从指定范围中查找合并单元格。

![查找合并单元格示意图](document/images/12-1.png)

```aardio
var outputCell = sheet1.GetMergedCellOfRange(inputRange);
```

### 有效与无效单元格

被其他单元格合并的单元格会变为无效，无效单元格不能显示数据和样式。下图中红色范围是一个合并单元格，除了第一个单元格外，标记为"No"的其他单元格都是无效单元格，它们不能被选中和编辑。

![有效与无效单元格示意图](document/images/19-1.png)

工作表有一个名为`IsValidCell`的方法，用于检查单元格是否有效。

```aardio
sheet1.IsValidCell(2, 2);  // true
sheet1.IsValidCell(2, 3);  // false
```

### 检查完整合并单元格

有一个方法可以检查并获取完整的合并单元格，如果给定的是单元格的一部分。

![检查完整合并单元格示意图](document/images/56.png)

```aardio
var outputRange = sheet1.CheckMergedRange(inputRange);
```

### 范围交叉异常

要合并的范围可能会与其他合并单元格交叉，尝试合并交叉范围会导致`RangeIntersectionException`。

![范围交叉异常示意图](document/images/20-2.png)

用户代码应该处理这个异常并取消用户操作。

![异常处理示意图](document/images/21-1.png)

方法`CheckIntersectedMergingRange`用于检查指定范围内是否包含任何合并单元格的部分。这个方法可以避免上述异常。

```aardio
var outputRange = sheet1.CheckIntersectedMergingRange(inputRange);
```

如果`outputRange.IsEmpty`为true，表示`inputRange`是安全的。还有另一个方法可以实现相同功能：

```aardio
var hasIntersection = sheet1.HasIntersectedMergingRange(inputRange);
```