如何将字符样式应用于文字处理文档中的运行?

时间:2013-04-10 05:34:56

标签: c# ms-word openxml openxml-sdk wordprocessingml

当我在c#中使用openxml sdk 2创建一个段落样式并将其应用到一个段落时,每个东西都是正确的,它会毫无问题地运行。

但是使用下面的代码,当我创建一个字符样式并将其应用于运行时,它不会改变文档的运行:

以下代码将创建并保存样式以设置文档的一部分:

            StyleDefinitionsPart stylePart = mainPart.AddNewPart<StyleDefinitionsPart>();
            Style style = new Style()
            {
                Type = StyleValues.Character,
                CustomStyle = true,
                StyleId = "CharacterStyle1"
            };
            LinkedStyle linkedStyle1 = new LinkedStyle() { Val = "LinkedStyle" };
            style.Append(linkedStyle1);
            style.Append(new Name() { Val = "CharacterStyle1" });
            StyleRunProperties styleRunProperties1 = new StyleRunProperties();
            Color color = new Color() { Val = "FF0000" };
            RunFonts font1 = new RunFonts() { ComplexScript = "Tahoma" };
            styleRunProperties1.Append(color);
            styleRunProperties1.Append(font1);
            styleRunProperties1.Append(new Bold());
            styleRunProperties1.Append(new FontSize() { Val = "48" });
            style.Append(styleRunProperties1);
            stylePart.Styles = new Styles();

            stylePart.Styles.Append(style);

以下代码是我编写的用于将样式应用于运行的内容:

            Paragraph heading = new Paragraph();
            ParagraphProperties headingPPr = new ParagraphProperties();
            heading.Append(headingPPr);

            Run run1 = new Run();
            Text textRun1 = new Text("THIS IS TEST RUN 1");
            run1.Append(textRun1);
            RunProperties rprRun1 = new RunProperties {RunStyle = new RunStyle() {Val = "CharacterStyle1"}};

            heading.Append(run1);
            body.Append(heading);

这些是 document.xml 的输出代码:

 <?xml version="1.0" encoding="utf-8"?>
 <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
 <w:body>
 <w:p>
  <w:pPr />
  <w:r w:rsidRPr="009531B2">
    <w:t>THIS IS TEST RUN 1</w:t>
  </w:r>
 </w:p>
 </w:body>
 </w:document>

该样式未应用于我的运行!

最后,这是我打开输出文档时样式库的屏幕截图,这张图片显示该样式已成功添加到文档中,但它不适用于运行:

picture of style in documnet

如何将字符样式应用于运行?

1 个答案:

答案 0 :(得分:2)

基于ECMA specification for OpenXML,为了设置段落中的任何运行样式,您还必须将样式应用于段落标记:

  

17.3.1.29 rPr(段落标记的运行属性)

     

此元素指定应用于以前使用的字形的运行属性集   代表段落标记的物理位置   段。这段标记,是一个物理角色   文件,可以格式化,因此应具备   表示此格式,就像其中的任何其他字符一样   文献。如果此元素不存在,则段落标记为   没有格式化,就像任何其他文本一样。

所以要在你的代码中解决这个问题。试试这个..

Paragraph heading = new Paragraph();
ParagraphProperties headingPPr = new ParagraphProperties();
heading.Append(headingPPr);
ParagraphMarkRunProperties headingParagraphMarkRunProperties = new ParagraphMarkRunProperties();
RunStyle runStyle1 = new RunStyle(){ Val = "CharacterStyle1" };

headingParagraphMarkRunProperties.Append(runStyle1);
headingPPr.Append(headingParagraphMarkRunProperties);

Run run1 = new Run();
Text textRun1 = new Text("THIS IS TEST RUN 1");
run1.Append(textRun1);
RunProperties rprRun1 = new RunProperties {RunStyle = new RunStyle() {Val = "CharacterStyle1"}};

run1.Append(rprRun1);

heading.Append(run2);
body.Append(heading);

<强>更新

根据您在评论中打开的xml代码段,您忘记了

RunProperties rprRun1 = new RunProperties {RunStyle = new RunStyle() {Val = "CharacterStyle1"}};

 run1.Append(rprRun1); //Adding run properties to the run
你的代码中的

。为了将run元素应用于run元素,还需要将属性单独应用于运行,因为{{1}}具有自己的属性部分:

  

正如段落可以拥有属性一样,运行也是如此。全部   r元素中的元素的属性由a控制   相应的可选rPr运行属性元素(第17.7.9.1节;   §17.3.2.27),它应该是r元素的第一个子元素。在   转而,rPr元素是一组属性元素的容器   应用于r元素的其余子元素。 [注意:   rPr容器元素中的元素允许使用者   控制以下运行内容中的内容是否为粗体,   例如,下划线或可见。结束说明]

希望这会有所帮助。