
本文介绍使用 openpyxl 准确获取 excel(.xlsx)中合并单元格背景色的方法,解决因合并区域导致颜色信息丢失或错位的问题,无需依赖填充(bfill)等后处理手段。
本文介绍使用 openpyxl 准确获取 excel(.xlsx)中合并单元格背景色的方法,解决因合并区域导致颜色信息丢失或错位的问题,无需依赖填充(bfill)等后处理手段。
在处理 Excel 文件样式信息(如背景色)时,一个常见但易被忽视的陷阱是:合并单元格(merged cells)的格式仅存储在合并区域的起始单元格(start_cell)中,其余单元格在 openpyxl 中返回的是默认/空样式。因此,若直接遍历每个坐标取 cell.fill.start_color.index,合并区域内的非起始单元格将返回错误或默认值(如 '00000000' 或 'FFFFFFFF'),导致颜色矩阵出现断层——正如问题截图中第 4 行颜色不一致所示。
要鲁棒地还原用户在 Excel 中实际看到的背景色分布,核心思路是:对每个目标单元格(i, j),先检查其是否属于任意一个已定义的合并区域;若是,则取该合并区域起始单元格的填充色;否则,取自身单元格的填充色。
以下是完整、可直接运行的解决方案(基于 openpyxl>=3.0):
from openpyxl import load_workbook
import numpy as np
import pandas as pd
def get_background_colors(excel_file: str) -> pd.DataFrame:
wb = load_workbook(excel_file, data_only=False) # ⚠️ 注意:data_only=False 才能读取样式
sh = wb[wb.sheetnames[0]]
rows, cols = sh.max_row, sh.max_column
color_matrix = np.empty((rows, cols), dtype=object)
for i in range(1, rows + 1):
for j in range(1, cols + 1):
target_cell = None
# 检查是否位于某个合并区域内
for mcr in sh.merged_cells.ranges: # ✅ 推荐用 .ranges(新版 openpyxl)
if mcr.min_row <= i <= mcr.max_row and mcr.min_col <= j <= mcr.max_col:
target_cell = sh.cell(row=mcr.min_row, column=mcr.min_col)
break
# 若未匹配到合并区域,使用原始单元格
if target_cell is None:
target_cell = sh.cell(row=i, column=j)
# 提取背景色(支持主题色、RGB、自动色等)
fill = target_cell.fill
if fill and fill.start_color and hasattr(fill.start_color, 'rgb'):
color_matrix[i-1, j-1] = fill.start_color.rgb
else:
color_matrix[i-1, j-1] = "None" # 或设为透明/默认色
return pd.DataFrame(color_matrix)
# 使用示例
df_colors = get_background_colors("example.xlsx")
print(df_colors)✅ 关键要点说明:
- data_only=False 是必须的(默认即为 False),否则样式信息无法加载;
- sh.merged_cells.ranges 返回 CellRange 对象列表,比旧版 sh.merged_cells 更清晰可靠;
- 合并区域的起始单元格始终是 min_row, min_col,其 fill 属性承载全部格式信息;
- fill.start_color.rgb 返回标准 8 位十六进制字符串(如 'FF4477AA'),兼容性优于 .index(后者可能返回主题索引如 '1',需额外映射);
- 无需手动 bfill 或 ffill,逻辑本身保证每行/列的颜色连续性与视觉一致。
⚠️ 注意事项:
- 此方法不适用于 .xls(Excel 97-2003)格式,仅支持 .xlsx/.xlsm;
- 若工作表含条件格式(Conditional Formatting),其动态背景色无法通过此方式获取(openpyxl 不解析条件规则);
- 多级嵌套合并(Excel 不支持)或跨工作表合并不存在,无需额外处理。
通过该方案,你将获得与 Excel 界面完全一致的背景色矩阵,为后续样式分析、自动化报表校验或可视化渲染提供可靠数据基础。


















