C# 如何在ASP.net中使用开放式XML创建多级有序列表?
我花了无数个小时试图理解开放XML中的有序列表。这里有许多参考资料 我发现这个简单文档创建者的例子非常有用 另外,如果我可能会抱怨一点,我必须说这是一个痛苦的学习曲线。创建编号属性并引用正确的C# 如何在ASP.net中使用开放式XML创建多级有序列表?,c#,openxml,docx,openxml-sdk,openxml-powertools,C#,Openxml,Docx,Openxml Sdk,Openxml Powertools,我花了无数个小时试图理解开放XML中的有序列表。这里有许多参考资料 我发现这个简单文档创建者的例子非常有用 另外,如果我可能会抱怨一点,我必须说这是一个痛苦的学习曲线。创建编号属性并引用正确的abstractNumberId,列表将继续 有人有完整的代码创建多级列表的例子吗?我可以在没有自定义设置的情况下执行此操作,如设置NumberFormatValues.Decimal。一旦你想开始控制列表类型,你就会有大量的即时开销 以我开始的上述示例为例,我添加了一个level参数: public vo
abstractNumberId
,列表将继续
有人有完整的代码创建多级列表的例子吗?我可以在没有自定义设置的情况下执行此操作,如设置NumberFormatValues.Decimal
。一旦你想开始控制列表类型
,你就会有大量的即时开销
以我开始的上述示例为例,我添加了一个level
参数:
public void AddBulletList(List<Run> runList, int level)
请注意,我将格式类型更改为decimal。。。方法名是bullet,但我只是在这里测试
我还利用它来处理缩进:
var indentation = new Indentation() { Left = (720 * (level + 1)).ToString(), Hanging = "360" };
因此,在我的测试中,我向该方法发送了几个句子,将0
传递到level。然后,我发送了一些关于级别的消息
我的结果有两个问题:
1) 我不知道如何重置计数器,因此我得到以下结果:
1. Sentence 1
2. Sentence 2
3. Sentence 3
4. Sentence 1
5. Sentence 2
6. Sentence 3
我试图使用levelRestart
,但没有成功:
abstractLevel.LevelRestart = new LevelRestart(){ Val = 0 } // tried 1 also
我能让它重新启动的唯一方法是在插入第二个句子列表之前插入一个空白段落,但这有样式问题(间距)
我遇到的第二个问题是编号出现在WordDoc中,但它在Microsoft Word中显示为要点。此外,我在MicrosoftWord中收到一条兼容性模式警告
有人会过来说:
使用开放式XML生产力工具,创建一个文档并查看生成的代码
我的回答是:
看着一个小小的文档要测试的5000行代码,我的眼睛在流血
所以我觉得我非常接近。我的代码中有很多其他自定义项,这就是为什么我继续引用我开始的地方。如果有人可以举这个例子或提供一个现有的例子,我只想创建多级列表并控制使用的编号类型(lowerRoman、decimal等)
更新1
我真的不得不咬紧牙关,认真研究一下。在托马斯的帮助下,我得以继续前进,但似乎我还有一个棘手的问题。我的新排序列表不是从“1”开始的
请注意,在图像中,如果单击第一个列表的级别,它将仅高亮显示该列表。我希望他们是分开的,但显然不是。下一个列表应该从1开始
对于每个新的有序列表,我将为其分配一个新的numberId
,因此我不知道发生了什么。以下是生成的标记:
<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>
这是尸体:
<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>
列出一个项目1
列出一个项目2
列出两个项目1
列出两个项目2
虽然我从未使用过开放式XML生产力工具,但我经常使用并推荐。使用该包编辑器,您可以查看MicrosoftWord创建的开放XML标记,从中学习
所以,为了回答您的问题,我使用了一个Word模板,其中包含了几个多级列表,它们的行为与您希望它们的行为完全相同(我希望如此)
请注意,在多级列表的不同级别上,通常会有不同的编号格式(例如,小写字母、大写字母、小写罗马、大写罗马、十进制)
接下来,这是主文档部分对应的Open XML标记:
第一段,大纲级别0(在Word中显示为1)
第二段,关于大纲级别0
第三段,大纲级别1(在Word中显示为2)
第四段,关于大纲一级
请注意w:pStyle
和w:numPr
元素,它们指定要使用的带编号的段落样式,并且在也使用w:numPr
的情况下,覆盖样式中指定的编号默认值
接下来,这是样式定义部分的开放XML标记:
我只需要ListLowerLetter0
样式ListLowerLetter0List
是可选的列表样式。我总是在模板中使用它们。其他两种样式只是为了完整性和一致性。显然,现实生活中的样式定义部分包含更多样式和其他元素
最后,我们有了O
<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>
(a) First paragraph, on outline level 0 (shown as 1 in Word)
(b) Second paragraph, on outline level 0
(1) Third paragraph, on outline level 1 (shown as 2 in Word)
(2) Fourth paragraph, on outline level 1
var num = new NumberingInstance
{
NumberID = 43,
AbstractNumId = new AbstractNumId { Val = 67 }
};
var num =
new XElement(W.num, new XAttribute(W.numId, 43),
new XElement(W.abstractNumId, new XAttribute(W.val, 67)));