使用 Trae 辅助,将 DeepSeek 集成到 Word 文档里

441 阅读4分钟

有朋友问我,他工作的公司不能访问外网,想在 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 里。