通过OpenXml中的word文档迭代将文本输入书签(丢失格式)

时间:2012-03-16 16:03:25

标签: c# openxml

我有一个带有书签的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);
}

2 个答案:

答案 0 :(得分:0)

在您的情况下,无法直接完成您要实现的目标。书签不会包含任何格式信息,因此复制时不会保留任何格式。

实际的解决方法是手动获取文档的默认格式,并尝试将其应用于插入Run的段落。

您还可以使用内容控件,而不是使用书签,这样可以更加灵活地使用OOXML将文本插入到Word文档中。

答案 1 :(得分:0)

一个选项是逐步替换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;
            }
        }