在日常工作中,周报往往重复、耗时,却又不可或缺。随着 AI 能力的成熟,把 Excel 与 DeepSeek 这类大模型结合起来,正在成为一种高效、可落地的自动化方案。通过在 Excel 中整理结构化数据,再将内容按规则交给 DeepSeek 进行分析与生成,我们可以把原本需要几十分钟甚至更久的周报撰写过程,压缩到“一键生成”的程度。
本文将围绕 “Excel 接入 DeepSeek api,实现总结总结/周报自动生成” 展开,介绍整体操作步骤,帮助你在不改变现有工作习惯的前提下,快速搭建一套稳定、可复用的 AI 周报生成流程,让周报从“负担”变成真正服务工作的工具。
第一步获取deepseek api key
访问deepseek 开放平台:platform.deepseek.com,创建api key
deepseek-api-key-创建复制API key
第二步创建配置表
为了灵活管理一些使用中的配置项,建议新建一个配置sheet来集中管理,这里把配置sheet命名为“配置”,后面的函数需要用到。提示词(Prompt),可以根据自己需要增加和修改。
- API Key:把刚刚复制的api key 填入
- API URL:https://api.deepseek.com
- Prompt:工作总结提示词如下:
你是一名负责撰写工作汇报的业务助理,请严格基于输入信息进行总结,不得引入未提供的背景或结论。
输入为一条工作记录:
- 任务:{任务}
- 负责人:{负责人}
- 进度状态:{进度状态}
- 风险问题:{风险问题}
请按以下结构输出内容,各部分之间需换行:
【一句话总结】
用不超过 30 字概括当前任务的整体情况,必须同时体现“任务内容 + 当前进度状态”。
【当前进展】
根据进度状态,客观描述当前已经完成或正在推进的工作内容,列出 2–3 条要点,每条以“- ”开头。
【下一步行动】
结合当前进度与风险情况,给出 2–3 条明确、可执行的下一步行动建议,每条以“- ”开头。
【风险提示】
规则如下(必须遵守):
- 如果 {风险问题} 非空:直接以“风险:{风险问题}”开头,并补充一句该风险可能带来的影响或需要关注的点。
- 如果 {风险问题} 为空:仅输出“无明显风险”。
写作要求:
- 语气客观、偏工作汇报
- 不使用“作为AI”“建议您”等 AI 风格表述
- 不夸大成果,不提前下结论
- 不解释生成逻辑
第三步创建宏函数
按ATL+F11进入VBA窗口,创建一个模块函数
并将以下代码复制粘贴进模块中
' ========= 自定义参数版:在提示词中用 {参数名} 占位 =========
Public Function DS_PARAM(promptCell As Range, userText As String, ParamArray args() As Variant) As String
On Error GoTo ErrHandler
Dim wsCfg As Worksheet
Set wsCfg = ThisWorkbook.Worksheets("配置")
Dim apiKey As String, apiBase As String, modelName As String, apiUrl As String
apiKey = CStr(wsCfg.Range("B1").Value) ' API Key
apiBase = CStr(wsCfg.Range("B2").Value) ' API Base URL
modelName = CStr(wsCfg.Range("B3").Value) ' 模型名
If apiKey = "" Or apiBase = "" Or modelName = "" Then
DS_PARAM = "请先在 配置!B1~B3 填写 API Key / API URL / 模型名"
Exit Function
End If
If Right$(apiBase, 1) = "/" Then
apiBase = Left$(apiBase, Len(apiBase) - 1)
End If
apiUrl = apiBase & "/chat/completions"
' ---- 读取提示词模版 ----
Dim systemPrompt As String
systemPrompt = CStr(promptCell.Value)
' ---- 处理自定义参数:成对传入 "name", value ----
Dim i As Long
Dim name As String, val As String
If (UBound(args) - LBound(args) + 1) Mod 2 <> 0 Then
DS_PARAM = "参数数量必须为偶数(成对:名称 + 值)"
Exit Function
End If
For i = LBound(args) To UBound(args) Step 2
name = CStr(args(i))
If i + 1 <= UBound(args) Then
val = CStr(args(i + 1))
Else
val = ""
End If
If name <> "" Then
systemPrompt = Replace(systemPrompt, "{" & name & "}", EscapeJson(val))
End If
Next i
' ---- 组装请求体 ----
Dim reqBody As String
reqBody = "{""model"":""" & modelName & """,""messages"":[" & _
"{""role"":""system"",""content"":""" & EscapeJson(systemPrompt) & """}," & _
"{""role"":""user"",""content"":""" & EscapeJson(userText) & """}" & _
"],""temperature"":0.7}"
' ---- 发送请求 ----
Dim responseText As String
responseText = HttpPostJson(apiUrl, apiKey, reqBody)
' 自动设置换行显示
Application.Caller.Cells.WrapText = True
' ---- 解析返回 ----
DS_PARAM = ParseContentFromJson(responseText)
Exit Function
ErrHandler:
DS_PARAM = "错误: " & Err.Description
End Function
' ================== HTTP POST 工具函数 ==================
Private Function HttpPostJson(ByVal url As String, ByVal apiKey As String, ByVal body As String) As String
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "POST", url, False
http.setRequestHeader "Content-Type", "application/json"
http.setRequestHeader "Authorization", "Bearer " & apiKey
http.send body
If http.Status = 200 Or http.Status = 201 Then
HttpPostJson = http.responseText
Else
HttpPostJson = "HTTP Error " & http.Status & ": " & http.responseText
End If
End Function
' ================== JSON 转义 ==================
Private Function EscapeJson(ByVal s As String) As String
s = Replace(s, "\", "\\")
s = Replace(s, """", "\""")
s = Replace(s, vbCrLf, "\n")
s = Replace(s, vbCr, "\n")
s = Replace(s, vbLf, "\n")
EscapeJson = s
End Function
' ================== 从 JSON 中取 content,并自动换行 ==================
Private Function ParseContentFromJson(ByVal json As String) As String
On Error GoTo ErrHandler
Dim key As String
Dim startPos As Long, endPos As Long
Dim content As String
key = """message"":{""role"":""assistant"",""content"":"""
startPos = InStr(1, json, key, vbTextCompare)
If startPos = 0 Then
key = """content"":"""
startPos = InStr(1, json, key, vbTextCompare)
If startPos = 0 Then
ParseContentFromJson = json
Exit Function
End If
End If
startPos = startPos + Len(key)
endPos = InStr(startPos, json, """", vbTextCompare)
content = Mid$(json, startPos, endPos - startPos)
' ?? JSON 转换 Excel 换行
content = Replace(content, "\n", vbCrLf)
' ?? 转义还原
content = Replace(content, "\\", "\")
content = Replace(content, "\""", """")
ParseContentFromJson = Trim(content)
Exit Function
ErrHandler:
ParseContentFromJson = json
End Function
第四步在项目跟进表中引用宏函数
在总结报告栏输入
=DS_PARAM(配置!$B$4,"","任务",A2,"负责人",B2,"进度状态",C2,"风险问题",D2)
这是一个 带自定义参数的调用公式,参数由提示词模板的占位符确定,使用起来比较灵活,下面是使用说明:
| 传入内容 | 含义 |
| 配置!$B$4 | 提示词模板:AI 的工作说明书,里面包含 {任务}、{负责人} 等占位符;如果你配置表里的提示词写在B5,要改成配置!$B$5 |
| "" | 用户补充内容:这里为空,表示所有信息都通过参数传入,如果你以后想额外给 AI 一段描述,也可以在这里补充 |
| "任务", A2 | 把 A2 的值 填充到提示词里的 {任务} |
| "负责人", B2 | 把 B2 的值 填充到提示词里的 {负责人} |
| "进度状态", C2 | 把 C2 的值 填充到提示词里的 {进度状态} |
| "风险问题", D2 | 把 D2 的值 填充到提示词里的 {风险问题} |
生成效果
在项目跟进表中的总结报告列,调用AI总结函数,并下拉拖动,就可以实现批量生成的效果
最后,因为excel的普通格式是禁用宏的,需要把文件另存为.xlsm格式的文件,方便后面打开就能使用。








