当我在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>
该样式未应用于我的运行!
最后,这是我打开输出文档时样式库的屏幕截图,这张图片显示该样式已成功添加到文档中,但它不适用于运行:
如何将字符样式应用于运行?
答案 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容器元素中的元素允许使用者 控制以下运行内容中的内容是否为粗体, 例如,下划线或可见。结束说明]
希望这会有所帮助。