OpenXML Add paragraph style (Heading1,Heading2, He

2019-02-07 08:10发布

问题:

Can anybody guide me how to add predefined styles on paragraph using open XML Word Processing? I have tried various solutions available on forums but nothing works for me. Here is what i want to accomplish:

                // Create a document by supplying the filepath. 
                WordprocessingDocument wordDocument = WordprocessingDocument.Create("E:/Test/Executive.Docx", WordprocessingDocumentType.Document);

                // Add a main document part. 
                MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();

                // Create the document structure and add some text.
                mainPart.Document = new Document();
                Body body = mainPart.Document.AppendChild(new Body());
                Paragraph para = body.AppendChild(new Paragraph());

                Run run = para.AppendChild(new Run());
                run.AppendChild(new Text("Executive Summary"));
                if (para.Elements<ParagraphProperties>().Count() == 0)
                    para.PrependChild<ParagraphProperties>(new ParagraphProperties());

                // Get the ParagraphProperties element of the paragraph.
                ParagraphProperties pPr = para.Elements<ParagraphProperties>().First();

                // Set the value of ParagraphStyleId to "Heading3".
                pPr.ParagraphStyleId = new ParagraphStyleId() { Val = "Heading1" };

回答1:

Your technique would totally work if you were editing an existing document. The problem is that a fresh document doesn't have a "Heading 1" predefined. You'd have to add it. So you have two choices:

1. Work with an existing template document

Create a template document (TemplatePath) to use as a base. In the code, copy it to the final destination (FinalPath) and add text/whatever to it, applying styles. Heading 1 will already be in the template.

if (File.Exists(FinalPath))
  File.Delete(FinalPath);
File.Copy(TemplatePath, FinalPath);
WordprocessingDocument wordDocument = WordprocessingDocument.Open(FinalPath, true);
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Executive Summary"));
para.ParagraphProperties = new ParagraphProperties(new ParagraphStyleId() { Val="Heading1" });

2. Create your new document from scratch

If you do this, it will have no built-in styles. So create a style, call it "Heading 1" and apply it to your paragraph.

WordprocessingDocument wordDocument = WordprocessingDocument.Create(FinalPath, WordprocessingDocumentType.Document);
MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();
mainPart.Document = new Document();
Body body = mainPart.Document.AppendChild(new Body());
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Executive Summary"));
StyleDefinitionPart styleDefinitionsPart = wordDocument.AddStylesDefinitionPart();
Styles styles = styleDefinitionsPart.Styles;
Style style = new Style() {
  Type = StyleValues.Paragraph, 
  StyleId = styleid, 
  CustomStyle = true
};
StyleName styleName1 = new StyleName() { Val = "Heading1" };
style.Append(styleName1);
StyleRunProperties styleRunProperties1 = new StyleRunProperties();
styleRunProperties1.Append(new Bold);
styleRunProperties1.Append(new Italic());
styleRunProperties1.Append(new RunFonts() { Ascii = "Lucida Console" };);
styleRunProperties1.Append(new FontSize() { Val = "24" });  // Sizes are in half-points. Oy!
style.Append(styleRunProperties1);
styles.Append(style);
pPr.ParagraphStyleId = new ParagraphStyleId(){ Val = "Heading1" };
para.PrependChild<ParagraphProperties>(new ParagraphProperties());

<sarcasm>See? OpenXML is a piece of cake!</sarcasm> I swear, my eyes are rolling so hard I'm getting a headache.



回答2:

(Sry, my english)

I think the style names is depends your language, what use your word.

Heading 1 in english style id: "Heading 1" in Hungarien: "Címsor 1" -> stlye id: "Cmsor1"

I saw that, the docx xml style file.

How i solove this:

  1. "sample.docx" rename "sample.rar"
  2. Open the "sample.rar" with winrar.
  3. Open "word" folder.
  4. Open "style.xml" file.
  5. And search the style name or properties, what you need.

The style hierarchy is very important!

It's work for me table style also.