c# - 编辑Word书签更改字体

标签 c# ms-word openxml openxml-sdk

我有一个使用 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/

相关文章:

c# - 棘手的架构问题。 4 基类需要一点可扩展性

c# - 是否有一种通用的方法来同步异步方法?

c# - 无需word即可获取.docx中的所有内容控件

c# - Interop Word - 从文档中删除页面

c# - 使用 C# 生成 Word 文档

c# - EventProcessorClient 事件之间的延迟

c# - 连接两个整数

vba - 将变量从 XLSM 传递到嵌入式 DOCM

c# - 如何使用 Open XML 密码保护 Excel 文档

c# - EPPlus:在单元格中定位图像