比如想要生成的正文内容2组有序列表如下:
第一组:
1.
2.
3.
第二组:
1.
2.
3.
实际情况是:
第一组:
1.
2.
3.
第二组:
4.
5.
6.
比如想要生成的正文内容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);
@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");
问题已经解决,非常感谢!!!