本文将介绍如何利用 Python 和 Free Spire.XLS 库,以简洁的代码完成合并行、合并列、合并指定区域以及取消合并(拆分)等全部常见场景。该方案无需 Excel、WPS 客户端环境,程序运行机器无需安装办公软件,即可读写 xls、xlsx 文件,聚焦文档格式与数据操作,适合脚本自动化、数据预处理等场景。
1. 准备工作
首先通过 pip 安装所需库:
bash
pip install Spire.XLS.Free
在 Python 脚本开头导入必要的模块:
python
from spire.xls import *
from spire.xls.common import *
2. 合并整行
若要将某一行中的所有单元格合并为一个整体,例如创建跨列的表头,可使用 Rows[index].Merge() 方法(索引从 0 开始)。
python
# 加载工作簿
workbook = Workbook()
workbook.LoadFromFile("销售数据.xlsx")
sheet = workbook.Worksheets[0]
# 将第 1 行(索引0)全部合并
sheet.Rows[0].Merge()
# 填充合并后的内容(仅左上角单元格有效)
sheet.Range["A1"].Value = "2026年度销售汇总"
workbook.SaveToFile("合并行结果.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
3. 合并整列
类似地,如果希望将某一列所有单元格合并,比如创建垂直的类别标识,使用 Columns[index].Merge()。
python
# 合并第 2 列(索引1,即B列)
sheet.Columns[1].Merge()
# 内容仅保留在 B1 单元格
sheet.Range["B1"].Value = "地区分类"
4. 合并指定单元格区域
最灵活的方式是合并任意矩形区域,如标题跨多列、小计跨多行等。使用 Range["起始单元格:结束单元格"].Merge()。
python
# 合并 A1 到 E1(横向跨5列)
sheet.Range["A1:E1"].Merge()
# 合并 C3 到 C8(纵向跨6行)
sheet.Range["C3:C8"].Merge()
# 合并 D4 到 F6(2行×3列)
sheet.Range["D4:F6"].Merge()
注意:合并后,只有区域左上角的单元格值会被保留,其余单元格的值会被自动清除,请提前备份数据。
5. 取消合并(拆分单元格)
取消合并与合并操作对应,使用 UnMerge() 方法。可以取消特定单元格所在的合并区域,也可以针对整行/整列批量取消。
取消单个合并区域
python
# 拆分包含 A1 的合并区域(传入区域内任意单元格即可)
sheet.Range["A1"].UnMerge()
取消整行的合并
python
sheet.Rows[0].UnMerge()
取消整列的合并
python
sheet.Columns[1].UnMerge()
一次性拆分工作表中所有合并区域
python
merged_list = sheet.MergedCells # 获取所有合并区域列表
for cell_range in merged_list:
cell_range.UnMerge()
6. 综合代码示例
下面提供一个完整脚本,涵盖加载文件、同时进行三种合并操作、保存结果,然后再演示取消合并的过程。
python
from spire.xls import *
from spire.xls.common import *
def merge_demo():
# ----- 步骤1:加载源文件 -----
workbook = Workbook()
workbook.LoadFromFile("原始报表.xlsx")
sheet = workbook.Worksheets[0]
# ----- 步骤2:执行多种合并 -----
# 2.1 合并第1行作为大标题
sheet.Rows[0].Merge()
sheet.Range["A1"].Value = "全国门店销售总览"
# 2.2 合并B列作为区域分类
sheet.Columns[1].Merge()
sheet.Range["B1"].Value = "大区"
# 2.3 合并 D2:E4 区域作为备注说明
sheet.Range["D2:E4"].Merge()
sheet.Range["D2"].Value = "注:数据不含港澳台"
# ----- 步骤3:保存合并后的文件 -----
workbook.SaveToFile("合并结果.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
# ----- 步骤4:演示取消合并(重新加载) -----
workbook2 = Workbook()
workbook2.LoadFromFile("合并结果.xlsx")
sheet2 = workbook2.Worksheets[0]
# 取消合并 D2:E4 区域
sheet2.Range["D2"].UnMerge()
# 取消合并第1行
sheet2.Rows[0].UnMerge()
workbook2.SaveToFile("取消合并结果.xlsx", ExcelVersion.Version2013)
workbook2.Dispose()
if __name__ == "__main__":
merge_demo()
运行该脚本后,你会得到两个文件:合并结果.xlsx 展示所有合并效果,取消合并结果.xlsx 则恢复了部分区域的拆分状态。
7. 常见注意事项
- 内容保留规则:合并操作仅保留左上角单元格的值,若区域内有其他数据,它们将被丢弃。建议在合并前完成数据填充,或先备份原始数据。
- 合并后写入数据 :合并完成后,向合并区域写入数据时,仍然只能通过左上角单元格的地址(如
Range["A1"].Value = ...)进行赋值。 - 性能考量 :如果工作表中存在大量合并区域,频繁调用
Merge()或UnMerge()可能稍慢,建议批量操作。 - 异常处理 :若传入的单元格区域已有合并状态,再次合并不会报错,但可能产生嵌套合并问题,建议先检查
MergedCells属性。