有朋友问我,他工作的公司不能访问外网,想在 Microsoft Word 里访问公司本地部署的 DeepSeek API,问具体应该如何操作?
将 Word 与 DeepSeek 集成,我想到的一种思路是在 Word 中创建一个宏,把能调用 DeepSeek API 的 Visual Basic 代码置于该宏之中。 我们首要的任务是将 Word 里创建宏的入口显示在 Word 的工具栏上。
操作方式如下:在 Word 的 File->Options 选项中,选取 Customize Ribbon,然后将左侧的 Developer 标签移至右侧,接着在 Developer 标签下新建一个 Group,并为其命名,名称可自行确定。 待会儿,我们可将创建好的宏放置于这个 Group 之内。
接下来我们就能在工具栏里看到 Developer 了,点击 Visual Basic,新建一个 Module:
下一步是给这个 Module 填充 Visual Basic 代码。
Visual Basic 可谓是编程界爷爷辈的存在了。现在熟悉 Visual Basic 的程序员可能不多了吧。 我们再次请出 Trae.
发出指令:
我要在 Word 里使用 Visual Basic, 调用 DeepSeek V3 API. API 输入,是用户在 Word 里选中的一段文本。
Trae 很快帮我们写好了代码。将我们自己的 API key 填进去即可。
把 Trae 写好的 Visual Basic,粘贴到新建的 Module 中。
Function CallDeepSeekAPI(api\_key As String, inputText As String)
Dim API As String
Dim SendTxt As String
Dim Http As Object
Dim status\_code As Integer
Dim response As String
API = "<https://api.deepseek.com/chat/completions>"
SendTxt = "{""model"": ""deepseek-chat"", ""messages"": \[{""role"":""system"", ""content"":""You are word writting assistant""}, {""role"":""user"", ""content"":""" & inputText & """}], ""stream"": false}"
Set Http = CreateObject("MSXML2.XMLHTTP")
With Http
.Open "POST", API, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & api\_key
.send SendTxt
status\_code = .Status
response = .responseText
End With
If status\_code = 200 Then
CallDeepSeekAPI = response
Else
CallDeepSeekAPI = "Error: " & status\_code & " - " & response
End If
Set Http = Nothing
End Function
Sub DeepSeekV3()
Dim api\_key As String
Dim inputText As String
Dim response As String
Dim regex As Object
Dim matches As Object
Dim originalSelection As Object
api\_key = "<此处粘贴你自己的 DeepSeek API Key>"
If api\_key = "" Then
MsgBox "Please enter the API key."
Exit Sub
ElseIf Selection.Type <> wdSelectionNormal Then
MsgBox "请在 Word 里选中一段文字"
Exit Sub
End If
Set originalSelection = Selection.Range.Duplicate
inputText = Replace(Replace(Replace(Replace(Replace(Selection.Text, "", "\\"), vbCrLf, ""), vbCr, ""), vbLf, ""), Chr(34), """")
response = CallDeepSeekAPI(api\_key, inputText)
If Left(response, 5) <> "Error" Then
Set regex = CreateObject("VBScript.RegExp")
With regex
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = """content"":""(.*?)"""
End With
Set matches = regex.Execute(response)
If matches.Count > 0 Then
response = matches(0).SubMatches(0)
response = Replace(Replace(response, """", Chr(34)), """", Chr(34))
response = Replace(response, "\n", vbCrLf)
response = Replace(response, "\n", vbCrLf)
response = Replace(response, "*", "")
response = Replace(response, "#", "")
Selection.Collapse Direction:=wdCollapseEnd
Selection.TypeParagraph
Selection.TypeText Text:=response
originalSelection.Select
Else
MsgBox "Failed to parse API response.", vbExclamation
End If
Else
MsgBox response, vbCritical
End If
End Sub
Trae 编写的这段代码,质量还是很高的。我们简单看一下。
变量声明与初始化
使用 Dim 关键字声明局部变量,每个变量后需指定数据类型,以便 VBA 在编译时进行类型检查。
Dim api_key As String
Dim inputText As String
Dim response As String
Dim regex As Object
Dim matches As Object
Dim originalSelection As Object
这里定义了存储 API 密钥、输入文本、响应文本、正则对象、匹配集合和原始选区的变量。
紧接着,将用户的 API 密钥赋值给 api_key 变量。
api_key = "自己的AK"
API 密钥与文本选择检查
若 api_key 为空,则弹出消息框提醒用户输入密钥,并退出子过程。
If api_key = "" Then
MsgBox "Please enter the API key."
Exit Sub
否则,需要检查当前 Selection 对象的类型,确保用户已选中文本;若未选中文本(类型非 wdSelectionNormal),则提示并退出。
ElseIf Selection.Type <> wdSelectionNormal Then
MsgBox "请选择文本."
Exit Sub
End If
保存原始选区
在修改 Selection 之前,先将当前选区的 Range 对象复制一份,以便后续恢复光标位置。
Set originalSelection = Selection.Range.Duplicate
Duplicate 属性返回一个只读的 Range 对象副本,原选区保持不变。
文本预处理
从 Selection.Text 中提取用户选中的内容,并对特殊字符进行转义、去除换行符等多重 Replace 操作。
inputText = Replace(Replace(Replace(Replace(Replace(Selection.Text, "\", "\\"), vbCrLf, ""), vbCr, ""), vbLf, ""), Chr(34), "\""")
这里连续调用 Replace 函数,依次替换反斜杠、回车换行、单独回车、换行、双引号,确保传输到 API 的字符串符合 JSON 要求。
调用自定义 API 函数
使用自定义的 CallDeepSeekAPI 函数,将 api_key 与 inputText 传入并返回结果字符串:
response = CallDeepSeekAPI(api_key, inputText)
CallDeepSeekAPI 是用户自行实现的函数,用于与 DeepSeek 服务通信并返回 JSON 格式的响应。
正则表达式提取内容
判断 response 是否以 Error 开头,若不是,则利用 VBScript.RegExp 对象从 JSON 中提取 content 字段的值。
If Left(response, 5) <> "Error" Then
Set regex = CreateObject("VBScript.RegExp")
With regex
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = """content"":""(.*?)"""
End With
Set matches = regex.Execute(response)
Left 函数截取字符串前 5 个字符进行判断。Execute 方法返回 MatchCollection 集合。
把上面的代码保存到 Module 之后,在 Word Customize Ribbon 里,把宏配置到自定义组里,随便维护一个图标即可。
现在可以开始测试了。
在 Word 里编辑一段文字,选中这些文字,点击 Developer 的 DeepSeekV3, 这样我们刚才给这个选项分配的 Visual Basic 实现的同名 subroutine 就会执行:
DeepSeek API 调用之后,response 自动填充到了 Word 里。