I've spent countless hours trying to understand ordered lists in Open XML. Here's one of many references.
I found this incredibly helpful example of a simple document creator here.
Also if I may gripe a little bit, I must say this is a painful learning curve. Creating numbering properties and referencing the correct abstractNumberId
and the list goes on and on.
Does anyone have a complete example of creating multi-level lists in code? I can do so with no custom settings, as in setting the NumberFormatValues.Decimal
. As soon as you want to start controlling the listType
you have a lot of instant overhead.
Taking the above example that I started with, I added a level
argument:
public void AddBulletList(List<Run> runList, int level)
I incorporate it on this line:
var abstractLevel = new Level(new NumberingFormat() {
Val = NumberFormatValues.Decimal}, new LevelText() {Val = "·"}) {LevelIndex = level};
Notice that I changed the format type to decimal... the method name says bullet but I'm just testing here.
I also leverage it to handle the indentation:
var indentation = new Indentation() { Left = (720 * (level + 1)).ToString(), Hanging = "360" };
So in my tests, I send a few sentences to the method passing in 0
for level. Then I send a few more passing in 1
for level.
Two issues with my results:
1) I can't figure out how to reset the counter, so I get this:
1. Sentence 1
2. Sentence 2
3. Sentence 3
4. Sentence 1
5. Sentence 2
6. Sentence 3
I attempted to use the levelRestart
but that didn't work:
abstractLevel.LevelRestart = new LevelRestart(){ Val = 0 } // tried 1 also
The only way I could get it to restart was to insert a blank paragraph before inserting the second list of sentences but this has styling issues (spacing).
The second issue that I'm having is the numbering appears in WordDoc, but it shows as bullet points in Microsoft Word. In addition, I get a compatibility mode warning in Microsoft Word.
Someone will come along and say:
Use Open XML Productivity Tools and create a doc and look at the generated code
Well my response to that is:
My eyes are bleeding after looking at the 5,000 lines of code a tiny little document to test with creates.
So I feel like I'm super close. I have a lot of other customizations in my code which is why I continue to reference where I started. If someone could take that example or provide an existing one, I simply want to create multi-level lists and control the type of numbering (lowerRoman, decimal, etc.) is used.
Update 1
I've really just had to bite the bullet and do some serious studying. With Thomas' help I've been able to press forward, but it seems I have one more pesky issue. My new ordered lists do not start at "1".
Notice how in the image, if I click on the level for the first list, it highlights only that list. I expect them to be separate but apparently not. The next list should start at 1.
For each new ordered list, I'm assigning it a new numberId
so I don't know what's happening. Here's the generated markup:
<w:numbering xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14">
<w:abstractNum w:abstractNumId="1" w15:restartNumberingAfterBreak="1">
<w:nsid w:val="191025D9" />
<w:multiLevelType w:val="hybridMultilevel" />
<w:tmpl w:val="48A2E570" />
<w:lvl w:ilvl="0" w:tplc="0409000F">
<w:start w:val="1" />
<w:numFmt w:val="decimal" />
<w:lvlText w:val="%1." />
<w:lvlJc w:val="left" />
<w:pPr>
<w:ind w:start="720" w:hanging="360" />
</w:pPr>
</w:lvl>
<w:lvl w:ilvl="1" w:tplc="04090019">
<w:start w:val="1" />
<w:numFmt w:val="lowerLetter" />
<w:lvlText w:val="%2." />
<w:lvlJc w:val="left" />
<w:pPr>
<w:ind w:start="1440" w:hanging="360" />
</w:pPr>
</w:lvl>
</w:abstractNum>
<w:abstractNum w:abstractNumId="2" w15:restartNumberingAfterBreak="1">
<w:nsid w:val="191025D9" />
<w:multiLevelType w:val="hybridMultilevel" />
<w:tmpl w:val="48A2E570" />
<w:lvl w:ilvl="0" w:tplc="0409000F">
<w:start w:val="1" />
<w:numFmt w:val="decimal" />
<w:lvlText w:val="%1." />
<w:lvlJc w:val="left" />
<w:pPr>
<w:ind w:start="720" w:hanging="360" />
</w:pPr>
</w:lvl>
<w:lvl w:ilvl="1" w:tplc="04090019">
<w:start w:val="1" />
<w:numFmt w:val="lowerLetter" />
<w:lvlText w:val="%2." />
<w:lvlJc w:val="left" />
<w:pPr>
<w:ind w:start="1440" w:hanging="360" />
</w:pPr>
</w:lvl>
</w:abstractNum>
<w:num w:numId="1">
<w:abstractNumId w:val="1" />
</w:num>
<w:num w:numId="2">
<w:abstractNumId w:val="2" />
</w:num>
</w:numbering>
Here's the body:
<w:body xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph" />
<w:numPr>
<w:ilvl w:val="0" />
<w:numId w:val="1" />
</w:numPr>
</w:pPr>
<w:r>
<w:t>List one item 1</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph" />
<w:numPr>
<w:ilvl w:val="0" />
<w:numId w:val="1" />
</w:numPr>
</w:pPr>
<w:r>
<w:t>List one item 2</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph" />
<w:numPr>
<w:ilvl w:val="0" />
<w:numId w:val="2" />
</w:numPr>
</w:pPr>
<w:r>
<w:t>List two item 1</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph" />
<w:numPr>
<w:ilvl w:val="0" />
<w:numId w:val="2" />
</w:numPr>
</w:pPr>
<w:r>
<w:t>List two item 2</w:t>
</w:r>
</w:p>
</w:body>