2016-03-01 5 views
0

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

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

+2

Этот вопрос задан раньше. Слово никогда не гарантирует ни одного прогона. Он разделит пробег на орфографию, грамматику, редактирование (rsid). Вы можете отключить некоторые из этих вещей. Или вы можете очистить документ перед обработкой; см. https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/model/datastorage/migration/VariablePrepare.java – JasonPlutext

+0

Сделал мой день! :) Спасибо –

ответ

1

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

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

Более надежным является использование ContentControl (std-тег). Это Слово 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, чтобы читать/писать содержание. Изменения будут отражены в элементах управления содержимым, связанных с узлами.

+0

Эй, можно сказать немного больше, как связать узел с контентом. Ответ ур в ref на docx4j? Ссылка или прогулочный корыто были бы настолько полезны! –

Смежные вопросы