1

このコードを使用して、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();
}

ただし、ブックマークがテーブルにある場合、これは機能しません。

4

1 に答える 1

0

アプローチでブックマークを削除しないことを確認しましたか? 少し編集した後、テスト コードを実行しました (サンプル コードに 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;
            }

幸運を :)

于 2013-03-27T13:59:32.493 に答える