2015-11-30 1 views
1

Я пытаюсь использовать OpenXML SDK и образцы на страницах Microsoft, чтобы заменить заполнители на реальный контент в документах Word.Используйте OpenXML для замены текста в файле DOCX - странный контент

Он работал как описано here, но после редактирования файла шаблона в Word добавлены верхние и нижние колонтитулы, он перестает работать. Я задавался вопросом, почему некоторые отладки показал мне это:

enter image description here

Что содержание texts в этой части кода:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(DocumentFile, true)) 
{ 
    var texts = wordDoc.MainDocumentPart.Document.Body.Descendants<Text>().ToList(); 
} 

Так что я вижу здесь является то, что тело документа является «фрагментированным», даже если в слове содержание выглядит следующим образом:

enter image description here

Может кто-нибудь сказать мне, как я могу обойти это?


Меня спросили, чего я пытаюсь достичь. В основном я хочу заменить пользовательские «заполнители» реальным контентом. Я хочу рассматривать документ Word как шаблон. Заполнитель может быть чем угодно. В моем примере выше они выглядят как {var:Template1}, но это то, с чем я играю. Это может быть в основном любое слово.

Так, например, если документ содержит следующий пункт:

Do не использовать имя USER_NAME

пользователь должен быть в состоянии заменить USER_NAME заполнитель со словом admin например, сохраняя форматирование неповрежденным. Результат должен быть

ли не использовать имя администратора

проблема, которую я вижу с работой на уровне абзаца, конкатенаций содержания и затем заменяя содержание пункта, Я боюсь, что потеряю форматирование, которое должно храниться как в

Не используйте имя admin

+1

Это всегда будет немного похоже на это, если вы получите текстовые прогоны, текстовые прогоны могут быть индивидуально отформатированы (например, если вы подчеркиваете один символ в абзаце). Почему бы вам не получить текст на уровне абзаца? например 'Body.Descendants () .' –

+0

@NickDewitt Хорошо, если я это сделаю, не могу ли я потерять другое форматирование, применяемое к другому тексту этого абзаца? –

+0

ну нет, текстовые элементы все равно будут внутри абзаца, есть форматирование как на уровне абзаца, так и на уровне текста. Если вы возьмете текст узла из абзаца или текстового уровня, он все равно потеряет его форматирование. Чего вы пытаетесь достичь, например? что вы собираетесь делать с элементами после их извлечения? –

ответ

2

Различные вещи могут фрагментировать тексты. Наиболее часто проверяющая разметка (как, очевидно, здесь, где есть «squigglies») или rsid (используется для сравнения документов и отслеживания, кто редактировал, когда), а также закладки «Назад» Word устанавливает в фоновом режиме. Это становится очевидным, если вы рассматриваете базовый WordOpenXML (например, с помощью инструмента Open XML SDK Productivity Tool) в документе «part» document.xml.

Обычно это помогает выйти на уровень элемента «выше». В этом случае получите список потомков абзаца и оттуда получите все потомки Text и соедините их InnerText.

+0

Спасибо. Если я получу текст для всего абзаца, мне придется заменить мое ключевое слово на нужное значение, а затем установить текст для абзаца, правильно? Разве это не означает, что я потеряю все остальные форматирования для этого абзаца? То, что я действительно хотел бы достичь, это то же самое, что и при использовании функции «Поиск и замена» в Word. Просто замените текст, сохранив другое форматирование. –

+0

Вы не можете получить полный ответ, если вы не предоставите полную информацию в своем вопросе. Какое ключевое слово? Какое форматирование? Что еще вы не упомянули? Дайте нам настоящий пример. И нет, нет простого способа использования Open XML для поиска/замены способа, которым Word предоставляет пользователю и его API. За кулисами Слово имеет дело с той же ситуацией.Когда вы работаете с Open XML, вы работаете на гораздо более базовом уровне, что означает больше работы ... –

+0

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

1

OpenXML действительно фрагментировать текст:

Я создал library, что делает именно это: вынести шаблон слово с значениями из JSON.

От documenation of docxtemplater:

Почему вы должны использовать библиотеку для этого

Docx является Молнии формат, который содержит некоторые XML. Если вы хотите создать простую замену {tag} по системе значений, она уже может усложниться, потому что {tag} внутренне разделен на <w:t>{</w:t><w:t>tag</w:t><w:t>}</w:t>. Если вы хотите встроить циклы для итерации по массиву, это станет настоящей проблемой.

библиотека в основном выполняет следующие действия, чтобы сохранить форматирование:

Если текст:

<w:t>Hello</w:t> 
<w:t>{name</w:t> 
<w:t>} !</w:t> 
<w:t>How are you ?</w:t> 

Результат будет выглядеть так:

<w:t>Hello</w:t> 
<w:t>John !</w:t> 
<w:t>How are you ?</w:t> 

Вы также должны заменить тег на <w:t xml:space=\"preserve\">, чтобы гарантировать, что пространство не будет удалено, если оно какое-либо из ваших переменных.