You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C#中从文本创建多级列表并导出至MS Word(附示例)

在C#中从文本生成多级列表并导出至MS Word的实现方案

嘿,我来给你详细拆解怎么在C#里实现从文本生成多级列表并导出到Word,就用你给的那个选择题当实际示例来演示~

一、选对工具省一半事

我推荐用DocX库,它是对OpenXML SDK的轻量封装,不用去啃复杂的XML结构,写代码效率高很多。首先得通过NuGet安装它:

Install-Package DocX

或者直接在Visual Studio的NuGet包管理器里搜索DocX安装就行。

二、先把文本转成层级结构

咱们先把你给的选择题转换成多级列表的数据结构——比如题目是一级列表项,四个选项是它的二级子项。可以用一个简单的类来存储每一项的文本和层级:

// 定义用来存储层级列表项的类
public class HierarchicalListItem
{
    // 列表项的文本内容
    public string Content { get; set; }
    // 当前项的层级(1=一级,2=二级,以此类推)
    public int Level { get; set; }
    // 子列表项
    public List<HierarchicalListItem> SubItems { get; set; } = new List<HierarchicalListItem>();
}

// 把你的选择题转换成层级数据
var questionList = new List<HierarchicalListItem>
{
    new HierarchicalListItem
    {
        Content = "Ibrahim was one of the ____ men.",
        Level = 1,
        SubItems = new List<HierarchicalListItem>
        {
            new HierarchicalListItem { Content = "A) wise", Level = 2 },
            new HierarchicalListItem { Content = "B) more wise", Level = 2 },
            new HierarchicalListItem { Content = "C) wiser", Level = 2 },
            new HierarchicalListItem { Content = "D) wisest", Level = 2 }
        }
    }
};

三、生成Word文档并插入多级列表

接下来就是核心代码:创建Word文档,定义多级列表样式,然后把咱们的层级数据递归插入进去:

using System;
using System.Collections.Generic;
using Novacode;

class Program
{
    static void Main(string[] args)
    {
        // 构建好的层级列表数据(就是上面的questionList)
        var questionList = new List<HierarchicalListItem>
        {
            new HierarchicalListItem
            {
                Content = "Ibrahim was one of the ____ men.",
                Level = 1,
                SubItems = new List<HierarchicalListItem>
                {
                    new HierarchicalListItem { Content = "A) wise", Level = 2 },
                    new HierarchicalListItem { Content = "B) more wise", Level = 2 },
                    new HierarchicalListItem { Content = "C) wiser", Level = 2 },
                    new HierarchicalListItem { Content = "D) wisest", Level = 2 }
                }
            }
        };

        // 指定要生成的Word文档路径(记得替换成你自己的路径)
        var docPath = @"C:\YourFolder\QuestionDocument.docx";

        // 创建新的Word文档
        using (var document = DocX.Create(docPath))
        {
            // 创建自定义的多级列表样式
            var multiLevelStyle = document.AddListStyle("CustomQuestionList", ListNumberingType.multiLevel);

            // 配置一级列表样式:加粗,无编号(因为题目不需要编号)
            multiLevelStyle.Levels[0].NumberFormat = "";
            multiLevelStyle.Levels[0].ParagraphFormat.Bold = true;
            // 配置二级列表样式:缩进40磅,保持原选项的编号格式
            multiLevelStyle.Levels[1].NumberFormat = "";
            multiLevelStyle.Levels[1].ParagraphFormat.LeftIndentation = 40;

            // 递归插入所有列表项
            foreach (var item in questionList)
            {
                InsertListItem(document, item, multiLevelStyle);
            }

            // 保存文档
            document.Save();
            Console.WriteLine($"文档已成功生成到:{docPath}");
        }
    }

    // 递归插入层级列表项的辅助方法
    static void InsertListItem(DocX doc, HierarchicalListItem item, ListStyle style)
    {
        // 插入当前项的段落
        var paragraph = doc.InsertParagraph(item.Content);
        // 应用对应的列表层级样式
        paragraph.SetListStyle(style, item.Level);

        // 如果有子项,递归插入
        foreach (var subItem in item.SubItems)
        {
            InsertListItem(doc, subItem, style);
        }
    }
}

// 层级列表项类
public class HierarchicalListItem
{
    public string Content { get; set; }
    public int Level { get; set; }
    public List<HierarchicalListItem> SubItems { get; set; } = new List<HierarchicalListItem>();
}

四、一些实用的定制技巧

  • 如果想要给列表加自动编号(比如一级用1.,二级用a)),只需要修改NumberFormat属性:
    // 一级用数字编号
    multiLevelStyle.Levels[0].NumberFormat = "%1.";
    // 二级用小写字母加括号
    multiLevelStyle.Levels[1].NumberFormat = "%2)";
    
  • 要是你对文档格式有极精细的要求(比如自定义字体、行间距),也可以用微软官方的OpenXML SDK,不过代码会繁琐不少,需要手动处理XML节点。
  • 注意生成文档的路径要确保有写入权限,不然会抛出权限异常哦。

内容的提问来源于stack exchange,提问作者zain ularifeen

火山引擎 最新活动