如何准确获取XLSX合并单元格背景色(无需bfill或合并信息)
提取XLSX合并单元格背景色的解决方案
问题分析
你遇到的问题本质是:Excel的合并单元格仅在左上角主单元格中存储样式信息,其余合并单元格本身没有独立的样式数据,所以openpyxl、StyleFrame这类直接解析XLSX文件结构的库,只能读取到主单元格的颜色,其余合并单元格会返回默认值(比如00000000)。
无需依赖合并单元格信息的解决方案
使用xlwings库,它直接与Excel应用交互,能获取单元格实际显示的背景色(不管是否为合并单元格),不需要提前处理合并单元格数据,也不用bfill这类填充操作。
步骤1:安装xlwings
pip install xlwings
步骤2:提取背景色代码示例
import xlwings as xw import pandas as pd # 打开Excel文件(后台运行,不显示界面) with xw.App(visible=False) as app: wb = xw.Book(excel_file) sh = wb.sheets[0] # 获取最大行列数 rows = sh.used_range.last_cell.row cols = sh.used_range.last_cell.column # 初始化存储颜色的列表 bckg_color = [] for row in range(1, rows+1): row_colors = [] for col in range(1, cols+1): # 获取单元格显示的背景色(十六进制) color_hex = sh.range(row, col).color # 转换为Excel样式的十六进制格式(去掉#,转为大写) color_hex = color_hex[1:].upper() if color_hex else "FFFFFF" row_colors.append(color_hex) bckg_color.append(row_colors) # 转为DataFrame color_df = pd.DataFrame(bckg_color) print(color_df)
方案说明
xlwings通过调用本地Excel应用,直接读取单元格的显示样式,所以合并单元格的所有位置都会返回实际显示的背景色,完全匹配你想要的结果。- 设置
visible=False可让Excel在后台运行,不会弹出界面干扰操作。 - 注意:该方案依赖本地安装的Excel应用,若系统未安装Excel则无法使用。
原方法失效原因
- openpyxl直接解析XLSX的XML结构,合并单元格的子单元格没有
fill属性,因此cell.fill.start_color.index会返回默认的透明色值。 - StyleFrame基于openpyxl实现,自然也存在相同的局限性。
内容的提问来源于stack exchange,提问作者Андрей Шевцов
相关产品推荐
相关产品推荐

