private int AddParagraphToWordNumbering(WordprocessingDocument doc, int numberingID) { MainDocumentPart mainPart = doc.MainDocumentPart; WordDoc.Body body = mainPart.Document.Body; WordDoc.Paragraph para = body.AppendChild(new WordDoc.Paragraph()); NumberingDefinitionsPart numberingPart = mainPart.NumberingDefinitionsPart; WordDoc.Numbering nn = numberingPart.Numbering; int numid = 0; if (numberingID == -1) { foreach (WordDoc.NumberingInstance num in nn.Elements<WordDoc.NumberingInstance>()) { numid = num.NumberID; } numid++; WordDoc.NumberingInstance newNI = new WordDoc.NumberingInstance( new WordDoc.AbstractNumId() { Val = numid }, new WordDoc.LevelOverride( new WordDoc.StartOverrideNumberingValue() { Val = 1 } ) { LevelIndex = 0 } ) { NumberID = numid }; nn.Append(newNI); nn.Save(numberingPart); } else { numid = numberingID; } WordDoc.ParagraphProperties pp = para.AppendChild(new WordDoc.ParagraphProperties( new WordDoc.NumberingProperties( new WordDoc.NumberingLevelReference() { Val = 0 }, new WordDoc.NumberingId() { Val = numid }))); return numid; }
/// <summary> /// Get paragraph's numbering level object by searching abstractNums with the numbering level ID. /// </summary> /// <param name="pg"></param> /// <returns></returns> public Word.Level GetNumbering(Word.Paragraph pg) { Word.Level ret = null; if (pg == null || this.numbering == null) { return(ret); } Word.ParagraphProperties pgpr = pg.Elements <Word.ParagraphProperties>().FirstOrDefault(); if (pgpr == null) { return(ret); } // direct numbering Word.NumberingProperties numPr = pgpr.Elements <Word.NumberingProperties>().FirstOrDefault(); if (numPr != null && numPr.NumberingId != null) { int numId = numPr.NumberingId.Val; if (numId > 0) // numId == 0 means this paragraph doesn't have a list item { int? ilvl = null; String refStyleName = null; if (numPr.NumberingLevelReference != null) { // ilvl included in NumberingProperties ilvl = numPr.NumberingLevelReference.Val; } else { // doesn't have ilvl in NumberingProperties, search by referenced style name Word.Style st = pgpr.Elements <Word.Style>().FirstOrDefault(); if (st != null && st.StyleName != null) { refStyleName = st.StyleName.Val; } } // find abstractNumId by numId Word.NumberingInstance numInstance = this.numbering.Elements <Word.NumberingInstance>().FirstOrDefault(c => c.NumberID.Value == numId); if (numInstance != null) { // find abstractNum by abstractNumId Word.AbstractNum abstractNum = (Word.AbstractNum) this.numbering.Elements <Word.AbstractNum>().FirstOrDefault(c => c.AbstractNumberId.Value == numInstance.AbstractNumId.Val); if (abstractNum != null) { if (ilvl != null) // search by ilvl { ret = abstractNum.Elements <Word.Level>().FirstOrDefault(c => c.LevelIndex == ilvl); } else if (refStyleName != null) // search by matching referenced style name { ret = abstractNum.Elements <Word.Level>().FirstOrDefault(c => { return((c.ParagraphStyleIdInLevel != null) ? c.ParagraphStyleIdInLevel.Val == refStyleName : false); }); } } } } } // TODO: linked style if (ret == null) { ; } return(ret); }