MS Word 可以从 Excel 文件中的字段加载动态数据(标题、作者、地址、电话号码等)吗?

MS Word 可以从 Excel 文件中的字段加载动态数据(标题、作者、地址、电话号码等)吗?

我不想用 VBA 来开发我自己的工具,因为它太脆弱了,无法快速编写代码(并交给其他用户),或者我最终会为了这样一个简单的最终结果而编写太多的代码。

是否有一个很好的内置工具可以填写某种表格并将其填充到 Word 文档中

如果需要更改数据,您可以转到这个中心位置并在那里进行编辑,而不必尝试找到文档中引用它的所有位置(例如必须进入页眉/页脚,或者知道第一页/最后一页的设置与其余所有页面不同,等等)

这是用于手册的,其内容、作者、名称和标题会随着项目的不同而变化,但格式遵循相同的模板。

答案1

开始表单模板或邮件合并:Word 2016


    邮件选项卡 → 开始邮件合并 → 逐步 MM 向导
    选择:信函,[下一步]
    选择:使用当前文档,[下一步]
    选择:键入新列表 → CREATEcustomize columnsAdd/Delete/Rename

    保存:Microsoft Office 地址列表 (*.mdb)——这是表单/模板的动态列表。

[下一个]写你的信。现在制作你的模板。

现在插入动态“字段”:

    邮件选项卡 → [插入合并字段] 在新页面从一个项目切换到另一个项目的任何位置插入“字段”。

它看起来是这样的:图像(点击图片观看/导航动画动态图片

在此处输入图片描述

Microsoft 支持 - Word(邮件合并):关联
Microsoft 支持 - 使用 Excel 进行邮件合并:关联

答案2

虽然这不是我最干净的代码,但是它完成了工作。

解决方案

这会将文本文件中的一系列键值对加载到 Word 文档的活动文档.变量列表。这些变量持久地存储在文档中,但我选择将它们分开,以避免变量重复和孤立(参见代码中的大锤删除)。

然后变量值可以是使用字段显示在整个文档中引用可变量的名字。

以下代码没有错误处理,但会进行一些基本的解析检查以避免崩溃。不过尚未进行广泛测试,因此请自行进行尽职调查。

用法:

将代码放置在 Document On Open 事件处理程序中。它将创建一个与 Word 文档同名但扩展名为“.config”的文件。

在创建时,配置文件将写入所有当前的 ActiveDocument.Variables,以确保如果您复制 Doc 并忘记或不知道 .config 文件,您不会意外打开空白文件。

如果配置文件存在,则所有文档变量都会从内存中删除,而配置中的变量会加载到内存中。您可以更改配置文件中变量的值,下次打开文档时,该值会在整个文档中更新。

在此处输入图片描述

Option Explicit

Private Sub Document_Open()

    'Dim
    Dim i As Long
    Dim Folder As String
    Dim FileName As String
    Dim FullPath As String
    Dim FileText As String
    Dim Item As Variant
    Dim Table As Scripting.Dictionary
    Dim Key As Variant

    ' Open or Create Config File
    With New FileSystemObject

        ' Setup Path
        Folder = ThisDocument.Path & "\"
        FileName = .GetBaseName(ThisDocument.Name)
        FullPath = Folder & FileName & ".config"

        If (.FileExists(FullPath)) Then

            ' Sledge Hammer Cleanup of Document Vars, avoids memory bloat by synchronizing variables with .config file
            For i = ActiveDocument.Variables.Count() To 1 Step -1
                ActiveDocument.Variables.Item(i).Delete
            Next i

            ' Open / Read
            With .OpenTextFile(FullPath, ForReading, False)

                ' Get File Contents
                If Not (.AtEndOfStream) Then
                    FileText = .ReadAll
                End If

                .Close
            End With
        Else

            ' Create / Write
            With .OpenTextFile(FullPath, ForWriting, True)

                ' Write One Key-Value pair per line
                For Each Item In ActiveDocument.Variables
                    .WriteLine (Item.Name & ":=" & Item.Value)
                Next

                .Close
            End With
        End If
    End With

    ' Parse Config Text for Runtime
    Set Table = ParseVariables(FileText)
    For Each Key In Table.Keys
        ActiveDocument.Variables(Key) = Table(Key)
    Next

    ' Update All Fields in Document
    ActiveDocument.Fields.Update

    ' Save File so user does not get nuisance prompts
    ActiveDocument.Save
End Sub


Private Function ParseVariables(text As String) As Scripting.Dictionary

' Dim
Dim i, n As Long
Dim Lines As Variant: Lines = Split(text, vbCrLf)
Dim VarTable As New Scripting.Dictionary
Dim Key, Value As String

    ' Loop
    For i = LBound(Lines) To UBound(Lines)

        Debug.Print ("Lines(" & i & ") = " & Lines(i))

        ' Find the ":=" delimiter in each line that splits the variable name from its value
        n = InStr(1, Lines(i), ":=", vbBinaryCompare)

        ' Escape if not delimited
        If (n > 0) Then

            ' Extract Key before ":=" and Value from after ":="
            Value = Mid(Lines(i), n + 2)
            Key = Trim(Mid(Lines(i), 1, Len(Lines(i)) - Len(Value) - 2))

            ' Escape if either Key or Value are empty
            If (Len(Key) > 0) And (Len(Value) > 0) Then
                VarTable.Item(Key) = Value
            End If
        End If
    Next i

    ' Return
    Set ParseVariables = VarTable

End Function

相关内容