Lists

This demo uses the DevExpress Word Processing Document API to generate a list in a new document.

Select the list type: bullets, numbers, or multi-level. Specify list parameters. Expand the Additional Settings section to configure list spacing options.

Click Generate a List and Save as… to select an output format, generate a document, and download the result.




using DevExpress.XtraRichEdit;
using DevExpress.XtraRichEdit.API.Native;

Stream CreateBulletList(int itemCount, string bullet, float indent, float hangingIndent, float spacingBeforePoints, float spacingAfterPoints, DocumentFormat targetFormat) {
    using var wordProcessor = new RichEditDocumentServer();
    var document = wordProcessor.Document;

    // Set document unit to inches for precise sizing
    document.Unit = DevExpress.Office.DocumentUnit.Inch;

    for (int i = 1; i <= itemCount; i++) {
        var itemText = $"Item {i}\n";
        document.AppendText(itemText);
    }
    document.Delete(document.Paragraphs.Last().Range);

    // Create a new list pattern object
    AbstractNumberingList list = document.AbstractNumberingLists.Add();

    //Specify the list's type
    list.NumberingType = NumberingType.Bullet;
    ListLevel level = list.Levels[0];
    ApplyListLevelFormatting(level, NumberingFormat.Bullet, bullet, 1, indent, hangingIndent, spacingBeforePoints, spacingAfterPoints);

    //Create a new list based on the specific pattern
    NumberingList bulletedList = document.NumberingLists.Add(0);

    // Add paragraphs to the list
    ParagraphCollection paragraphs = document.Paragraphs;
    paragraphs.AddParagraphsToList(document.Range, bulletedList, 0);

    var outputStream = new MemoryStream();
    wordProcessor.SaveDocument(outputStream, targetFormat);
    outputStream.Position = 0;
    return outputStream;
}

Stream CreateNumberingList(int itemCount, NumberingFormat numberingFormat, int startNumber, float indent,
    float hangingIndent, float spacingBeforePoints, float spacingAfterPoints, DocumentFormat targetFormat) {
    using var wordProcessor = new RichEditDocumentServer();
    var document = wordProcessor.Document;

    // Set document unit to inches for precise sizing
    document.Unit = DevExpress.Office.DocumentUnit.Inch;

    for (int i = 1; i <= itemCount; i++) {
        var itemText = $"Item {i}\n";
        document.AppendText(itemText);
    }
    document.Delete(document.Paragraphs.Last().Range);

    // Create a new list pattern object
    AbstractNumberingList list = document.AbstractNumberingLists.Add();

    //Specify the list's type
    list.NumberingType = NumberingType.Simple;
    ListLevel level = list.Levels[0];
    ApplyListLevelFormatting(level, numberingFormat, "{0}", startNumber, indent, hangingIndent, spacingBeforePoints, spacingAfterPoints);

    //Create a new list based on the specific pattern
    NumberingList numberingList = document.NumberingLists.Add(0);

    // Add paragraphs to the list
    ParagraphCollection paragraphs = document.Paragraphs;
    paragraphs.AddParagraphsToList(document.Range, numberingList, 0);

    var outputStream = new MemoryStream();
    wordProcessor.SaveDocument(outputStream, targetFormat);
    outputStream.Position = 0;
    return outputStream;
}

Stream CreateMultilevelList(int itemCount, int levels, List<NumberingFormat> numberingFormats, List<string> displayFormats, float indent,
    float hangingIndent, float spacingBeforePoints, float spacingAfterPoints, DocumentFormat targetFormat) {
    using var wordProcessor = new RichEditDocumentServer();
    var document = wordProcessor.Document;

    // Set document unit to inches for precise sizing
    document.Unit = DevExpress.Office.DocumentUnit.Inch;

    for (int i = 1; i <= itemCount; i++) {
        for (int j = 1; j <= levels; j++) {
            var itemText = $"Item {i} - Level {j}\n";
            document.AppendText(itemText);
        }
    }
    document.Delete(document.Paragraphs.Last().Range);

    // Create a new list pattern object
    AbstractNumberingList list = document.AbstractNumberingLists.Add();

    //Specify the list's type
    list.NumberingType = NumberingType.MultiLevel;

    for (int i = 0; i < levels; i++) {
        var level = list.Levels[i];
        ApplyListLevelFormatting(level, numberingFormats[i], displayFormats[i], 1, indent + 0.1f * i, hangingIndent + 0.1f * i, spacingBeforePoints, spacingAfterPoints);
    }

    //Create a new list based on the specific pattern
    NumberingList multilevelList = document.NumberingLists.Add(0);

    // Add paragraphs to the list
    ParagraphCollection paragraphs = document.Paragraphs;
    paragraphs.AddParagraphsToList(document.Range, multilevelList, 0);
    foreach (Paragraph paragraph in paragraphs)
        paragraph.ListLevel = paragraph.Index % levels;

    var outputStream = new MemoryStream();
    wordProcessor.SaveDocument(outputStream, targetFormat);
    outputStream.Position = 0;
    return outputStream;
}

void ApplyListLevelFormatting(ListLevel level, NumberingFormat numberingFormat, string displayFormat, int startNumber, float indent,
    float hangingIndent, float spacingBeforePoints, float spacingAfterPoints) {
    level.NumberingFormat = numberingFormat;
    level.DisplayFormatString = displayFormat;
    level.Start = startNumber;

    level.ParagraphProperties.LeftIndent = indent + hangingIndent;
    level.ParagraphProperties.FirstLineIndentType = ParagraphFirstLineIndent.Hanging;
    level.ParagraphProperties.FirstLineIndent = hangingIndent;

    //Convert points to inches for spacing
    level.ParagraphProperties.SpacingBefore = spacingBeforePoints / 72;
    level.ParagraphProperties.SpacingAfter = spacingAfterPoints / 72;
}