MS-Word разбивает текст на символы

У меня есть задача, в которой мне нужно поместить заполнители в мои .docx файлы и автоматически заменить их информацией, которая у меня есть. Я попытался использовать ${VARNAME} в качестве синтаксиса заполнителя, но в document.xml для этого файла docx я вижу $, {, VARIABLE и }, разбитые на 4 разных символа. На каком основании WORD выбирает это. Есть ли способ, чтобы этого не произошло?

Для замены заполнителя и управления файлами docx я использую docx4j. Я извлекаю узлы w:t через XPATH. Недавно я попытался использовать синтаксис заполнителя только как $VARNAME, и он не был разбит. Могу ли я считать это надежным соглашением об именах для заполнителя. Если нет, не могли бы вы предложить, как я могу решить эту ситуацию. Поможет ли введение пользовательских тегов в docx? Любые советы приветствуются.


person Aditya Bahuguna    schedule 01.03.2016    source источник
comment
Этот вопрос уже задавался. Word никогда не гарантирует одиночный запуск. Он разделит прогон на орфографию, грамматику, редактирование (rsid). Вы можете отключить некоторые из этих вещей. Или вы можете привести документ в порядок перед обработкой; см. github .com/plutext/docx4j/blob/master/src/main/java/org/docx4j/   -  person JasonPlutext    schedule 01.03.2016
comment
Сделал мой день!! :) Спасибо   -  person Aditya Bahuguna    schedule 01.03.2016


Ответы (1)


Вы не можете никогда предполагать, что Word не прервет цикл символов. Нет гарантированного способа. Вам либо нужно изменить свой подход к извлечению информации, не полагаясь на то, что все находится в одном теге <w:t>, либо вам нужно использовать другой тип «цели».

Word не поддерживает «настраиваемые теги», так что это не вариант.

Более надежным является использование ContentControl (тег std). Этот Word Open XML выглядит примерно так:

<w:sdt>
  <w:sdtPr>
    <w:alias w:val="test"/><w:tag w:val="test"/><w:id w:val="803656476"/>
    <w:placeholder>
      <w:docPart w:val="B4C191A9BCFE488E807F3919BC721619"/>
    </w:placeholder>
    <w:text/>
  </w:sdtPr>
  <w:sdtContent>
    <w:p>
      <w:r>
        <w:t>Content to be changed by code.</w:t>
      </w:r>
    </w:p>
  </w:sdtContent>
</w:sdt>

VARNAME будет либо w:alias, либо w:tag (на ваш выбор). Они соответствуют свойствам Title и Tag соответственно в пользовательском интерфейсе Word и объектной модели. Нет никакого шанса, что эти разойдутся.

Оттуда вы получаете потомка <w:t> элемента <w:sdtContent>.

При желании элемент управления содержимым можно сопоставить с узлом в пользовательской XML-части, хранящейся в документе. (В отличие от пользовательских тегов в тексте, Word поддерживает добавление XML-файлов в Zip-пакет документа.) В этом случае ваш код может обращаться к пользовательскому XML-файлу, а не к document.xml в порядок чтения/записи содержимого. Изменения будут отражены в элементах управления содержимым, связанных с узлами.

person Cindy Meister    schedule 01.03.2016
comment
Эй, не могли бы вы рассказать немного больше, как связать узел с управлением контентом. Является ли ваш ответ ссылкой на docx4j? Ссылка или прогулка были бы очень полезны! - person Aditya Bahuguna; 01.03.2016