设置连续文本的字体
本主题演示如何使用 Open XML SDK for Office 中的类以编程方式为字处理文档中的一部分文本设置字体。
包和文档部件
Open XML 文档存储为包,其格式由 ISO/IEC 29500 定义。 包可以具有多个彼此之间存在关系的部件。 部件之间的关系控制文档的类别。 如果文档的包关系项包含与主文档部件的关系,可将文档定义为字处理文档。 如果文档的包关系项包含与演示文稿部件的关系,可将文档定义为演示文稿文档。 如果文档的包关系项包含与工作簿部件的关系,可将文档定义为电子表格文档。 在本操作方法主题中,您将使用字处理文档包。
连续文本字体元素的结构
使用元素时rFonts
,ISO/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
示例代码的工作方式
打开包文件进行读/写后,代码将创建一个RunProperties
RunFonts
对象,该对象包含其Ascii
属性设置为“Arial”的对象。
RunProperties
和 RunFonts
对象分别表示 Open XML Wordprocessing 架构中的运行属性 rPr
元素和运行字体元素 rFont
。
RunProperties
使用 对象指定给定文本运行的属性。 在这种情况下,若要将 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);
}
}