Microsoft Word - 具有部分特定数据的自定义字段

Microsoft Word - 具有部分特定数据的自定义字段

我在 Windows XP 上使用 Word 2007(无法更改这一点)。

我正在创建一个页面模板,并希望在每个页面的标题中显示特定于部分的特定信息。它应该在属于每个部分的每个页面上都相同,并且用户可以编辑(最好使用默认占位符)。

例如,

在跨越第 1-5 页的第 1 部分中,值可能是KSF 100,在跨越第 6-9 页的第 2 部分中,值可能是KSF 200。我想在第 1-5 页KSF 100上显示页眉,在第 6-9 页上显示KSF 200

我该如何实现这个呢?

答案1

如果您有每个部分(未链接)的标题,那么从某种意义上说,您所需要的只是一个带有占位符文本的区域,用户可以替换该文本。传统上,一种方法是使用 { MACROBUTTON } 字段作为占位符,如下所示

{ MACROBUTTON Nomacro The placeholder text }

(其中 Nomacro 是一个不存在的宏名称,而 {} 是一个特殊的字段代码括号对,您可以在 Windows Word 上使用 ctrl-F9 插入)

当用户在该字段中输入内容时,该字段及其占位符文本将被删除。

这在文档标题和正文中都有效。我想,主要缺点是,如果用户删除了文本,占位符就不会重新出现。但我怀疑,无论你使用哪种方法,用户可能做的其他简单操作(例如添加或删除分节符)都更有可能破坏文档。

如果您想要一个单一的标题(即,所有标题都链接到第 1 节标题),那么获取标题中每个部分文本的传统方法是使用 { STYLEREF } 字段,该字段引用具有特定样式的段落或文本区域,通常位于每个部分的开头或附近。

其他大多数事情看起来都更复杂,可能不太值得。例如,您可以使用嵌套字段为每个部分插入文档变量或自定义文档属性的值,例如

{ DOCVARIABLE "header{ SECTION }" }

但无法进行现场编辑,您必须使用 VBA 为用户提供修改文档变量的机制。使用自定义文档属性,您可以预先填充一定数量并使用

{ DOCPROPERTY "header{ SECTION }" }

并告诉用户如何使用现有的属性编辑器,但这并不简单。

最后,如果节数是固定的,并且您可以使用未链接的标题,则可以使用链接到自定义 XML 数据存储的内容控件。这些控件具有适当的占位符,并且可以在现场编辑,但同样存在一个问题,即如何整理已添加/删除节的文档。下面是一个代码示例,用于对空白文档进行初始设置,该文档具有指定数量的节,并且每个标题中都有一个内容控件。这仅适用于 Windows Word 2007 及更高版本。

Sub makeMappedCCPerSection()
' Run this with a newly created document
' Set this to the number of sections you want
Const sectioncount As Integer = 5
Dim cc As Word.ContentControl
Dim cxp As Office.CustomXMLPart
Dim cxpXML As String
Dim i As Integer
' the number of sections in your document
'Dim sectioncount As Integer

cxpXML = ""
cxpXML = cxpXML & "<root xmlns:hcc='header content control'>" & vbCrLf
cxpXML = cxpXML & "<sections>" & vbCrLf
For i = 1 To sectioncount
  cxpXML = cxpXML & "<section/>" & vbCrLf
Next
cxpXML = cxpXML & "</sections>" & vbCrLf
cxpXML = cxpXML & "</root>" & vbCrLf

With ActiveDocument
  For i = .CustomXMLParts.Count To 1 Step -1
    With .CustomXMLParts(i)
      If Not .BuiltIn Then
        .Delete
      End If
    End With
  Next
  Set cxp = .CustomXMLParts.Add(cxpXML)
  For i = 1 To sectioncount - 1
    .Content.InsertBreak WdBreakType.wdSectionBreakNextPage
  Next
  For i = sectioncount To 1 Step -1
    .Sections(i).Headers(wdHeaderFooterPrimary).Range.Text = " "
    If i > 1 Then
      .Sections(i).Headers(wdHeaderFooterPrimary).LinkToPrevious = False
    End If
    Set cc = .Sections(i).Headers(wdHeaderFooterPrimary).Range.ContentControls.Add(wdContentControlText)
    cc.SetPlaceholderText Text:="Section " & CStr(i) & " placeholder"
    cc.XMLMapping.SetMapping "/root/sections/section[" & CStr(i) & "]", , cxp
    Set cxp = Nothing
    Set cc = Nothing
  Next
End With
End Sub

答案2

另一个建议是补充 bibadia 的答案。如果您不希望输入的文本始终在文档中可见,则可以改为在每个部分中插入一个内容控件并隐藏该控件(您还可以强制该控件不能被删除以保证完整性)。将整个内容控件包装在书签中,并在页脚中添加指向书签的 REF 字段,它将拾取用户输入的任何文本。

然后,您可以指示用户在想要更新页眉页​​脚时打开非打印符号以查看内容控件,并将其关闭以隐藏输入。请注意,STYLEREF 不会拾取隐藏文本。

相关内容