如何在python-docx表格中根据数值设置字体颜色?
解决python-docx表格数值按条件设置字体颜色的问题
修改后的完整代码
from docx import Document from docx.shared import Pt, RGBColor from docx.enum.table import WD_TABLE_ALIGNMENT import pandas as pd # 假设df_opmerkingen是你的目标DataFrame,示例数据可按需替换 # df_opmerkingen = pd.DataFrame({ # 'onderwerp': ['主题1', '主题2', '主题3'], # '1月': [7.5, 8.5, 9.2], # '2月': [9.0, 7.8, 8.8], # # 补充剩余10个月份列... # }) document = Document() table = document.add_table(rows=len(df_opmerkingen) + 1, cols=len(df_opmerkingen.columns)) # +1用于表头行 table.autofit = True table.style = 'Table Grid' # 设置表头 hdr_cells = table.rows[0].cells for col_idx, col_name in enumerate(df_opmerkingen.columns): hdr_cells[col_idx].text = col_name # 统一设置表头字体大小 for paragraph in hdr_cells[col_idx].paragraphs: for run in paragraph.runs: run.font.size = Pt(11) # 填充表格数据并按条件设置字体颜色 for row_idx in range(len(df_opmerkingen)): row_cells = table.rows[row_idx + 1].cells # 跳过表头行 for col_idx in range(len(df_opmerkingen.columns)): cell = row_cells[col_idx] cell.text = "" # 清空单元格原有内容 value = df_opmerkingen.iloc[row_idx, col_idx] # 第一列为主题,直接写入无需颜色判断 if col_idx == 0: run = cell.paragraphs[0].add_run(str(value)) run.font.size = Pt(11) continue # 处理数值列,兼容非数值异常 try: num_value = float(value) run = cell.paragraphs[0].add_run(str(num_value)) run.font.size = Pt(11) # 按数值区间设置字体颜色 if num_value < 8: run.font.color.rgb = RGBColor(255, 0, 0) # 红色 elif 8 < num_value < 9: run.font.color.rgb = RGBColor(255, 165, 0) # 橙色 else: # >=9 run.font.color.rgb = RGBColor(0, 128, 0) # 绿色 except ValueError: # 非数值内容默认黑色字体 run = cell.paragraphs[0].add_run(str(value)) run.font.size = Pt(11) # 表格居中对齐 table.alignment = WD_TABLE_ALIGNMENT.CENTER # 保存文档 document.save('result.docx')
关键修改说明
- 保留数值类型用于判断:不再提前将所有值转为字符串,而是先获取原始值,通过
try-except确保数值判断的有效性,同时兼容非数值异常数据。 - 针对性处理列:通过
col_idx == 0跳过第一列(主题列),仅对月份列应用颜色规则。 - 直接操作Run对象:清空单元格后通过
add_run()添加文本并设置样式,避免覆盖原有格式设置。 - 精准控制颜色:使用
RGBColor定义红、橙、绿三种颜色,比内置颜色选项更灵活准确。
排查要点
- 若数值判断失效,先检查DataFrame月份列的数据类型:用
df_opmerkingen.dtypes查看,若为object类型,可通过pd.to_numeric(df_opmerkingen.iloc[:,1:], errors='coerce')转换为数值型。 - 确保
python-docx为最新版本:旧版本可能存在样式兼容问题,执行pip install --upgrade python-docx升级。
内容的提问来源于stack exchange,提问作者JanP




