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;
}