脚本专家 发表于 2026-9-1 13:00:01

Python合并和取消合并Excel单元格的完整脚本实践

在报表自动化和数据处理场景中,经常需要动态调整Excel表格结构,比如把多列表头合并为一个大标题、把整列合并为分类标签,或者将已合并的区域重新拆分。使用Python操作Excel的方案很多,其中Free Spire.XLS库提供了直接且清晰的合并与取消合并接口,并且运行脚本的机器不需要安装Office或WPS客户端,适合部署在服务端做自动处理。

一、安装与导入

通过pip安装依赖库:

pip install Spire.XLS.Free


在脚本开头导入所需模块:

from spire.xls import *
from spire.xls.common import *


注意:安装时的库名是 Spire.XLS.Free,导入时使用小写的 spire.xls。

二、合并整行

合并某一行所有单元格,通常用来创建跨列表头。使用 Rows.Merge(),行索引从0开始。示例代码如下:

workbook = Workbook()
workbook.LoadFromFile("销售数据.xlsx")
sheet = workbook.Worksheets

# 合并第1行(索引0)
sheet.Rows.Merge()

# 合并后只能通过左上角单元格写入内容
sheet.Range["A1"].Value = "2026年度销售汇总"

workbook.SaveToFile("合并行结果.xlsx", ExcelVersion.Version2013)
workbook.Dispose()


三、合并整列

如果想把某一列的所有单元格合并成一个整体,比如显示一个纵向的类别标识,可以使用 Columns.Merge()。索引同样从0开始。

# 合并第2列(索引1,即B列)
sheet.Columns.Merge()

# 内容保留在B1单元格
sheet.Range["B1"].Value = "地区分类"


四、合并指定单元格区域

更灵活的做法是合并任意矩形区域,例如标题跨多列、小计跨多行。通过 Range["起始单元格:结束单元格"].Merge() 实现。

# 横向合并:A1:E1
sheet.Range["A1:E1"].Merge()

# 纵向合并:C3:C8
sheet.Range["C3:C8"].Merge()

# 合并D4:F6,形成一个2行×3列的合并区域
sheet.Range["D4:F6"].Merge()


需要特别留意:合并后,只有区域左上角单元格的值会被保留,区域内其他单元格的数据会被自动清除,所以应该提前备份或先完成数据填充。

五、取消合并(拆分)

取消合并操作与合并对应,使用 UnMerge() 方法。可以单独取消某个合并区域,也可以按整行、整列批量取消。

取消单个合并区域:

# 传入合并区域内任意一个单元格即可拆分整个合并区域
sheet.Range["A1"].UnMerge()


取消整行的合并:

sheet.Rows.UnMerge()


取消整列的合并:

sheet.Columns.UnMerge()


一次性拆分工作表中的所有合并区域:

merged_list = sheet.MergedCells
for cell_range in merged_list:
    cell_range.UnMerge()


六、综合示例:合并与拆分演示

下面是一个完整脚本,演示加载原始报表、执行三种合并操作、保存结果,再重新加载文件并取消部分合并区域。

from spire.xls import *
from spire.xls.common import *

def merge_demo():
    # 步骤1:加载源文件
    workbook = Workbook()
    workbook.LoadFromFile("原始报表.xlsx")
    sheet = workbook.Worksheets

    # 步骤2:执行多种合并
    # 2.1 合并第1行作为大标题
    sheet.Rows.Merge()
    sheet.Range["A1"].Value = "全国门店销售总览"

    # 2.2 合并B列作为区域分类
    sheet.Columns.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

    # 取消合并 D2:E4 区域
    sheet2.Range["D2"].UnMerge()

    # 取消合并第1行
    sheet2.Rows.UnMerge()

    workbook2.SaveToFile("取消合并结果.xlsx", ExcelVersion.Version2013)
    workbook2.Dispose()

if __name__ == "__main__":
    merge_demo()


运行脚本后会得到两个文件:合并结果.xlsx 展示所有合并效果,取消合并结果.xlsx 则恢复了部分区域的拆分状态。

七、常见注意事项

- 合并后写入值:向合并区域写入数据时,只能通过左上角单元格的地址(比如 Range["A1"].Value)进行赋值。
- 数据保留规则:合并操作仅保留左上角单元格的值,其余区域内的数据会被清除。建议先完成数据填充,或在合并前备份原始数据。
- 性能考量:如果工作表中存在大量合并区域,频繁调用 Merge() 或 UnMerge() 可能稍慢,建议批量操作。
- 重复合并问题:对已经有合并状态的区域再次合并不会报错,但可能产生嵌套合并问题,建议先检查 MergedCells 属性。
- 环境依赖:该库不需要本机安装 Excel 或 WPS,但需要安装免费的 Spire.XLS.Free 库。

以上是使用Python操作Excel合并与取消合并单元格的完整实践,适用于报表预处理、数据清洗和自动化生成等场景。

热心网友7 发表于 2026-9-1 19:00:00

Re: Python合并和取消合并Excel单元格的完整脚本实践

感谢分享,这篇实践帖写得非常清晰,正好最近在处理报表自动化,合并单元格这块一直用openpyxl绕来绕去,看到你介绍Free Spire.XLS的直接Merge/UnMerge接口确实省事很多。尤其是“合并后只能通过左上角单元格写入值”和“数据保留规则”这两点提醒很实用,很多人第一次用容易踩坑。 想追问一个细节:如果合并区域里原本有数据,程序是直接静默清除其他区域的内容,还是会抛出警告?因为实际工作中有些报表是多人协作生成的,里面可能会留一些临时备注,怕直接跑脚本把数据冲掉。另外,批量取消合并区域时用 sheet.MergedCells 遍历,如果表格里合并区域特别多,会不会有性能隐患?感谢!

热心网友6 发表于 2026-9-1 19:05:00

Re: Python合并和取消合并Excel单元格的完整脚本实践

学习了,正好最近在写报表自动化的脚本,之前都是用openpyxl手动处理合并单元格,流程比较繁琐。这个库的接口确实直观,尤其是不用装Office这个点很实用,部署到服务器上省心很多。 有个小问题想请教一下:如果合并前区域里已经有数据,除了提前备份,有没有办法判断哪些单元格会被清除?或者有没有类似“合并时保留所有值”的参数?目前看示例好像只能保留左上角,担心误操作丢数据。

热心网友3 发表于 2026-9-1 19:10:00

Re: Python合并和取消合并Excel单元格的完整脚本实践

感谢楼主的分享,写得很清楚,特别是合并后只有左上角单元格的值会保留这个坑,很多新手容易踩。我之前用openpyxl处理类似需求时,还得自己遍历合并区域再逐个取消,确实麻烦一些,这个库的接口看起来直观很多。 有个小问题想请教一下:在“取消整行的合并”那里,如果这一行里只有一个合并区域,那没问题;但如果行里有多个不连续的合并区域,`Rows.UnMerge()` 是不是会把这一行里所有的合并区域都拆掉?还是只拆某个?希望能指点一下,谢谢!
页: [1]
查看完整版本: Python合并和取消合并Excel单元格的完整脚本实践