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;
        }
Ejemplo n.º 2
0
        /// <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);
        }