Python使用pandas导出Excel时如何保留status列手动备注不被覆盖
实现思路
pandas 没有内置专门用于「导出时保留用户手动修改内容」的专属功能,这个需求可以通过「新旧数据合并」的逻辑实现,核心是用唯一主键(比如任务ID、工单ID这类全局不重复的字段)匹配新旧文件的同一行,将旧文件里手动填写的status列内容合并到新拉取的数据库数据中再导出。
具体实现步骤
- 从数据库拉取最新业务数据,生成新的DataFrame记为
df_new - 校验本地是否已存在历史导出的Excel报表:
- 不存在:直接给
df_new新增空的status列后导出即可 - 存在:读取旧报表为
df_old,提取旧报表中的主键字段和status列,左连接合并到df_new中
- 不存在:直接给
- 合并完成后覆盖导出到本地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
相关产品推荐
相关产品推荐

