簡體   English   中英

如何使用openxml sdk和c#在word文檔中添加多級列表?

[英]How to add multilevel list in word document using openxml sdk and c#?

我正在嘗試使用 openxml sdk v2.5 和 C# 以編程方式在 word 文檔中實現多級列表。 我使用以下代碼來在多級列表中顯示標題。 我正在調用 AddHeading 方法並傳遞相應的參數,如下所示。 我的預期結果如下。

1.  Parent
    1.1. childItem
      1.1.1. subchildItem
    1.2. childItem
2.  Parent
    2.1. childItem
3.  Parent

但我得到的輸出是

1. Parent
    1. childItem
      1. subchildItem
    2. childItem
2.  Parent
    1. childItem
3.  Parent
public static void AddHeading(WordprocessingDocument document, string colorVal, int fontSizeVal, string styleId, string styleName, string headingText, int numLvlRef, int numIdVal)
        {
            StyleRunProperties styleRunProperties = new StyleRunProperties();
            Color color = new Color() { Val = colorVal };
            DocumentFormat.OpenXml.Wordprocessing.FontSize fontSize1 = new DocumentFormat.OpenXml.Wordprocessing.FontSize();
            fontSize1.Val = new StringValue(fontSizeVal.ToString());

            styleRunProperties.Append(color);
            styleRunProperties.Append(fontSize1);
            AddStyleToDoc(document.MainDocumentPart.Document.MainDocumentPart, styleId, styleName, styleRunProperties, document);

            Paragraph p = new Paragraph();
            ParagraphProperties pp = new ParagraphProperties();
            pp.ParagraphStyleId = new ParagraphStyleId() { Val = styleId };
            pp.SpacingBetweenLines = new SpacingBetweenLines() { After = "0" };

            ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "ListParagraph" };
            NumberingProperties numberingProperties1 = new NumberingProperties();
            NumberingLevelReference numberingLevelReference1 = new NumberingLevelReference() { Val = numLvlRef };

            NumberingId numberingId1 = new NumberingId() { Val = numIdVal }; //Val is 1, 2, 3 etc based on your numberingid in your numbering element

            numberingProperties1.Append(numberingLevelReference1); Indentation indentation1 = new Indentation() { FirstLineChars = 0 };
            numberingProperties1.Append(numberingId1);
            pp.Append(paragraphStyleId1);
            pp.Append(numberingProperties1);
            pp.Append(indentation1);
            p.Append(pp);
            Run r = new Run();
            Text t = new Text(headingText) { Space = SpaceProcessingModeValues.Preserve };
            r.Append(t);
            p.Append(r);

            document.MainDocumentPart.Document.Body.Append(p);
        }


      public static void AddStyleToDoc(MainDocumentPart mainPart, string styleid, string stylename, StyleRunProperties styleRunProperties, WordprocessingDocument document)
        {
            StyleDefinitionsPart part = mainPart.StyleDefinitionsPart;
            if (part == null)
            {
                part = AddStylesPartToPackage(mainPart);
                AddNewStyle(part, styleid, stylename, styleRunProperties);
            }
            else
            {
                if (IsStyleIdInDocument(mainPart, styleid) != true)
                {
                    string styleidFromName = GetStyleIdFromStyleName(document, stylename);
                    if (styleidFromName == null)
                    {
                        AddNewStyle(part, styleid, stylename, styleRunProperties);
                    }
                    else
                        styleid = styleidFromName;
                }
            }
        }

        public static string GetStyleIdFromStyleName(WordprocessingDocument doc, string styleName)
        {
            StyleDefinitionsPart stylePart = doc.MainDocumentPart.StyleDefinitionsPart;
            string styleId = stylePart.Styles.Descendants<StyleName>()
                .Where(s => s.Val.Value.Equals(styleName) &&
                    (((Style)s.Parent).Type == StyleValues.Paragraph))
                .Select(n => ((Style)n.Parent).StyleId).FirstOrDefault();

            return styleId;
        }

        public static StyleDefinitionsPart AddStylesPartToPackage(MainDocumentPart mainPart)
        {
            StyleDefinitionsPart part;
            part = mainPart.AddNewPart<StyleDefinitionsPart>();
            DocumentFormat.OpenXml.Wordprocessing.Styles root = new DocumentFormat.OpenXml.Wordprocessing.Styles();
            root.Save(part);
            return part;
        }

        public static bool IsStyleIdInDocument(MainDocumentPart mainPart, string styleid)
        {
            DocumentFormat.OpenXml.Wordprocessing.Styles s = mainPart.StyleDefinitionsPart.Styles;

            int n = s.Elements<DocumentFormat.OpenXml.Wordprocessing.Style>().Count();
            if (n == 0)
                return false;

            DocumentFormat.OpenXml.Wordprocessing.Style style = s.Elements<DocumentFormat.OpenXml.Wordprocessing.Style>()
                .Where(st => (st.StyleId == styleid) && (st.Type == StyleValues.Paragraph))
                .FirstOrDefault();
            if (style == null)
                return false;

            return true;
        }

        private static void AddNewStyle(StyleDefinitionsPart styleDefinitionsPart, string styleid, string stylename, StyleRunProperties styleRunProperties)
        {
            DocumentFormat.OpenXml.Wordprocessing.Styles styles = styleDefinitionsPart.Styles;

            DocumentFormat.OpenXml.Wordprocessing.Style style = new DocumentFormat.OpenXml.Wordprocessing.Style()
            {
                Type = StyleValues.Paragraph,
                StyleId = styleid,
                CustomStyle = false
            };
            style.Append(new StyleName() { Val = stylename });
            style.Append(new BasedOn() { Val = "Normal" });
            style.Append(new NextParagraphStyle() { Val = "Normal" });
            style.Append(new UIPriority() { Val = 900 });

            styles.Append(style);
        }

要在 Microsoft Word 中使用多級列表,您需要確保:

  1. 您在編號定義部分正確設置了所需的多級列表(意味着您的w:numbering元素包含一個w:num和相應的w:abstractNum ,用於指定不同的列表級別);
  2. 每個列表級別都有一種樣式,它同時引用w:num元素指定的編號 ID 和所需的列表級別;
  3. 您的段落引用了列表級別的正確樣式。

請查看我關於如何使用 Open XML 創建多級有序列表使用 C# 和 Open XML SDK 在 Word 文檔中顯示多級列表的答案,以獲取更多詳細信息和說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM