如何在Pandas中基于其他单元格值格式化Excel单元格样式与内容?
问题修复方案
你的代码存在几个关键问题:
- 仅定义了样式但未将其应用到实际写入Excel的流程中,
df3.style.apply的结果没有被使用 - 未修改
Status列的内容为RED - 样式的作用目标是
BCQA (F)列,而非需求中的Status列
以下是修复后的完整代码:
from openpyxl import load_workbook from openpyxl.styles import PatternFill from openpyxl.utils.dataframe import dataframe_to_rows # 1. 先修改DataFrame的Status列内容 df3['Status'] = df3.apply(lambda row: 'RED' if row['BCQA (F)'] == 'NO DATES' else row['Status'], axis=1) # 2. 加载工作簿并创建新工作表 wb = load_workbook('Swap status.xlsx') ws = wb.create_sheet("ST_291123") # 3. 将DataFrame数据写入工作表 for r in dataframe_to_rows(df3, index=False, header=True): ws.append(r) # 4. 定义红色填充样式 red_fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid') # 5. 遍历行,设置Status列的背景色 # 获取Status列的列号(表头在第1行) status_col = None bcqa_col = None # 先遍历表头找到两列的位置 for col in ws.iter_cols(min_row=1, max_row=1): cell = col[0] if cell.value == 'Status': status_col = cell.column_letter elif cell.value == 'BCQA (F)': bcqa_col = cell.column_letter # 从第2行开始遍历数据行 for row_num in range(2, ws.max_row + 1): bcqa_value = ws[f"{bcqa_col}{row_num}"].value if bcqa_value == 'NO DATES': ws[f"{status_col}{row_num}"].fill = red_fill # 6. 保存工作簿 wb.save('Swap status.xlsx')
关键说明:
- 先通过
apply修改Status列的内容,满足"内容改为RED"的需求 - 使用
openpyxl的PatternFill来设置单元格背景色,适配在已加载工作簿中修改格式的场景 - 先写入所有数据,再通过表头定位列位置,遍历行判断并设置样式,确保逻辑准确
- 列位置通过表头查找,避免硬编码列号导致的适配问题
内容的提问来源于stack exchange,提问作者syed
相关产品推荐
相关产品推荐

