You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用pandas导出Excel时如何保留status列手动备注不被覆盖

实现思路

pandas 没有内置专门用于「导出时保留用户手动修改内容」的专属功能,这个需求可以通过「新旧数据合并」的逻辑实现,核心是用唯一主键(比如任务ID、工单ID这类全局不重复的字段)匹配新旧文件的同一行,将旧文件里手动填写的status列内容合并到新拉取的数据库数据中再导出。


具体实现步骤

  1. 从数据库拉取最新业务数据,生成新的DataFrame记为df_new
  2. 校验本地是否已存在历史导出的Excel报表:
    • 不存在:直接给df_new新增空的status列后导出即可
    • 存在:读取旧报表为df_old,提取旧报表中的主键字段和status列,左连接合并到df_new中
  3. 合并完成后覆盖导出到本地Excel文件

代码示例

import pandas as pd
import os
from datetime import datetime

# 配置项,替换成你实际的字段和路径
EXCEL_SAVE_PATH = "团队任务报表.xlsx"
UNIQUE_PRIMARY_KEY = "任务ID"
STATUS_COL_NAME = "status"

# 1. 拉取数据库最新数据,替换成你自己的读库逻辑
df_new = pd.read_sql("SELECT * FROM 业务任务表", con=你的数据库连接对象)

# 2. 合并历史手动填写的status内容
if os.path.exists(EXCEL_SAVE_PATH):
    df_old = pd.read_excel(EXCEL_SAVE_PATH, usecols=[UNIQUE_PRIMARY_KEY, STATUS_COL_NAME])
    # 左连接保留所有新数据行,匹配对应行的旧备注
    df_new = df_new.merge(df_old, on=UNIQUE_PRIMARY_KEY, how="left")
else:
    # 首次运行初始化空status列
    df_new[STATUS_COL_NAME] = ""

# 可选:如果需要程序自动追加系统状态备注,适配你给出的status格式,可以加这段逻辑
def append_status_note(old_content, new_note):
    current_date = datetime.now().strftime("%d/%m/%Y")
    new_line = f"| {current_date}- {new_note}\n|\n"
    if pd.isna(old_content) or not old_content.strip():
        return new_line
    return old_content.rstrip() + "\n" + new_line

# 示例:给所有已完成的任务追加系统备注
df_new.loc[df_new["任务状态"] == "已完成", STATUS_COL_NAME] = df_new.loc[df_new["任务状态"] == "已完成", STATUS_COL_NAME].apply(lambda x: append_status_note(x, "任务已完成"))

# 3. 导出最终报表
df_new.to_excel(EXCEL_SAVE_PATH, index=False)

注意事项

  • 主键必须是全局唯一且不会变更的字段,否则会出现备注匹配错误
  • 单元格内的换行格式不需要额外处理,pandas会自动保留,Excel中开启「自动换行」即可正常显示你给出的分段备注格式
  • 如果旧报表中存在已经被数据库删除的无效行,合并后会自动丢弃,符合数据同步的需求

内容的提问来源于stack exchange,提问作者ohadHa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:30:04