设置连续文本的字体

本主题演示如何使用 Open XML SDK for Office 中的类以编程方式为字处理文档中的一部分文本设置字体。


包和文档部件

Open XML 文档存储为包,其格式由 ISO/IEC 29500 定义。 包可以具有多个彼此之间存在关系的部件。 部件之间的关系控制文档的类别。 如果文档的包关系项包含与主文档部件的关系,可将文档定义为字处理文档。 如果文档的包关系项包含与演示文稿部件的关系,可将文档定义为演示文稿文档。 如果文档的包关系项包含与工作簿部件的关系,可将文档定义为电子表格文档。 在本操作方法主题中,您将使用字处理文档包。


连续文本字体元素的结构

使用元素时rFontsISO/IEC 29500 规范中的以下文本非常有用。

此元素指定用于显示此连续文本的文本内容的字体。 在单个连续文本中,最多可以包含四种内容类型,每种内容允许使用一种独特字体:

  • ASCII

  • 高 ANSI

  • 复杂文种

  • 中文

除非使用 cs 元素手动替代,否则应通过连续文本内容的 Unicode 字符值确定上述每个字体的使用。

如果此元素不存在,则默认值为保留在样式层次结构的上一级别应用的格式。 如果样式层次结构中从未应用过此元素,则应以支持每种内容类型的任意默认字体显示文本。

请考虑同时包含阿拉伯文本和英文文本的单个连续文本,如下所示:

英文 العربية

此内容可以表示为单个 WordprocessingML 连续文本:

    <w:r>
      <w:t>English العربية</w:t>
    </w:r>

尽管是在同一连续文本中,但由于为该连续文本中的 ASCII 和 CS 字符指定不同字体,因此内容会采用不同字体:

    <w:r>
      <w:rPr>
        <w:rFonts w:ascii="Courier New" w:cs="Times New Roman" />
      </w:rPr>
      <w:t>English العربية</w:t>
    </w:r>

因此,此连续文本对 ASCII 范围内的所有字符使用 Courier New 字体,对复杂文种范围内的所有字符使用 Times New Roman 字体。

© ISO/IEC 29500:2016


示例代码的工作方式

打开包文件进行读/写后,代码将创建一个RunPropertiesRunFonts对象,该对象包含其Ascii属性设置为“Arial”的对象。 RunPropertiesRunFonts 对象分别表示 Open XML Wordprocessing 架构中的运行属性 rPr 元素和运行字体元素 rFontRunProperties使用 对象指定给定文本运行的属性。 在这种情况下,若要将 run 的字体设置为 Arial,代码会创建一个 RunFonts 对象,然后将值 Ascii 设置为“Arial”。

// Set the font to Arial to the first Run.
// Use an object initializer for RunProperties and rPr.
RunProperties rPr = new RunProperties(
    new RunFonts()
    {
        Ascii = "Arial"
    });

然后,代码创建一个 Run 对象,该对象表示文档的第一个文本运行。 代码实例化 并将其 Run 设置为文档的第一个文本运行。 然后,代码使用 方法将 RunProperties 对象添加到 Run 对象。PrependChild 方法 PrependChild 将元素作为第一个子元素添加到内存中的 XML 结构中的指定元素。 在这种情况下,运行代码示例会生成一个内存中 XML 结构, RunProperties 其中 元素添加为 元素的第一个子元素 Run 。 无需直接调用 Save ,因为我们位于 using 语句中。

if (package.MainDocumentPart is null)
{
    throw new ArgumentNullException("MainDocumentPart is null.");
}

Run r = package.MainDocumentPart.Document.Descendants<Run>().First();
r.PrependChild<RunProperties>(rPr);

注意

此代码示例假定 fileName 路径处的测试字处理文档至少包含一个文本运行。

以下是使用 C# 和 Visual Basic 编写的完整示例代码。

static void SetRunFont(string fileName)
{
    // Open a Wordprocessing document for editing.
    using (WordprocessingDocument package = WordprocessingDocument.Open(fileName, true))
    {
        // Set the font to Arial to the first Run.
        // Use an object initializer for RunProperties and rPr.
        RunProperties rPr = new RunProperties(
            new RunFonts()
            {
                Ascii = "Arial"
            });

        if (package.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart is null.");
        }

        Run r = package.MainDocumentPart.Document.Descendants<Run>().First();
        r.PrependChild<RunProperties>(rPr);
    }
}

另请参阅