如何在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




