如何使用Open XML在书签上方添加段落?
在Open XML书签上方添加段落的解决方案
嘿,我来帮你搞定这个问题!你已经能成功在书签下方添加段落了,那在上方添加的思路其实大同小异,核心就是调整插入位置——从“书签之后”改成“书签之前”。
核心思路
BookmarkStart节点一般嵌套在某个父元素里(比如最常见的<Paragraph>段落元素),我们只需要找到这个BookmarkStart在父元素子节点中的位置,然后把新段落插入到它的索引位置之前就可以了。
修改后的完整代码
结合你提供的代码片段,我帮你调整成适合在书签上方添加段落的版本:
var mainPart = wDoc.MainDocumentPart; var res = from bm in mainPart.Document.Body.Descendants<BookmarkStart>() where bm.Name == "vendos_tekstin" select bm; var bookmark = res.SingleOrDefault(); if (bookmark != null) { var parentElement = bookmark.Parent; // 获取父元素的所有子节点 var childNodes = parentElement.ChildNodes; // 找到当前BookmarkStart在子节点中的索引位置 int bookmarkPosition = childNodes.IndexOf(bookmark); // 构建你需要添加的新段落(这里可以按照自己的需求自定义内容) var newParagraph = new Paragraph( new Run( new Text(DateTime.Now.ToString() + " , 这是书签上方的新段落内容") ) ); // 把新段落插入到书签节点的前面 childNodes.InsertAt(newParagraph, bookmarkPosition); // 一定要记得保存文档,不然修改不会生效 mainPart.Document.Save(); }
关键说明
- 定位书签位置:通过
childNodes.IndexOf(bookmark)获取书签在父元素子节点中的索引,这是实现“上方插入”的核心。 - 插入逻辑区别:你之前在书签下方添加可能用的是
AddAfterSelf方法,而上方插入需要用InsertAt把新段落放在书签的索引位置,这样新元素就会排在书签节点前面。 - 特殊场景适配:如果你的书签跨了多个元素(比如
BookmarkStart在段落A,BookmarkEnd在段落B),那你可能需要把新段落插入到BookmarkStart所在父元素的前面,但这种情况比较少见,大部分单段落内的书签用上面的代码就足够了。
内容的提问来源于stack exchange,提问作者Arbenita Musliu
相关产品推荐
相关产品推荐

