OpenXML“Heading2”不起作用,但“Heading1”确实有效

时间:2014-07-15 16:49:51

标签: c# openxml openxml-sdk

使用OpenXML heading1样式正常运行但heading2样式不正常时,我遇到了问题。我应该访问标题的原因是因为我正在复制已经预装了样式的模板word文档。

创建标题的功能

public static Paragraph CreateHeading(string text, Body body, string type)
 {
            Paragraph para = body.AppendChild(new Paragraph());
            Run run = para.AppendChild(new Run());
            run.AppendChild(new Text(text));
            para.ParagraphProperties = new ParagraphProperties(new ParagraphStyleId() { Val = type });

            return para;
 }

public CustomizationInformation GenerateDocumentation(WordprocessingDocument document, EntityMetadata metadata, CustomizationInformation customizations)
        {
            _metadata = metadata;
            _customizations = customizations;

            // Create our table
            _table = TableFactory.CreateTable();


            //ParagraphFactory.CreateHeading("Attributes", document.MainDocumentPart.Document.Body, "Heading1"); // **
            ParagraphFactory.CreateHeading("Attributes", document.MainDocumentPart.Document.Body, "Heading2"); // **

            document.MainDocumentPart.Document.Body.Append(ParagraphFactory.Create("The following attributes are exposed on this entity."));

            // Initialize table
            initializeTable();
            addAttributes();

            // Add our table to the document
            document.MainDocumentPart.Document.Body.Append(_table);

            return _customizations;
        }

*位于上述代码中的位置。 Heading1功能正常,但Heading2未显示。

感谢您的帮助,我很感激。

1 个答案:

答案 0 :(得分:1)

我做了一个测试,在Word文档中使用样式时似乎必须考虑几件事情:

  • 在文档文件中,可能没有所有样式的定义(即使不是所有样式的定义,除非它们应用于文档中的文本),因此在从代码编辑文档时,您应该验证相应的样式声明如果您想将它用于段落,则存在(并在需要时添加一个)。
  • Val ParagraphStyleId属性中指定的值不应被视为常量,即使对于基本样式(如标题),因为在其他语言版本的MS Word中,这些样式的名称可以不同。< / LI>

您应该能够在StyleDefinitionsPart部分的文档中找到样式定义。您可以使用此代码列出文档中定义的样式(它仅用于测试,我希望保持简单,但如果您想在您的应用中使用它,您应该添加null值的检查和多个处理零件集合中的元素):

var sDParts = document.MainDocumentPart.GetPartsOfType<StyleDefinitionsPart>();
foreach (var style in sDParts.First().Styles.ChildElements.OfType<Style>())
{
    Console.WriteLine("Style id: {0}, style name: {1}", 
        style.StyleId, 
        style.StyleName.Val);
}

我认为style.StyleId中设置的值是应该用于Val元素中PagraphStyleId属性的值。