簡體   English   中英

通過OpenXml中的word文檔迭代將文本輸入書簽(丟失格式)

[英]Iterating through word document in OpenXml entering text into bookmarks (losing formatting)

我有一個帶有書簽的word文檔。 書簽非常簡單,不會跨越表格或段落。 以下代碼有效但我丟失了文檔的格式,插入使用了單詞的默認字體和大小等。如何在文檔中輸入文本以保持文檔格式化?

using (var wordDoc = WordprocessingDocument.Open(targetFileName, true))
{
    MainDocumentPart mainPart = wordDoc.MainDocumentPart;

    var bookmarkStarts = mainPart.Document.Descendants<BookmarkStart>().ToList();

    foreach (BookmarkStart bookmarkStart in bookmarkStarts)
    {
      InsertIntoBookmark(bookmarkStart, "Hello");
    }
}

private static void InsertIntoBookmark(BookmarkStart bookmarkStart, string text)
{
    OpenXmlElement elem = bookmarkStart.NextSibling();

    while (elem != null && !(elem is BookmarkEnd))
    {
        OpenXmlElement nextElem = elem.NextSibling();
        elem.Remove();
        elem = nextElem;
    }
    Run run = new Run();
    run.Append(new Text(text));
    bookmarkStart.Parent.InsertAfter<Run>(run, bookmarkStart);
}

一種選擇是逐步替換Run中的文本而不是刪除所有內容並插入未格式化的Run。 然而,關於Word的討厭的事情是它有一個習慣,就是應該為一個人插入多個運行,有時甚至將一個單詞分成兩個或多個運行。

我通過使用您的示例中使用的相同循環解決了這個問題,但是我沒有刪除所有內容,而是替換了第一次運行中的文本,並刪除了其余內容,直到您點擊BookmarkEnd。 事情仍然可能出錯(因為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;
            }
        }

在您的情況下,無法直接完成您要實現的目標。 書簽不會包含任何格式信息,因此復制時不會保留任何格式。

實際的解決方法是手動獲取文檔的默認格式,並嘗試將其應用於插入Run的段落。

除了使用書簽,您還可以使用內容控件,這將使用OOXML在將文本插入到Word文檔中時提供更多額外的靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM