查看: 114|回复: 0

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

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

一、安装与导入

通过pip安装依赖库:
  1. pip install Spire.XLS.Free
复制代码

在脚本开头导入所需模块:
  1. from spire.xls import *
  2. from spire.xls.common import *
复制代码

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

二、合并整行

合并某一行所有单元格,通常用来创建跨列表头。使用 Rows[index].Merge(),行索引从0开始。示例代码如下:
  1. workbook = Workbook()
  2. workbook.LoadFromFile("销售数据.xlsx")
  3. sheet = workbook.Worksheets[0]
  4. # 合并第1行(索引0)
  5. sheet.Rows[0].Merge()
  6. # 合并后只能通过左上角单元格写入内容
  7. sheet.Range["A1"].Value = "2026年度销售汇总"
  8. workbook.SaveToFile("合并行结果.xlsx", ExcelVersion.Version2013)
  9. workbook.Dispose()
复制代码

三、合并整列

如果想把某一列的所有单元格合并成一个整体,比如显示一个纵向的类别标识,可以使用 Columns[index].Merge()。索引同样从0开始。
  1. # 合并第2列(索引1,即B列)
  2. sheet.Columns[1].Merge()
  3. # 内容保留在B1单元格
  4. sheet.Range["B1"].Value = "地区分类"
复制代码

四、合并指定单元格区域

更灵活的做法是合并任意矩形区域,例如标题跨多列、小计跨多行。通过 Range["起始单元格:结束单元格"].Merge() 实现。
  1. # 横向合并:A1:E1
  2. sheet.Range["A1:E1"].Merge()
  3. # 纵向合并:C3:C8
  4. sheet.Range["C3:C8"].Merge()
  5. # 合并D4:F6,形成一个2行×3列的合并区域
  6. sheet.Range["D4:F6"].Merge()
复制代码

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

五、取消合并(拆分)

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

取消单个合并区域:
  1. # 传入合并区域内任意一个单元格即可拆分整个合并区域
  2. sheet.Range["A1"].UnMerge()
复制代码

取消整行的合并:
  1. sheet.Rows[0].UnMerge()
复制代码

取消整列的合并:
  1. sheet.Columns[1].UnMerge()
复制代码

一次性拆分工作表中的所有合并区域:
  1. merged_list = sheet.MergedCells
  2. for cell_range in merged_list:
  3.     cell_range.UnMerge()
复制代码

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

下面是一个完整脚本,演示加载原始报表、执行三种合并操作、保存结果,再重新加载文件并取消部分合并区域。
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. def merge_demo():
  4.     # 步骤1:加载源文件
  5.     workbook = Workbook()
  6.     workbook.LoadFromFile("原始报表.xlsx")
  7.     sheet = workbook.Worksheets[0]
  8.     # 步骤2:执行多种合并
  9.     # 2.1 合并第1行作为大标题
  10.     sheet.Rows[0].Merge()
  11.     sheet.Range["A1"].Value = "全国门店销售总览"
  12.     # 2.2 合并B列作为区域分类
  13.     sheet.Columns[1].Merge()
  14.     sheet.Range["B1"].Value = "大区"
  15.     # 2.3 合并 D2:E4 区域作为备注说明
  16.     sheet.Range["D2:E4"].Merge()
  17.     sheet.Range["D2"].Value = "注:数据不含港澳台"
  18.     # 步骤3:保存合并后的文件
  19.     workbook.SaveToFile("合并结果.xlsx", ExcelVersion.Version2013)
  20.     workbook.Dispose()
  21.     # 步骤4:演示取消合并(重新加载)
  22.     workbook2 = Workbook()
  23.     workbook2.LoadFromFile("合并结果.xlsx")
  24.     sheet2 = workbook2.Worksheets[0]
  25.     # 取消合并 D2:E4 区域
  26.     sheet2.Range["D2"].UnMerge()
  27.     # 取消合并第1行
  28.     sheet2.Rows[0].UnMerge()
  29.     workbook2.SaveToFile("取消合并结果.xlsx", ExcelVersion.Version2013)
  30.     workbook2.Dispose()
  31. if __name__ == "__main__":
  32.     merge_demo()
复制代码

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

七、常见注意事项

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-1 13:55 , Processed in 0.019904 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部