Один из вариантов заключается в том, чтобы на самом деле заменить текст в прогоне вместо удаления всего и вставить неформатированный прогон. Однако в Word есть неприятная вещь: у него есть привычка вставлять несколько прогонов для того, что должно быть одним, а иногда даже разбивать одно слово на два или более прогонов.
Я решил эту проблему, используя тот же цикл, который использовался в вашем примере, но вместо того, чтобы удалить все, я заменяю текст в первом прогоне и удаляю остальное до тех пор, пока вы не нажмете на Закладку. Все еще может пойти не так (потому что Word ...), но я считаю, что это работает достаточно хорошо, чтобы справиться с любым другим возникающим в каждом конкретном случае.
Ваш пример переработан для замены вместо удаления и вставки:
private static void InsertIntoBookmark(BookmarkStart bookmarkStart, string text)
{
OpenXmlElement elem = bookmarkStart.NextSibling();
bool firstRunReplaced = false;
while (elem != null && !(elem is BookmarkEnd))
{
OpenXmlElement nextElem = elem.NextSibling();
if (elem is Run && !firstRunReplaced)
{
((Run)elem).Elements<Text>().First().Text = text;
firstRunReplaced = true;
}
else
{
elem.Remove();
}
elem = nextElem;
}
}