正文有多组有序列表,希望将每组有序列表都重新开始编号如何实现 使用IsRestartAtEachSection接口似乎达不到效果

比如想要生成的正文内容2组有序列表如下:
第一组:
1.
2.
3.
第二组:
1.
2.
3.

实际情况是:
第一组:
1.
2.
3.
第二组:
4.
5.
6.

@jumy 起来输出中的两个组都使用了相同的 List。 如果您使用 DocumentBuilder 构建文档,则可以使用如下代码来实现此目的:

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

builder.Writeln("The first gourp");
builder.ListFormat.ApplyNumberDefault();
for (int i = 0; i < 3; i++)
    builder.Writeln($"Item {i + 1}");

builder.ListFormat.RemoveNumbers();
builder.Writeln("The Second gourp");
builder.ListFormat.ApplyNumberDefault();
for (int i = 0; i < 3; i++)
    builder.Writeln($"Item {i + 1}");
builder.ListFormat.RemoveNumbers();

doc.Save(@"C:\Temp\out.docx");

out.docx (7.8 KB)

如果问题仍然存在,请向您提供输入、输出和预期输出文档以及允许我们重现问题的代码。 我们将检查该问题并为您提供更多信息。

以下是我的测试Demo:

Aspose.Words.Document docTemplate = new Aspose.Words.Document("Template2.docx");
Aspose.Words.Document doc = new Aspose.Words.Document();
Aspose.Words.NodeImporter nodeimporter = new Aspose.Words.NodeImporter(docTemplate, doc, Aspose.Words.ImportFormatMode.KeepSourceFormatting);
Aspose.Words.NodeCollection nodecollection = (Aspose.Words.NodeCollection)docTemplate.FirstSection.Body.GetChildNodes(NodeType.Paragraph, true);
for (int nFirstIndex = 0; nFirstIndex < 2; nFirstIndex++)
{
    for (int nIndex = 0; nIndex < nodecollection.Count; nIndex++)
    {
        if (nIndex == 2)
        {
            for (int nSecondIndex = 0; nSecondIndex < 2; nSecondIndex++)
            {
                Paragraph paragraphNew = (Paragraph)nodeimporter.ImportNode(nodecollection[nIndex], true);
                doc.FirstSection.Body.AppendChild(paragraphNew);
            }
        }
        else
        {
            Paragraph paragraphNew = (Paragraph)nodeimporter.ImportNode(nodecollection[nIndex], true);
            doc.FirstSection.Body.AppendChild(paragraphNew);
        }
    }
}
doc.Save(@"out.docx");

下面是测试用到的模板文件和生成的目标文件,可以看到目标文件中,章节2下面的列表是从3开始编号的,请问如何能从1开始编号,也即重新开始编号?
Demo.zip (144 字节)

@jumy 附加的存档是空的。 但我认为,您可以通过指示节点导入器保留原始编号来解决问题。 请看下面的代码:

ImportFormatOptions opt = new ImportFormatOptions();
opt.KeepSourceNumbering = true;
Aspose.Words.NodeImporter nodeimporter = new Aspose.Words.NodeImporter(docTemplate, doc, Aspose.Words.ImportFormatMode.KeepSourceFormatting, opt);

按您的建议试了还是没有效果,我重新传您附件。麻烦再帮忙看下。
Demo.zip (30.7 KB)

@jumy 请尝试使用以下代码来获得所需的结果:

Document doc = new Document();
ImportFormatOptions opt = new ImportFormatOptions();
opt.KeepSourceNumbering = true;
for (int nFirstIndex = 0; nFirstIndex < 2; nFirstIndex++)
{
    Document docTemplate = new Document(@"C:\Temp\Template2.docx");
    docTemplate.FirstSection.PageSetup.SectionStart = SectionStart.Continuous;
    doc.AppendDocument(docTemplate, ImportFormatMode.KeepSourceFormatting, opt);
}
doc.Save(@"C:\Temp\out.docx");

我这边实际用法就是类似于我demo的用法,我需要根据模板文档所有内容(真实场景中段内容里面会设计一些语法标签)、语法、数据去生成目标文档。我并不想每次都生成个section对象,请问还有其他解决方案吗?

@jumy 当然,您可以使用“DocumentBuilder.InsertDocument”方法:

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
ImportFormatOptions opt = new ImportFormatOptions();
opt.KeepSourceNumbering = true;
for (int nFirstIndex = 0; nFirstIndex < 2; nFirstIndex++)
{
    Document docTemplate = new Document(@"C:\Temp\Template2.docx");
    builder.MoveToDocumentEnd(); // Here you can move cursor to the desired place in the document.
    builder.InsertDocument(docTemplate, ImportFormatMode.KeepSourceFormatting, opt);
}
doc.Save(@"C:\Temp\out.docx");

如果不使用InsertDocument接口呢,我只是想插入一个段,就像我demo中一样,而不是一整个文档

@jumy 当您在 MS Word 中重新启动编号时,MS Word 只是创建一个新列表。 因此,在您的情况下,您还应该为插入的段落创建一个新列表。 请参阅我们的文档以了解有关列表的更多信息:
https://docs.aspose.com/words/net/working-with-lists/

Document doc = new Document();
Document docTemplate = new Document(@"C:\Temp\Template2.docx");
Dictionary<int, Aspose.Words.Lists.List> oldToNewList = new Dictionary<int, Aspose.Words.Lists.List>();
ImportFormatOptions opt = new ImportFormatOptions();
opt.KeepSourceNumbering = true;
NodeImporter nodeimporter = new NodeImporter(docTemplate, doc, ImportFormatMode.KeepSourceFormatting, opt);
for (int nFirstIndex = 0; nFirstIndex < 5; nFirstIndex++)
{
    NodeCollection paragraphs = docTemplate.FirstSection.Body.Paragraphs;
    foreach (Paragraph paragraph in paragraphs)
    {
        if (paragraph.IsListItem)
        {
            if (!oldToNewList.ContainsKey(paragraph.ListFormat.List.ListId))
            {
                // Add copy of the list.
                Aspose.Words.Lists.List copy = docTemplate.Lists.AddCopy(paragraph.ListFormat.List);
                oldToNewList[paragraph.ListFormat.List.ListId] = copy;
            }
            // Assign new list to the paragraph
            paragraph.ListFormat.List = oldToNewList[paragraph.ListFormat.List.ListId];

        }

        Paragraph targetNode = (Paragraph)nodeimporter.ImportNode(paragraph, true);
        doc.FirstSection.Body.AppendChild(targetNode);
    }
}
doc.Save(@"C:\Temp\out.docx");

问题已经解决,非常感谢!!!

1 Like