Skip to content

Lists

doc.List(list => list
.Item("Prepare the data export")
.Item("Generate the report")
.Item("Archive the PDF/A file"));

Lists are unordered (bulleted) by default. For numbered lists:

doc.List(list => list
.Kind(ListKind.Ordered)
.Item("First step")
.Item("Second step"));

An item can be built like a paragraph, with runs and styles:

doc.List(list => list
.Item(item => item
.Text("Deadline: ")
.Text("22.07.2026", new TextStyle(FontWeight: FontWeight.Bold))));

Every Item overload takes an optional second callback that builds a sub-list below the item; each nesting level indents by the list’s marker width:

doc.List(list => list
.Kind(ListKind.Ordered)
.Item("Introduction", sub => sub
.Format(ListNumberFormat.LowerAlpha)
.Item("Scope")
.Item("Terms", subsub => subsub.Bullet("–").Item("as defined in §2")))
.Item("Main part"));

Each (sub-)list carries its own options; there is no automatic format cycling across levels.

Number formats, start values, markers, and indent

Section titled “Number formats, start values, markers, and indent”
doc.List(list => list
.Kind(ListKind.Ordered)
.Format(ListNumberFormat.UpperRoman) // Decimal (default), LowerAlpha/UpperAlpha, LowerRoman/UpperRoman
.Start(4) // IV. V. VI. …
.IndentWidth(32f) // marker width in points, added per nesting level
.Item("…"));
doc.List(list => list.Bullet("→").Item("custom marker"));
  • PDF - markers render as literal text with exact indents; a long list splits between items across pages (a single item stays on one page).
  • DOCX - native Word numbering, including in header/footer bands: nested items become deeper levels (w:ilvl) of one multi-level definition. Word allows one configuration per level within a definition, so the first sub-list at each depth defines that level.
  • XLSX - the marker becomes its own narrow worksheet cell next to the content cell; each nesting level adds a column to the sheet’s grid.