必须用 openpyxl 读取合并单元格原始位置信息,通过 worksheet.merged_cells.ranges 获取每个合并区域的 min_row、max_row、min_col、max_col;注意行列索引从1开始,需手动映射到二维矩阵并传播值与样式。

用 openpyxl 读取合并单元格的原始位置信息
直接用 pandas.read_excel() 会自动“展开”合并单元格,丢失结构——它只返回填充后的值,不告诉你哪几行哪几列原本是合并的。必须换回 openpyxl 这类底层库。
关键不是读值,而是读 worksheet.merged_cells.ranges,它返回一个 MergedCellRange 对象列表,每个对象含 min_row、max_row、min_col、max_col 四个属性。
实操建议:
- 打开工作簿时务必用
read_only=False(默认即可),data_only=False,否则合并信息会被丢弃 - 遍历
merged_cells.ranges前,先调用worksheet._clean_merged_cells()(私有方法,但稳定可用)避免缓存残留 - 注意:行列索引从 1 开始(不是 0),
cell(row=1, column=1)才是 A1
把合并信息映射回二维数据矩阵
你拿到的是一堆矩形坐标,但最终要生成类似 pandas DataFrame 的结构,就得把“合并关系”转成每个单元格的归属标识(比如用左上角坐标作为该块所有单元格的“锚点”)。
常见错误是直接覆盖值——比如合并单元格 A1:C2,只在 (1,1) 写值,其余 (1,2)(1,3)(2,1)(2,2)(2,3) 留空,导致后续解析误判为空单元格。
实操建议:
- 初始化一个二维 list 或 numpy array,尺寸为
worksheet.max_row × worksheet.max_column - 先填入所有非合并单元格的值(
cell.value) - 再遍历每个
MergedCellRange,用worksheet.cell(min_row, min_col).value覆盖该矩形区域内所有位置 - 若需保留“是否为合并起始单元格”的元信息,额外维护一个布尔矩阵,标记
(min_row, min_col)为 True
处理跨页/嵌套合并与样式继承问题
Excel 允许合并单元格跨打印区域分页,也允许在已合并区域内部再合并(虽然 UI 不鼓励)。openpyxl 本身不校验嵌套,merged_cells.ranges 可能包含重叠区间——这不是 bug,是 Excel 文件的真实状态。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
更隐蔽的问题是:合并单元格的字体、对齐方式等样式,只保存在左上角单元格,其余位置无样式对象。如果你依赖 cell.font 或 cell.alignment,不主动传播就会丢失格式。
实操建议:
- 对重叠的合并范围,按添加顺序倒序处理(后加的优先级高),或用
shapely做矩形交并判断,剔除被完全覆盖的小范围 - 提取样式时,对每个单元格先查自身是否有样式;若无,向上/向左搜索最近的、有样式的非合并单元格(注意跳过其他合并区域)
-
alignment.horizontal和vertical值可能为None,需 fallback 到'general'或'center',否则序列化时报错
导出带合并结构的 HTML 或 Markdown 表格
还原合并的关键是生成正确的 很多工具(如 实操建议: 最易被忽略的是:合并单元格的边框线可能只画在部分边界上(比如只画了顶部和右侧),而 rowspan 和 colspan 属性。但要注意:HTML 表格中,rowspan="2" 表示“占两行”,但第二行对应列必须留空(不能重复写 ),否则渲染错乱。 tabulate)根本不支持 colspan/rowspan,硬塞进去只会破坏结构。xml.etree.ElementTree 构建 ,动态设置
elem.set('rowspan', '3') 更安全rowspan = max_row - min_row + 1,colspan = max_col - min_col + 1,仅当 min_row == 当前行号 and min_col == 当前列号 时才输出
)是唯一可靠方式,但需确认目标渲染器支持xxx openpyxl 的 border 属性是 per-cell 的,不会自动合成“视觉外框”。如果需要精确还原打印效果,得手动合并相邻单元格的 border 样式位(top、bottom、left、right)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










