public partial class DemoTOC : Form { public DemoTOC() { InitializeComponent(); } Random rand = new Random(); private void DemoTOC_Load(object sender, EventArgs e) { GenerateContent(); } private void GenerateContent() { TreeNode root = new TreeNode("文档"); int count = rand.Next(5, 25); GenerateSubNode(root, count,true); trvContent.Nodes.Add(root); } private void GenerateSubNode(TreeNode parentNode, int count,bool isRoot) { for (int i = 1; i < count; i++) { TreeNode subNode = new TreeNode(); subNode.Text = string.Format(isRoot ? "第{0}章" : "第{0}节", i.ToString()); parentNode.Nodes.Add(subNode); if (isRoot) { int val = rand.Next(5,15); GenerateSubNode(subNode, val, false); } } } private void btnGenerate_Click(object sender, EventArgs e) { if(trvContent.Nodes.Count ==0 ) return; TreeNode root = trvContent.Nodes[0]; SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "Word document(*.docx)|*.docx"; if (dialog.ShowDialog() != DialogResult.OK) return; string fileName = dialog.FileName; using (WordprocessingDocument wdDoc = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document)) { MainDocumentPart mainPart = wdDoc.AddMainDocumentPart(); StyleDefinitionsPart stylePart = mainPart.AddNewPart<StyleDefinitionsPart>(); Styles styles = new Styles(); string styleId = "TOCStyle"; Style style = styles.AppendChild(new Style() { Type = StyleValues.Paragraph, StyleId = styleId }); StyleName styleName = new StyleName(){ Val = "TOC样式"}; style.Append(styleName); // 段属性 ParagraphProperties pPr = new ParagraphProperties(); // 间距:段前、段后 SpacingBetweenLines spaceing = new SpacingBetweenLines() { Before = "6300", After = "200" }; // 对齐方式 Justification jc = new Justification() { Val = JustificationValues.Center }; pPr.Append(spaceing); pPr.Append(jc); // 字体样式 StyleRunProperties rPr = new StyleRunProperties() { Bold = new Bold(), FontSize = new FontSize() { Val = "40" } }; style.Append(pPr); style.Append(rPr); // 多级编号 NumberingDefinitionsPart numPart = mainPart.AddNewPart<NumberingDefinitionsPart>(); Numbering numbering = new Numbering(); NumberingInstance num = new NumberingInstance(); AbstractNumId abstractNumId = new AbstractNumId() { Val = 1 }; num.Append(abstractNumId); numbering.Append(num); // pPr.NumberingProperties.NumberingId = "1"; numPart.Numbering = numbering; stylePart.Styles = styles; Document doc = new Document(); Body body =doc.AppendChild(new Body()); GenerateTOC(body,root,styleId); mainPart.Document = doc; } } private void GenerateTOC(Body body, TreeNode parentNode,string styleId) { foreach (TreeNode subNode in parentNode.Nodes) { // 添加一空白段 body.AppendChild(new Paragraph(new Run(new Text()))); // 添加段及应用样式 Paragraph p = body.AppendChild(new Paragraph()); ParagraphProperties newpPr = p.PrependChild(new ParagraphProperties()); newpPr.ParagraphStyleId = new ParagraphStyleId() { Val = styleId }; Run r = p.AppendChild(new Run()); r.AppendChild(new Text(subNode.Text)); // 插入分页符 body.InsertAfter(new Paragraph(new Run(new Break() { Type = BreakValues.Page })), p); GenerateTOC(body, subNode, styleId); } } }