如何在Pandas中筛选Excel特定颜色单元格(含StyleFrame不支持的颜色)
解决Excel特定颜色单元格筛选问题
先确认目标颜色的正确十六进制代码
首先需要准确获取你要筛选的蓝色单元格的实际RGB十六进制值,因为Excel的自定义颜色/主题色可能和StyleFrame utils里的基础色不匹配。可以用openpyxl先读取一个目标单元格的颜色:
from openpyxl import load_workbook wb = load_workbook('TimeTable, FSC, Fall-2022.xlsx') ws = wb['Monday'] # 替换成你实际的目标蓝色单元格位置,比如A1 cell = ws['A1'] # 获取填充颜色的RGB值(返回不带#的大写字符串,顺序为RGB) bg_rgb = cell.fill.fgColor.rgb print(f"目标颜色RGB代码: {bg_rgb}")
运行后得到的字符串就是你需要匹配的准确颜色值,例如蓝色可能是FF0000FF。
方法一:用openpyxl直接筛选并收集单元格信息
这种方法不依赖StyleFrame,直接操作Excel底层,兼容性更强:
from openpyxl import load_workbook import pandas as pd def get_colored_cells(file_path, sheet_name, target_rgb): wb = load_workbook(file_path, data_only=True) ws = wb[sheet_name] # 存储结果:值、行号、列名 result = [] for row in ws.iter_rows(): for cell in row: # 检查单元格填充颜色是否匹配目标值 if cell.fill.fgColor.rgb == target_rgb: col_name = cell.column_letter row_num = cell.row cell_value = cell.value result.append({ '值': cell_value, '行号': row_num, '列名': col_name }) # 转换为DataFrame方便查看和处理 return pd.DataFrame(result) # 替换为你获取的目标RGB代码 target_color = 'FF0000FF' colored_df = get_colored_cells('TimeTable, FSC, Fall-2022.xlsx', 'Monday', target_color) print(colored_df)
方法二:修正StyleFrame的使用方式
如果坚持使用StyleFrame,需要开启原生样式读取,并匹配正确的RGB值:
import numpy as np import pandas as pd from StyleFrame import StyleFrame, utils def find_bs_cs_2021(cell): # 加入你获取的蓝色RGB代码 target_colors = {utils.colors.dark_yellow, 'FFB740', 'FF0000FF'} # use_openpyxl_styles=True时,bg_color返回原生RGB字符串 return cell if cell.style.bg_color in target_colors else np.nan def main(): # 开启use_openpyxl_styles以读取原生Excel颜色代码 sf = StyleFrame.read_excel( 'TimeTable, FSC, Fall-2022.xlsx', sheet_name='Monday', read_style=True, use_openpyxl_styles=True ) # 筛选并清理空行空列 filtered_sf = sf.applymap(find_bs_cs_2021).dropna(how='all').dropna(how='all', axis=1) # 转换为普通DataFrame查看 filtered_df = filtered_sf.to_dataframe() print(filtered_df) # 提取值、索引和列名信息 for idx, row in filtered_df.iterrows(): for col in filtered_df.columns: if pd.notna(row[col]): print(f"值: {row[col]}, 行索引: {idx}, 列名: {col}") if __name__ == "__main__": main()
注意事项
- 确保Excel文件未被其他程序占用,否则会读取失败。
- 如果单元格颜色是条件格式生成的,上述方法无法直接读取,需要额外解析条件格式规则。
内容的提问来源于stack exchange,提问作者Huzaifa Khan
相关产品推荐
相关产品推荐

