アプローチでブックマークを削除しないことを確認しましたか? 少し編集した後、テスト コードを実行しました (サンプル コードに var name 項目はありません)。Hello を、テーブルから 2 つのブックマークに、テーブルに 2 つのブックマークに正常に挿入しました。問題。
これにより、あなたの問題は他の場所にあると私は信じています。プログラムを実行した後、ドキュメント内の open-xml を見ましたか? エラーはありますか?
私は、ブックマークを自分ではなく単語に配置すると、Word ドキュメントの最も奇妙な場所にブックマークが配置されることを経験しました。
このようにブックマークが互いに重なってしまうこともあります
<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);
}
}
}
私が認めるのは、完全に絶対確実というわけではありませんが、私にとってはうまく機能しています。ブックマークの削除を避けるために追加できる別のチェックは、置換メソッドにあります
これにより、テキストを挿入するときに要素を削除するときにブックマークの開始を削除しないようになります
while (elem != null && !(elem is BookmarkEnd)) //fjern elementer
{
OpenXmlElement nextElem = elem.NextSibling();
if (elem.LocalName != "bookmarkStart")
elem.Remove();
elem = nextElem;
}
幸運を :)