在新文档中复制项目符号列表编号?

Posted

技术标签:

【中文标题】在新文档中复制项目符号列表编号?【英文标题】:Copy bullet list number in new document? 【发布时间】:2015-12-20 16:01:20 【问题描述】:

我有一个这样的节点导入器

Dim nodeImporter As New Aspose.Words.NodeImporter(_wordDocument, documentComponentDocument,
 Aspose.Words.ImportFormatMode.UseDestinationStyles)

我正在使用它将子节点从一个文档复制到另一个文档。我的子节点是一个项目符号列表。

documentComponentSection.Body.AppendChild(nodeImporter.ImportNode(childNode, True))

但我的问题是子节点的某些属性,例如 ListLabel,即项目符号列表 编号没有被复制

根据您的回答,我尝试了以下操作。但是当我为每个节点创建新文档时它不起作用。

Aspose.Words.Document srcDoc = new Aspose.Words.Document(Mydir + "input.docx");

            Aspose.Words.Document dstDoc = new Aspose.Words.Document();
            var ctr = 0;
            int listid = 0;
            Aspose.Words.Lists.List dstList = null;
            foreach (Aspose.Words.Paragraph paragraph in srcDoc.GetChildNodes(Aspose.Words.NodeType.Paragraph, true))
            
                Aspose.Words.NodeImporter imp = new Aspose.Words.NodeImporter(srcDoc, dstDoc, Aspose.Words.ImportFormatMode.KeepSourceFormatting);
                Aspose.Words.Node impNode = imp.ImportNode(paragraph, true);
                if (((Aspose.Words.Paragraph)impNode).IsListItem)
                
                    ((Aspose.Words.Paragraph)impNode).ListFormat.ListLevel.StartAt = paragraph.ListFormat.List.ListId;
                    if (listid != paragraph.ListFormat.List.ListId)
                    
                        listid = paragraph.ListFormat.List.ListId;
                        dstList = dstDoc.Lists.AddCopy(paragraph.ListFormat.List);
                    


                    ((Aspose.Words.Paragraph)impNode).ListFormat.List = dstList;
                
                dstDoc.FirstSection.Body.RemoveAllChildren();
                dstDoc.FirstSection.Body.AppendChild(impNode);
                var index = ctr++;
                dstDoc.Save(MyDir + index.ToString() + ".docx");
            

每个输出文档都包含列表索引为 1。

【问题讨论】:

【参考方案1】:

以下代码示例将列表项从源文档导入新的空文档并保留列表标签(编号)值。

Aspose.Words.Document srcDoc = new Aspose.Words.Document(MyDir  + "input.docx");
DocumentBuilder builder = new DocumentBuilder(srcDoc);
srcDoc.UpdateListLabels();

Aspose.Words.Document dstDoc = new Aspose.Words.Document();
int ctr = 0;
Aspose.Words.NodeImporter imp = new Aspose.Words.NodeImporter(srcDoc, dstDoc, Aspose.Words.ImportFormatMode.KeepSourceFormatting);

foreach (Aspose.Words.Paragraph paragraph in srcDoc.GetChildNodes(Aspose.Words.NodeType.Paragraph, true))

    if (paragraph.IsListItem)
    
        ListLabel label = paragraph.ListLabel;
        builder.MoveTo(paragraph);
        builder.StartBookmark("bookmark_" + label.LabelValue);
        builder.EndBookmark("bookmark_" + label.LabelValue);

        Aspose.Words.Node impNode = imp.ImportNode(paragraph, true);

        dstDoc.FirstSection.Body.RemoveAllChildren();
        dstDoc.FirstSection.Body.AppendChild(impNode);

        foreach (Bookmark bookmark in ((Aspose.Words.Paragraph)impNode).Range.Bookmarks)
        
            if (!bookmark.Name.StartsWith("bookmark_"))
                continue;

            String listLabel = bookmark.Name.Replace("bookmark_", "");

            try
            
                ((Aspose.Words.Paragraph)impNode).ListFormat.ListLevel.StartAt = Convert.ToInt32(listLabel);
                break;
            
            catch (Exception ex)
            
            
        

        ctr++;
        dstDoc.Range.Bookmarks.Clear();
        dstDoc.Save(MyDir + ctr.ToString() + ".docx");
    

如果问题仍然存在,请在Aspose.Words forum 中报告问题,并提供输入和预期输出文档。

我与 Aspose 合作,担任开发人员传道者。

【讨论】:

如果我愿意复制新文档中的每个节点怎么办。在这种情况下,每个文档的索引都将从 1 开始。我需要跟踪列表索引。 请注意,Aspose.Words 模仿与 MS Word 相同的行为。如果您从 Word 文档中复制一个列表项并将其粘贴到新的空文档中,您将获得相同的输出。列表项从 1 开始。要解决此问题,您可以在我的答案中使用更新的代码示例。希望这对您有所帮助。

以上是关于在新文档中复制项目符号列表编号?的主要内容,如果未能解决你的问题,请参考以下文章

Extjs HtmlEditor - 编号列表和项目符号列表

Word文档项目编号后边的一段空白怎么调整?

word2010如何设置项目符号和编号?

信创办公--基于WPS的Word最佳实践系列(利用项目符号及编号条理化文本)

Summernote lite 项目符号和编号列表不默认为自定义默认字体大小

Aspose.Words 如何获取word每个段落的编号 或者项目符号?