我有一个使用 OpenXml 生成文档的 C# 程序。它使用以下方法用值替换书签:
private void FillBookmark(BookmarkStart bookmark, string value)
{
var text = new Text(value);
bookmark.RemoveAllChildren();
IEnumerable<OpenXmlElement> elementsAfter = bookmark.ElementsAfter();
IEnumerable<OpenXmlElement> insideBookmark = elementsAfter.TakeWhile(element => !(element is BookmarkEnd));
foreach (OpenXmlElement element in insideBookmark)
{
element.RemoveAllChildren();
}
OpenXmlElement previousSibling = bookmark.PreviousSibling();
while (previousSibling is BookmarkStart || previousSibling is BookmarkEnd)
{
previousSibling = previousSibling.PreviousSibling();
}
var container = new Run(text);
previousSibling.AppendChild(container);
}
在这个特定的Word文档中,使用的字体是Raleway。有多个书签,执行此方法后,有两个书签使用 Calibri 字体。我尝试重写这些书签以确保它们位于 Raleway 中,但它们继续更改为 Calibri。
这怎么可能?
最佳答案
首先,您的代码创建没有先前 RunProperties 的新元素。 所以,你会得到类似下一个片段的内容:
<w:r>
<w:t>valuexX</w:t>
</w:r>
而不是它:
<w:r w:rsidRPr="00DE66A4">
<w:rPr>
<w:rFonts w:ascii="Algerian" w:hAnsi="Algerian" />
<w:lang w:val="en-US" />
</w:rPr>
<w:t>6</w:t>
</w:r>
您可以复制任何属性,如下所示:
private void FillBookmark(BookmarkStart bookmark, string value)
{
var text = new Text(value);
bookmark.RemoveAllChildren();
IEnumerable<OpenXmlElement> elementsAfter = bookmark.ElementsAfter();
IEnumerable<OpenXmlElement> insideBookmark = elementsAfter.TakeWhile(element => !(element is BookmarkEnd));
foreach (OpenXmlElement element in insideBookmark)
{
element.RemoveAllChildren();
}
OpenXmlElement previousSibling = bookmark.PreviousSibling();
while (previousSibling is BookmarkStart || previousSibling is BookmarkEnd)
{
previousSibling = previousSibling.PreviousSibling();
}
//Get previous font.
var runProperties = previousSibling.GetFirstChild<ParagraphMarkRunProperties>().GetFirstChild<RunFonts>();
//var runProperties = previousSibling.GetFirstChild<RunProperties>(); - if its simple element.
// Clone.
var newProperty = (RunFonts)runProperties.Clone();
// Create container with properties.
var container = new Run(text)
{
RunProperties = new RunProperties() { RunFonts = newProperty }
};
previousSibling.AppendChild(container);
}
关于c# - 编辑Word书签更改字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42515339/