Я использую Word 2007 на Windows XP (не могу изменить это).

Я создаю шаблон страницы и хочу показать конкретную часть информации в заголовке каждой страницы, которая специфична для конкретного раздела. Он должен быть одинаковым на каждой странице, принадлежащей каждому разделу, и редактироваться пользователем (желательно с заполнителем по умолчанию).

Например,

В разделе 1, который охватывает страницы 1-5, значение может быть KSF 100 , в разделе 2, которое охватывает страницы 6-9, значение может быть KSF 200 . На страницах 1-5 я хочу отобразить KSF 100 в заголовке, а на страницах 6-9 я хочу отобразить KSF 200 .

Как бы я пошел на реализацию этого?

2 ответа2

2

Если у вас есть заголовки для каждого раздела (не связанные), то в некотором смысле все, что вам нужно, это область с текстом-заполнителем, который может заменить пользователь. Традиционно, один из способов сделать это - использовать поле {MACROBUTTON} в качестве заполнителя, например

{ MACROBUTTON Nomacro The placeholder text }

(Если Nomacro - это несуществующее имя макроса, а {{- это специальная пара скобок с кодом поля, которую можно вставить с помощью ctrl-F9 в Windows Word)

Когда пользователь вводит это поле, поле и его заполнитель удаляются.

Это работает как в заголовках, так и в теле документа. Я полагаю, что основным недостатком является то, что если пользователь удаляет свой текст, заполнитель не появляется снова. Но я подозреваю, что другие простые вещи, которые пользователь может сделать (например, добавить или удалить разрывы разделов), могут с большей вероятностью сломать документ, какой бы метод вы ни использовали.

Если вам нужен один заголовок (т. Е. Все заголовки связаны с заголовком Раздела 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
0

Еще одно предложение дополнить ответ Бибадиа. Если вы оказались в ситуации, когда вы не хотели, чтобы входной текст был виден внутри документа все время, вы могли бы вместо этого вставить элемент управления содержимым в каждый раздел и сделать элемент управления скрытым (вы также можете принудить, что элемент управления нельзя удалить для целостности). Оберните весь элемент управления содержимым в закладку, а в нижний колонтитул добавьте поле REF, которое указывает на закладку и выберет любой текст, введенный пользователем.

Затем вы можете поручить своим пользователям включать непечатаемые символы, чтобы видеть элемент управления содержимым, когда они хотят обновить нижний колонтитул заголовка, и отключить его, чтобы скрыть ввод. Обратите внимание, что STYLEREF не будет подбирать скрытый текст.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .