我使用此代码替换word中的书签文本:
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("doc3.docx", true))
{
var bookmarkStarts = wordDoc.MainDocumentPart.Document.Body.Descendants<BookmarkStart>();
foreach (var start in bookmarkStarts)
{
OpenXmlElement elem = item.NextSibling();
while (elem != null && !(elem is BookmarkEnd))
{
OpenXmlElement nextElem = elem.NextSibling();
elem.Remove();
elem = nextElem;
}
item.Parent.InsertBefore<Run>(new Run(new Text("Hello")), item);
}
wordDoc.Close();
}
但这不适用于桌面上的书签。
答案 0 :(得分:0)
您是否检查过您的方法是否删除了任何书签? 我编辑了一些后你运行了测试代码(你的示例代码中没有var名称项),并且我已经成功地将Hello插入到表中的2个书签中,并且在表中成功地插入了2个,而没有任何的问题。
这让我相信你的问题在别处。 在运行程序后,您是否查看了文档中的open-xml? 有什么错误吗?
我有经验的书签放在单词文档中最奇怪的地方,当你离开单词时,而不是你。
您最终还可以像这样重叠书签
<bookmark1 start><xml xml><bookmark2 start><bookmark1 end><xml xml><bookmark2 end>
如果你遇到这种情况,你的代码会在它到达bookmarkend 1之前删除bookmarkstart 2,这将导致你的书签不被替换。
使用较大的复杂文档,您很容易遇到这个问题。 我解决它的方法是在进行任何编辑之前对书签进行“排序”。
所以上面的例子将成为
<bookmark1 start><xml xml><bookmark1 end><bookmark2 start><xml xml><bookmark2 end>
排序后
我用来执行此操作的代码如下所示:
var bookmarks = mainPart.Document.Body.Descendants<BookmarkStart>();
for (int i = 0; i < bookmarks.Count(); i++)
{
var bks = bookmarks.ElementAt(i);
var next = bks.NextSibling();
if (next is BookmarkEnd)
{
var bme = (BookmarkEnd)next;
if (int.Parse(bks.Id) - int.Parse(bme.Id) == 1)
{
var copy = (BookmarkEnd)next.Clone();
bks.Parent.RemoveChild<BookmarkEnd>(bme);
bks.Parent.InsertBefore<BookmarkEnd>(copy, bks);
}
}
}
我承认这不是完全万无一失,但对我来说效果很好。 您可以添加的另一项检查,以避免删除书签是在您的替换方法
这将确保您在插入文本时删除元素时不删除bookmarkstart
while (elem != null && !(elem is BookmarkEnd)) //fjern elementer
{
OpenXmlElement nextElem = elem.NextSibling();
if (elem.LocalName != "bookmarkStart")
elem.Remove();
elem = nextElem;
}
祝你好运:)