Как добавить ключевые слова в word, чтобы с помощью OpenXML заменить их?
Написал код, который заменяет ключевые слова в docx на данные, которые хранит объект.
Как написать эти слова в word, чтобы он их правильно разделял?
У меня получается, что я пишу, например, {Name}
, а openXml считывает как Name}
. Почему-то отбрасывает скобку или наоборот добавляет лишнее.
Пример:
model.Name = "Иван";
var body = doc.MainDocumentPart.Document.Body;
var replaceWord = "{Name}";
foreach (var text in body.Descendants<Text>())
{
if (text.Text == replaceWord) // условие не выполняется из-за того, что text.Text = "Name", а не "{Name}"
{
text.Text = model.Name;
}
}
Ответы (1 шт):
Ещё давно писали, что при поиске слов в документе через OpenXML слово может быть разбито на части.
Все что я могу порекомендовать, то это либо использовать слова которые не разбиваются(такое тоже бывает), например abn целиком находит, либо заменять слова через закладки.
Здесь уже такой проблемы не будет, но у закладок есть другая проблема это размер шрифта. Он не всегда тот, который вы указали на её месте. Вот метод который находит закладку и вставляет текст
public void InsertIntoBookmark(Dictionary<string, string> data)
{
foreach (var item in data)
{
BookmarkStart bookmarkStart = wd.MainDocumentPart.RootElement.Descendants<BookmarkStart>()
.Where(x => x.Name == item.Key).FirstOrDefault();
if (bookmarkStart is null)
continue;
OpenXmlElement elem = bookmarkStart.NextSibling();
var bookmarkEnd = wd.MainDocumentPart.RootElement.Descendants<BookmarkStart>()
.Where(x => x.Id == bookmarkStart.Id).FirstOrDefault();
while (elem != null && !(elem is BookmarkEnd))
{
OpenXmlElement nextElem = elem.NextSibling();
elem.Remove();
elem = nextElem;
}
bookmarkStart.Parent.InsertAfter(new Run(new Text(item.Value)), bookmarkEnd);
}
}