You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动