把日报、表格和通知串起来:一套可直接上手的办公自动化流程源码
AI办公 工作流自动化教程|附源码
在日常办公中,很多工作并不复杂,却非常耗时:整理邮件、汇总表格、生成日报、同步待办、提取文档重点、把会议纪要发送到群里……这些任务往往具有一个共同特点:规则相对固定、重复频率高、人工处理价值低。
随着大模型、API、自动化工具的发展,我们已经可以用较低成本搭建一套属于自己的 AI 办公自动化工作流。本文将从实际办公场景出发,介绍如何设计 AI 工作流,并提供一套可运行的 Python 示例源码,帮助你完成从“手动办公”到“自动化办公”的升级。
一、什么是 AI 办公工作流自动化?
AI 办公工作流自动化,是指将办公中的多个步骤串联起来,通过程序、自动化平台或 AI 模型自动完成任务。
例如,传统流程可能是:
- 打开邮箱;
- 阅读客户邮件;
- 复制关键信息;
- 打开 Excel;
- 填写客户需求;
- 手动总结;
- 发给同事或保存到日报。
而自动化之后,可以变成:
- 程序自动读取邮件;
- AI 自动提取客户姓名、需求、预算、截止时间;
- 自动写入 Excel 或数据库;
- 自动生成摘要;
- 自动发送到企业微信、钉钉或飞书。
这就是 AI 工作流自动化的价值:减少重复劳动,提高信息处理效率,让人把时间花在判断和决策上。
二、适合自动化的办公场景
并不是所有办公任务都适合自动化。一般来说,以下类型的任务非常适合引入 AI 工作流。
1. 文档总结类
例如:
- 会议纪要总结;
- 长文档提炼重点;
- 合同条款初步归纳;
- 项目报告生成摘要;
- 客户邮件意图识别。
这类任务可以借助大模型完成信息压缩和结构化输出。
2. 表格处理类
例如:
- Excel 数据清洗;
- 销售日报汇总;
- 财务数据分类;
- 客户名单去重;
- 根据表格生成分析报告。
这类任务适合用 Python 的 pandas 配合 AI 完成。
3. 消息通知类
例如:
- 每天定时发送工作日报;
- 销售线索自动推送;
- 任务即将超期提醒;
- 系统异常自动通知负责人。
这类任务可以结合定时任务和 Webhook 实现。
4. 内容生成类
例如:
- 自动生成周报;
- 根据关键词生成文章大纲;
- 根据会议记录生成行动项;
- 根据客户需求生成回复邮件。
这类任务非常适合使用 AI 模型辅助完成。
三、本文要实现的自动化工作流
本文将实现一个简单但实用的 AI 办公工作流:
读取 Excel 中的任务数据 → 调用 AI 生成每条任务摘要和建议 → 生成日报 Markdown 文件 → 可选发送到企业微信机器人。
这个工作流非常适合用于:
- 项目管理日报;
- 销售线索跟进;
- 客服工单总结;
- 团队任务进度汇报;
- 运营数据简报。
四、工作流整体架构
整个流程可以拆成以下几个模块:
Excel任务数据
↓
Python读取表格
↓
AI分析任务内容
↓
生成结构化结果
↓
输出日报Markdown
↓
发送通知(可选)
在实际企业办公中,你可以把 Excel 换成数据库、飞书表格、Notion、Airtable 或 CRM 系统;也可以把输出日报换成邮件、钉钉消息、企业微信消息或自动创建文档。
五、准备工作
1. 安装 Python
建议使用 Python 3.9 及以上版本。
可以在终端执行:
python --version
如果没有安装,可以前往 Python 官网下载安装。
2. 安装依赖库
本文示例会用到以下库:
pip install pandas openpyxl requests python-dotenv
各库作用如下:
| 库名 | 作用 |
|---|---|
| pandas | 读取和处理 Excel 数据 |
| openpyxl | 支持 Excel 文件解析 |
| requests | 调用 API 和发送 Webhook |
| python-dotenv | 读取环境变量配置 |
3. 准备项目目录
创建一个项目文件夹,例如:
ai-office-workflow/
├── main.py
├── config.py
├── ai_client.py
├── report_generator.py
├── notifier.py
├── tasks.xlsx
├── .env
└── output/
其中:
main.py:主程序入口;config.py:配置读取;ai_client.py:AI 接口调用;report_generator.py:日报生成;notifier.py:消息通知;tasks.xlsx:任务数据源;.env:保存密钥和 Webhook;output/:保存生成的日报文件。
六、准备 Excel 数据
创建一个名为 tasks.xlsx 的 Excel 文件,内容如下:
| 任务ID | 负责人 | 项目 | 任务描述 | 当前状态 | 截止日期 |
|---|---|---|---|---|---|
| T001 | 张三 | 官网改版 | 完成首页视觉设计并确认交互方案 | 进行中 | 2025-01-10 |
| T002 | 李四 | 客户跟进 | 跟进A客户报价反馈,确认预算和采购周期 | 待处理 | 2025-01-08 |
| T003 | 王五 | 数据分析 | 分析上周用户注册数据并输出增长建议 | 已完成 | 2025-01-06 |
| T004 | 赵六 | 内容运营 | 准备下周公众号选题和活动文案 | 进行中 | 2025-01-12 |
实际使用时,你可以根据自己的业务调整字段,例如增加优先级、部门、客户名称、金额等。
七、配置环境变量
创建 .env 文件:
AI_API_KEY=your_api_key_here
AI_API_URL=https://api.example.com/v1/chat/completions
WECHAT_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key_here
说明:
AI_API_KEY:你的 AI 模型 API Key;AI_API_URL:AI 接口地址;WECHAT_WEBHOOK:企业微信机器人 Webhook,如果不需要发送通知,可以留空。
注意:不要把
.env文件上传到公开代码仓库,因为里面通常包含密钥。
八、源码实现
下面开始编写完整代码。
1. 配置文件:config.py
import os
from dotenv import load_dotenv
load_dotenv()
AI_API_KEY = os.getenv("AI_API_KEY", "")
AI_API_URL = os.getenv("AI_API_URL", "")
WECHAT_WEBHOOK = os.getenv("WECHAT_WEBHOOK", "")
TASK_FILE = "tasks.xlsx"
OUTPUT_DIR = "output"
这个文件负责从 .env 中读取配置,避免把密钥直接写在代码里。
2. AI 调用模块:ai_client.py
import requests
from config import AI_API_KEY, AI_API_URL
def analyze_task_with_ai(task: dict) -> dict:
"""
调用 AI 分析单条任务,返回摘要、风险和建议。
"""
if not AI_API_KEY or not AI_API_URL:
return mock_ai_response(task)
prompt = f"""
你是一名专业的项目管理助手,请根据以下任务信息生成分析结果。
任务ID:{task.get("任务ID")}
负责人:{task.get("负责人")}
项目:{task.get("项目")}
任务描述:{task.get("任务描述")}
当前状态:{task.get("当前状态")}
截止日期:{task.get("截止日期")}
请用 JSON 格式输出,字段包括:
summary:一句话任务摘要;
risk:当前可能存在的风险;
suggestion:下一步行动建议。
要求:
1. 输出必须是 JSON;
2. 不要输出多余解释;
3. 内容简洁、清晰、适合日报使用。
"""
headers = {
"Authorization": f"Bearer {AI_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"content": "你是一个擅长办公自动化和项目管理分析的AI助手。"
},
{
"role": "user",
"content": prompt
}
],
"temperature": 0.3
}
try:
response = requests.post(
AI_API_URL,
headers=headers,
json=payload,
timeout=30
)
response.raise_for_status()
data = response.json()
content = data["choices"][0]["message"]["content"]
return parse_ai_json(content)
except Exception as e:
print(f"AI调用失败,使用模拟结果。错误信息:{e}")
return mock_ai_response(task)
def parse_ai_json(content: str) -> dict:
"""
简单解析 AI 返回内容。
实际项目中建议增加更严格的 JSON 解析和异常处理。
"""
import json
import re
try:
return json.loads(content)
except Exception:
match = re.search(r"\{.*\}", content, re.S)
if match:
try:
return json.loads(match.group())
except Exception:
pass
return {
"summary": "AI返回结果解析失败",
"risk": "无法识别风险",
"suggestion": "建议人工检查该任务"
}
def mock_ai_response(task: dict) -> dict:
"""
当未配置 AI Key 时,返回模拟分析结果,方便本地测试。
"""
status = task.get("当前状态", "")
desc = task.get("任务描述", "")
if status == "已完成":
risk = "暂无明显风险"
suggestion = "建议整理产出物并同步相关成员"
elif status == "待处理":
risk = "任务尚未启动,可能影响交付节奏"
suggestion = "建议负责人尽快确认优先级并启动处理"
else:
risk = "需关注任务进度是否符合截止日期要求"
suggestion = "建议每日同步进展,及时暴露阻塞点"
return {
"summary": f"{task.get('负责人')}负责的任务:{desc}",
"risk": risk,
"suggestion": suggestion
}
这个模块做了三件事:
- 构造 Prompt;
- 调用 AI API;
- 解析 AI 输出。
为了方便本地测试,代码中增加了 mock_ai_response。如果你没有配置 API Key,也能看到完整流程效果。
3. 日报生成模块:report_generator.py
import os
from datetime import datetime
from config import OUTPUT_DIR
def generate_markdown_report(tasks: list) -> str:
"""
根据任务分析结果生成 Markdown 日报。
"""
today = datetime.now().strftime("%Y-%m-%d")
lines = []
lines.append(f"# AI自动生成工作日报({today})")
lines.append("")
lines.append("## 一、今日任务概览")
lines.append("")
lines.append(f"- 任务总数:{len(tasks)}")
lines.append(f"- 已完成:{count_by_status(tasks, '已完成')}")
lines.append(f"- 进行中:{count_by_status(tasks, '进行中')}")
lines.append(f"- 待处理:{count_by_status(tasks, '待处理')}")
lines.append("")
lines.append("## 二、任务明细")
lines.append("")
for item in tasks:
lines.append(f"### {item.get('任务ID')}|{item.get('项目')}")
lines.append("")
lines.append(f"- 负责人:{item.get('负责人')}")
lines.append(f"- 当前状态:{item.get('当前状态')}")
lines.append(f"- 截止日期:{item.get('截止日期')}")
lines.append(f"- 任务描述:{item.get('任务描述')}")
lines.append(f"- AI摘要:{item.get('summary')}")
lines.append(f"- 风险判断:{item.get('risk')}")
lines.append(f"- 行动建议:{item.get('suggestion')}")
lines.append("")
lines.append("## 三、AI综合建议")
lines.append("")
lines.append(generate_overall_suggestion(tasks))
lines.append("")
lines.append("---")
lines.append("")
lines.append("本日报由 AI 办公自动化工作流自动生成。")
return "\n".join(lines)
def count_by_status(tasks: list, status: str) -> int:
return sum(1 for task in tasks if task.get("当前状态") == status)
def generate_overall_suggestion(tasks: list) -> str:
pending = count_by_status(tasks, "待处理")
doing = count_by_status(tasks, "进行中")
suggestions = []
if pending > 0:
suggestions.append(f"- 当前有 {pending} 项任务仍处于待处理状态,建议尽快明确负责人和启动时间。")
if doing > 0:
suggestions.append(f"- 当前有 {doing} 项任务正在进行中,建议关注截止日期并及时同步阻塞问题。")
if not suggestions:
suggestions.append("- 当前任务整体进展良好,建议持续跟踪交付质量和结果复盘。")
return "\n".join(suggestions)
def save_report(content: str) -> str:
"""
保存日报文件。
"""
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
filename = datetime.now().strftime("daily_report_%Y%m%d.md")
filepath = os.path.join(OUTPUT_DIR, filename)
with open(filepath, "w", encoding="utf-8") as f:
f.write(content)
return filepath
这个模块负责生成 Markdown 日报。Markdown 的好处是格式清晰,可以直接复制到飞书文档、Notion、语雀、企业微信或邮件中。
4. 通知模块:notifier.py
import requests
from config import WECHAT_WEBHOOK
def send_wechat_markdown(content: str):
"""
通过企业微信机器人发送 Markdown 消息。
"""
if not WECHAT_WEBHOOK:
print("未配置企业微信 Webhook,跳过消息发送。")
return
max_length = 3500
if len(content) > max_length:
content = content[:max_length] + "\n\n内容过长,已截断,请查看完整日报文件。"
payload = {
"msgtype": "markdown",
"markdown": {
"content": content
}
}
try:
response = requests.post(
WECHAT_WEBHOOK,
json=payload,
timeout=10
)
response.raise_for_status()
print("企业微信消息发送成功。")
except Exception as e:
print(f"企业微信消息发送失败:{e}")
这个模块用于把日报发送到企业微信群机器人。很多团队每天都需要发日报,如果将其自动化,可以减少大量重复操作。
5. 主程序入口:main.py
import pandas as pd
from config import TASK_FILE
from ai_client import analyze_task_with_ai
from report_generator import generate_markdown_report, save_report
from notifier import send_wechat_markdown
def load_tasks_from_excel(filepath: str) -> list:
"""
从 Excel 读取任务数据。
"""
df = pd.read_excel(filepath)
required_columns = ["任务ID", "负责人", "项目", "任务描述", "当前状态", "截止日期"]
for column in required_columns:
if column not in df.columns:
raise ValueError(f"Excel 缺少必要字段:{column}")
df = df.fillna("")
return df.to_dict(orient="records")
def main():
print("开始读取任务数据...")
tasks = load_tasks_from_excel(TASK_FILE)
analyzed_tasks = []
print("开始调用 AI 分析任务...")
for task in tasks:
ai_result = analyze_task_with_ai(task)
task.update(ai_result)
analyzed_tasks.append(task)
print("开始生成日报...")
report = generate_markdown_report(analyzed_tasks)
filepath = save_report(report)
print(f"日报已生成:{filepath}")
print("开始发送通知...")
send_wechat_markdown(report)
print("工作流执行完成。")
if __name__ == "__main__":
main()
运行主程序:
python main.py
如果执行成功,你将在 output 目录下看到生成的日报文件,例如:
output/daily_report_20250106.md
九、生成效果示例
生成的日报大致如下:
# AI自动生成工作日报(2025-01-06)
## 一、今日任务概览
- 任务总数:4
- 已完成:1
- 进行中:2
- 待处理:1
## 二、任务明细
### T001|官网改版
- 负责人:张三
- 当前状态:进行中
- 截止日期:2025-01-10
- 任务描述:完成首页视觉设计并确认交互方案
- AI摘要:张三正在推进官网首页视觉设计和交互方案确认。
- 风险判断:需关注设计确认是否影响后续开发排期。
- 行动建议:建议尽快组织评审会议,明确最终方案。
### T002|客户跟进
- 负责人:李四
- 当前状态:待处理
- 截止日期:2025-01-08
- 任务描述:跟进A客户报价反馈,确认预算和采购周期
- AI摘要:李四需要跟进A客户报价反馈并确认采购计划。
- 风险判断:客户反馈不及时可能影响销售预测。
- 行动建议:建议当天联系客户并记录下一步沟通时间。
十、如何把工作流做得更智能?
上面的示例只是一个基础版本。真正落地到企业办公时,可以继续做增强。
1. 增加任务优先级判断
可以在 Excel 中增加 优先级 字段,例如:
| 优先级 |
|---|
| 高 |
| 中 |
| 低 |
然后让 AI 根据截止时间、状态和优先级判断风险等级。
例如输出:
{
"risk_level": "高",
"reason": "任务截止日期临近且仍未启动"
}
这样日报就可以自动突出高风险事项。
2. 接入飞书多维表格
如果团队使用飞书,可以把 Excel 换成飞书多维表格。程序定时读取表格数据,再生成日报并发送到飞书群。
优势是:
- 数据实时更新;
- 团队成员协作方便;
- 不需要反复传 Excel;
- 可以和飞书机器人联动。
3. 自动生成周报和月报
日报通常关注任务状态,而周报更关注结果和复盘。
你可以让 AI 根据一周的任务记录生成:
- 本周完成事项;
- 本周风险问题;
- 下周重点计划;
- 需要管理层协调的事项;
- 项目整体进度评价。
4. 增加人工确认环节
办公自动化并不意味着完全无人参与。对重要内容,建议加入“人工确认”步骤。
例如:
- AI 生成日报;
- 程序发送给负责人预览;
- 负责人确认后再发送到大群;
- 若未确认,则只保存草稿。
这种方式可以兼顾效率和准确性。
十一、定时运行工作流
如果希望每天上午 9 点自动生成日报,可以使用系统定时任务。
Linux / macOS 使用 crontab
执行:
crontab -e
添加:
0 9 * * 1-5 /usr/bin/python3 /path/to/ai-office-workflow/main.py
表示每周一到周五上午 9 点执行。
Windows 使用任务计划程序
步骤如下:
- 打开“任务计划程序”;
- 创建基本任务;
- 设置触发时间,例如每天 9:00;
- 操作选择“启动程序”;
- 程序填写 Python 路径;
- 参数填写
main.py; - 起始位置填写项目目录。
十二、常见问题
1. AI 输出不是 JSON 怎么办?
大模型有时会输出解释文字,导致 JSON 解析失败。解决方法包括:
- 在 Prompt 中强调“只输出 JSON”;
- 使用更低的
temperature; - 使用 JSON Schema 或函数调用能力;
- 增加正则提取和异常处理;
- 解析失败时走人工复核。
2. 企业微信消息发送失败怎么办?
常见原因包括:
- Webhook 地址错误;
- 企业微信机器人被删除;
- 群机器人权限受限;
- 消息内容过长;
- 网络无法访问企业微信接口。
可以先用简单内容测试:
import requests
webhook = "你的Webhook地址"
payload = {
"msgtype": "text",
"text": {
"content": "测试消息"
}
}
requests.post(webhook, json=payload)
3. 如何保护公司数据?
使用 AI 办公自动化时,数据安全非常重要。建议:
- 不要上传敏感客户信息;
- 对姓名、手机号、合同金额等字段脱敏;
- 使用企业级 API 或本地私有化模型;
- 对日志进行权限控制;
- 密钥保存在环境变量中;
- 重要文档输出前加入人工审核。
十三、完整运行流程总结
整个项目运行流程如下:
准备 tasks.xlsx
↓
配置 .env
↓
安装依赖
↓
执行 python main.py
↓
读取任务数据
↓
AI 分析任务
↓
生成 Markdown 日报
↓
保存到 output 目录
↓
发送企业微信通知
从实用角度看,这个工作流已经能满足很多团队的基础日报需求。如果你愿意继续扩展,它还可以演变成一个完整的办公自动化系统。
十四、进阶扩展源码思路
如果你想继续升级,可以增加一个风险等级字段:
def calculate_risk_level(task: dict) -> str:
status = task.get("当前状态", "")
priority = task.get("优先级", "中")
if status == "待处理" and priority == "高":
return "高"
elif status == "进行中" and priority in ["高", "中"]:
return "中"
else:
return "低"
也可以增加邮件发送模块:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email_report(sender, password, receiver, subject, content):
message = MIMEText(content, "plain", "utf-8")
message["From"] = Header(sender, "utf-8")
message["To"] = Header(receiver, "utf-8")
message["Subject"] = Header(subject, "utf-8")
smtp = smtplib.SMTP_SSL("smtp.qq.com", 465)
smtp.login(sender, password)
smtp.sendmail(sender, [receiver], message.as_string())
smtp.quit()
这样你就可以将日报同时发送到邮箱。
十五、结语
AI 办公自动化的核心,不是为了炫技,而是为了把人从重复性工作中解放出来。真正有价值的不是“让 AI 替你工作”,而是让 AI 帮你处理低价值、重复性、结构化的信息流,让你有更多时间做判断、沟通、创意和决策。
本文提供的工作流虽然简单,但已经覆盖了办公自动化的关键环节:
- 数据读取;
- AI 分析;
- 内容生成;
- 文件保存;
- 消息通知;
- 定时执行。
你可以在此基础上继续扩展:接入飞书、钉钉、企业微信、Notion、CRM、数据库或邮件系统。只要把任务拆成清晰步骤,再用程序和 AI 串联起来,就能逐步打造出适合自己团队的 AI 办公自动化体系。
如果你是刚开始学习 AI 办公自动化,建议先从一个小场景入手,例如“自动生成日报”或“自动总结会议纪要”。当你熟悉流程后,再逐步增加更多节点。这样既容易落地,也能快速看到效率提升。