首页 > 自考资讯 > 培训提升

Python自动化汇总多人填写的Excel表格并标记差异

2026 08 20 13:55:12

汇总团队数据时,是不是总在反复接收文件→复制粘贴→比对差异的循环中?比如10个部门分别填写的“月度计划.xlsx”,手动汇总到总表要逐行核对,数字不一致还要逐个找原因,2小时都未必能搞定。在掌握了文件安全处理后,我们可以聚焦团队协作痛点——用Python自动合并多人填写的Excel,标记不同版本的差异内容,让数据汇总既快又准,减少协作摩擦!

必备库安装教程

bash

# 核心Excel处理库(高效读取和写入)

pip install pandas openpyxl

# 标记Excel单元格差异(高亮显示)

pip install xlsxwriter # 用于设置单元格格式


1. 代码拆解

python

import os

import pandas as pd

from xlsxwriter.utility import xl_rowcol_to_cell

import numpy as np


# 步骤1:配置汇总参数

INPUT_FOLDER = "各部门计划" # 存放多人填写的Excel文件夹

TEMPLATE_COLUMNS = ["部门", "项目", "计划金额(元)", "负责人", "截止日期"] # 统一列名(确保所有人表格结构一致)

OUTPUT_FILE = "月度计划汇总表.xlsx" # 汇总结果文件

REFERENCE_SHEET = "参考版本" # 作为基准的版本(如上次汇总表)

HIGHLIGHT_COLOR = "#FFEB9C" # 差异单元格高亮颜色(浅黄色)


# 步骤2:读取所有待汇总的Excel文件

def read_all_excels():

all_data = []

for file in os.listdir(INPUT_FOLDER):

if file.lower().endswith(".xlsx") and not file.startswith("~#34;):

file_path = os.path.join(INPUT_FOLDER, file)

try:

# 读取表格,只保留指定列(避免额外列干扰)

df = pd.read_excel(file_path, usecols=TEMPLATE_COLUMNS)

# 添加“来源文件”列,方便追溯

df["来源文件"] = file

all_data.append(df)

print(f"已读取:{file},共{len(df)}行数据")

except Exception as e:

print(f"读取失败 {file}:{e}")

if not all_data:

print("未找到有效Excel文件,终止汇总")

return None

# 合并所有数据

merged_df = pd.concat(all_data, ignore_index=True)

return merged_df


# 步骤3:标记与参考版本的差异

def mark_differences(merged_df):

# 检查是否有参考版本

if not os.path.exists(REFERENCE_SHEET + ".xlsx"):

print("无参考版本,直接保存汇总结果")

return merged_df, None

# 读取参考版本数据

ref_df = pd.read_excel(f"{REFERENCE_SHEET}.xlsx")

# 找到用于比对的唯一标识列(如“部门+项目”组合)

key_columns = ["部门", "项目"]

# 合并汇总表和参考表,标记差异

merged_with_ref = pd.merge(

merged_df, ref_df,

on=key_columns,

how="outer",

suffixes=("_当前", "_参考"),

indicator=True

)

# 记录差异位置(行号和列名)

differences = []

for idx, row in merged_with_ref.iterrows():

for col in TEMPLATE_COLUMNS:

if col in ["部门", "项目"]: # 标识列不比对

continue

current_val = row.get(f"{col}_当前")

ref_val = row.get(f"{col}_参考")

# 排除空值导致的差异(如新增行)

if pd.notna(current_val) and pd.notna(ref_val) and current_val != ref_val:

# 转换为汇总表中的实际行号(merged_df中的位置)

merged_idx = merged_df[(merged_df["部门"] == row["部门"]) & (merged_df["项目"] == row["项目"])].index

if not merged_idx.empty:

differences.append((merged_idx[0] + 2, col)) # +2是因为Excel表头占1行,索引从1开始

return merged_df, differences


# 步骤4:保存汇总表并高亮差异

def save_with_highlight(merged_df, differences):

# 创建Excel写入器,支持格式设置

writer = pd.ExcelWriter(OUTPUT_FILE, engine="xlsxwriter")

merged_df.to_excel(writer, sheet_name="汇总", index=False)

workbook = writer.book

worksheet = writer.sheets["汇总"]

# 定义高亮格式

highlight_format = workbook.add_format({"bg_color": HIGHLIGHT_COLOR})

# 高亮差异单元格

if differences:

# 获取列名对应的Excel列号(如A、B、C...)

col_names = merged_df.columns.tolist()

for row, col_name in differences:

col_idx = col_names.index(col_name)

# 写入高亮格式(行号从1开始,列号从0开始)

worksheet.write(row, col_idx, merged_df.iloc[row-2][col_name], highlight_format)

print(f"已标记{len(differences)}处差异,用{HIGHLIGHT_COLOR}颜色高亮")

writer.close()

print(f"汇总完成!结果保存至:{OUTPUT_FILE}")

# 将当前汇总表设为下次的参考版本

merged_df.to_excel(f"{REFERENCE_SHEET}.xlsx", index=False)


# 主函数:串联汇总流程

def main():

# 读取所有数据

merged_df = read_all_excels()

if merged_df is None:

return

# 标记差异

merged_df, differences = mark_differences(merged_df)

# 保存并高亮

save_with_highlight(merged_df, differences)


if __name__ == "__main__":

main()


代码逻辑聚焦团队协作中的数据汇总:先读取“各部门计划”文件夹中所有人填写的Excel,按统一列名合并成总表;再与“参考版本”(如上期汇总表)比对,标记“计划金额”“截止日期”等字段的差异;最后将汇总表保存为Excel,并用浅黄色高亮显示差异单元格,同时记录数据来源文件方便追溯。相比手动汇总,代码自动处理重复劳动,差异标记清晰,减少协作中的沟通成本。

2. 场景应用

- 场景:运营汇总10个区域的“活动计划.xlsx”,自动合并后发现“华东区-线下活动”的计划金额从5万改成了8万,单元格被高亮,直接联系对应区域确认原因,比逐行比对节省1.5小时;

- 场景:HR汇总各部门的“招聘需求表”,合并后标记出“技术部-前端岗位”的截止日期从6月改成7月,快速定位变动内容,无需重新核对所有部门数据;

- 场景:学生小组汇总“项目分工表”,自动合并后高亮显示“数据分析”任务的负责人从张三换成李四,方便组长确认变动是否合理。

3. 避坑指南

- 列名不一致:若有人表格的列名和 TEMPLATE_COLUMNS 不符(如“负责人”写成“对接人”),会导致读取失败,需提前统一模板格式,或在代码中添加列名映射(如 {"对接人": "负责人"} );

- 唯一标识缺失:如果“部门+项目”不能唯一区分行(如同一部门有两个同名项目),差异标记会出错,需增加标识列(如“项目ID”);

- 空值误判:新增行在参考版本中为空,代码已通过 pd.notna 排除这类“假差异”,但需注意:若参考版本中有空值,当前版本填写后会被标记为差异(属于正常情况);

- 格式丢失:合并后的Excel会丢失原文件的复杂格式(如条件格式),若需保留,可改用 openpyxl 库逐单元格复制格式(代码会更复杂)。

进阶协作优化

- 自动通知:差异标记后,通过邮件自动通知对应部门负责人(结合之前的邮件发送功能);

- 版本管理:给每次汇总表添加时间戳(如“20240522_汇总表”),方便回溯历史版本;

- 权限控制:通过代码限制可修改的列(如只允许部门修改“计划金额”,其他列锁定)。

#办公自动化协作篇 #Python汇总Excel #差异标记 #周三团队数据处理


版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除

猜你喜欢