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