
项目报告、产品说明书和技术文档通常包含多个章节。随着内容不断调整标题名称、章节顺序和页码也会发生变化。如果目录完全依靠人工维护不仅操作重复还容易出现标题遗漏或页码不一致的问题。Word 目录本质上是根据文档中的标题样式生成的字段。只要正文正确使用了 Heading 1、Heading 2、Heading 3 等标题样式就可以通过程序插入目录并在文档内容变化后重新计算目录条目和页码。本文将介绍如何使用 Java创建包含多级标题的 Word 文档自动生成一级至三级目录为已有 Word 文档插入目录更新已有目录的标题和页码控制目录包含的标题级别Word 目录如何识别标题Word 目录通常根据段落的标题样式识别章节层级。例如文档内容Word 样式目录层级1. 项目概述Heading 1一级目录1.1 项目背景Heading 2二级目录1.1.1 建设目标Heading 3三级目录仅仅将文字设置为加粗或增大字号并不会自动将它识别为标题。需要为对应段落应用正式的标题样式。在 Java 代码中可以使用以下内置样式BuiltinStyle.Heading_1BuiltinStyle.Heading_2BuiltinStyle.Heading_3生成目录时appendTOC()用于指定需要包含的标题级别updateTableOfContents()用于根据当前标题和分页结果刷新目录。([e-iceblue.com][1])安装 Word 处理库下面的示例使用 Spire.Doc for Java 处理 Word 文档。在 Maven 项目的pom.xml中添加仓库和依赖repositoriesrepositoryidcom.e-iceblue/idnamee-iceblue/nameurlhttps://repo.e-iceblue.com/nexus/content/groups/public//url/repository/repositoriesdependenciesdependencygroupIde-iceblue/groupIdartifactIdspire.doc/artifactIdversion14.6.0/version/dependency/dependencies版本号可以根据项目使用时的仓库版本进行调整。([e-iceblue.com][2])代码中需要导入以下类importcom.spire.doc.Document;importcom.spire.doc.FileFormat;importcom.spire.doc.Section;importcom.spire.doc.documents.BreakType;importcom.spire.doc.documents.BuiltinStyle;importcom.spire.doc.documents.HorizontalAlignment;importcom.spire.doc.documents.Paragraph;importcom.spire.doc.fields.TextRange;使用 Java 创建带目录的 Word 文档下面的示例从零创建一个 Word 文档并在文档开头插入一级至三级目录。importcom.spire.doc.Document;importcom.spire.doc.FileFormat;importcom.spire.doc.Section;importcom.spire.doc.documents.BreakType;importcom.spire.doc.documents.BuiltinStyle;importcom.spire.doc.documents.HorizontalAlignment;importcom.spire.doc.documents.Paragraph;importcom.spire.doc.fields.TextRange;publicclassCreateWordWithToc{publicstaticvoidmain(String[]args){// 创建 Word 文档DocumentdocumentnewDocument();try{// 添加节Sectionsectiondocument.addSection();// 添加目录标题ParagraphtocTitlesection.addParagraph();TextRangetitleTexttocTitle.appendText(目 录);titleText.getCharacterFormat().setBold(true);titleText.getCharacterFormat().setFontSize(18);tocTitle.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);// 插入一级至三级目录ParagraphtocParagraphsection.addParagraph();tocParagraph.appendTOC(1,3);// 目录后插入分页符tocParagraph.appendBreak(BreakType.Page_Break);// 添加一级标题addHeading(section,1. 项目概述,BuiltinStyle.Heading_1);addBodyText(section,本章介绍项目的建设背景、主要目标和实施范围。);// 添加二级标题addHeading(section,1.1 项目背景,BuiltinStyle.Heading_2);addBodyText(section,随着业务规模扩大原有管理方式已难以满足统一管理需求。);addHeading(section,1.2 建设目标,BuiltinStyle.Heading_2);addBodyText(section,项目将建立统一的数据管理和业务协同平台。);// 添加三级标题addHeading(section,1.2.1 业务目标,BuiltinStyle.Heading_3);addBodyText(section,实现业务流程标准化并提高跨部门协同效率。);addHeading(section,1.2.2 技术目标,BuiltinStyle.Heading_3);addBodyText(section,形成可扩展、可维护的系统架构。);// 添加另一个一级标题addHeading(section,2. 实施方案,BuiltinStyle.Heading_1);addBodyText(section,本章介绍系统建设过程中的实施步骤和主要任务。);addHeading(section,2.1 实施阶段,BuiltinStyle.Heading_2);addBodyText(section,项目分为需求分析、系统设计、开发测试和上线运行阶段。);// 根据当前标题和页面重新生成目录document.updateTableOfContents();// 保存结果document.saveToFile(WordDocumentWithTOC.docx,FileFormat.Docx_2019);}finally{document.dispose();}}/** * 添加标题段落。 */privatestaticvoidaddHeading(Sectionsection,Stringtext,BuiltinStylestyle){Paragraphparagraphsection.addParagraph();paragraph.appendText(text);paragraph.applyStyle(style);}/** * 添加正文段落。 */privatestaticvoidaddBodyText(Sectionsection,Stringtext){Paragraphparagraphsection.addParagraph();paragraph.appendText(text);paragraph.getFormat().setAfterSpacing(10);}}运行代码后会生成WordDocumentWithTOC.docx文档第一页显示目录正文从下一页开始。目录中包含一级、二级和三级标题以及对应页码。appendTOC() 的参数含义下面的代码表示目录包含一级至三级标题tocParagraph.appendTOC(1,3);两个参数分别表示起始标题级别 结束标题级别例如只生成一级和二级目录tocParagraph.appendTOC(1,2);只生成一级目录tocParagraph.appendTOC(1,1);对于一般项目报告使用一级至三级目录通常已经足够。目录层级过多会增加阅读负担也可能使目录占用过多页面。为已有 Word 文档插入目录实际项目中文档通常已经包含正文只需要在开头增加目录。下面的代码加载现有 Word 文档并在第一节的开头插入目录。importcom.spire.doc.Document;importcom.spire.doc.FileFormat;importcom.spire.doc.Section;importcom.spire.doc.documents.BreakType;importcom.spire.doc.documents.HorizontalAlignment;importcom.spire.doc.documents.Paragraph;importcom.spire.doc.fields.TextRange;publicclassAddTocToExistingDocument{publicstaticvoidmain(String[]args){DocumentdocumentnewDocument();try{// 加载已有 Word 文档document.loadFromFile(ProjectReport.docx);// 获取第一节SectionfirstSectiondocument.getSections().get(0);// 创建目录标题ParagraphtocTitlenewParagraph(document);TextRangetitleTexttocTitle.appendText(目 录);titleText.getCharacterFormat().setBold(true);titleText.getCharacterFormat().setFontSize(18);tocTitle.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);// 创建目录段落ParagraphtocParagraphnewParagraph(document);tocParagraph.appendTOC(1,3);// 在目录后插入分页符tocParagraph.appendBreak(BreakType.Page_Break);// 将标题和目录插入第一节开头firstSection.getParagraphs().insert(0,tocTitle);firstSection.getParagraphs().insert(1,tocParagraph);// 更新目录document.updateTableOfContents();// 保存为新文件document.saveToFile(ProjectReportWithTOC.docx,FileFormat.Docx_2019);}finally{document.dispose();}}}这里将目录保存到新文件中没有直接覆盖原始文档ProjectReport.docx ProjectReportWithTOC.docx需要注意原文档中的章节段落必须已经使用 Heading 1、Heading 2 等标题样式。否则即使成功插入目录字段目录中也可能没有完整的标题条目。为普通段落设置标题样式如果已有文档中的章节标题只是普通段落可以在生成目录前为其应用标题样式。例如已知第一节中的第3个段落是一级标题第5个段落是二级标题Sectionsectiondocument.getSections().get(0);section.getParagraphs().get(2).applyStyle(BuiltinStyle.Heading_1);section.getParagraphs().get(4).applyStyle(BuiltinStyle.Heading_2);然后插入并更新目录ParagraphtocParagraphnewParagraph(document);tocParagraph.appendTOC(1,3);section.getParagraphs().insert(0,tocParagraph);document.updateTableOfContents();这种方法适用于结构固定的模板文档。如果文档来源不固定不建议完全依赖段落索引。因为只要正文增加或删除一个段落后面的索引就会发生变化。更稳妥的方式是根据标题文本、现有样式或特定标记识别目标段落。更新已有 Word 目录当标题文字、章节顺序或正文长度发生变化时可以重新更新目录。下面的示例修改一个章节标题然后刷新目录importcom.spire.doc.Document;importcom.spire.doc.FileFormat;publicclassUpdateWordToc{publicstaticvoidmain(String[]args){DocumentdocumentnewDocument();try{// 加载包含目录的 Word 文档document.loadFromFile(WordDocumentWithTOC.docx);// 修改一个标题document.replace(2. 实施方案,2. 项目实施方案,false,true);// 更新目录条目和页码document.updateTableOfContents();// 保存结果document.saveToFile(UpdatedWordTOC.docx,FileFormat.Docx_2019);}finally{document.dispose();}}}updateTableOfContents()会重新读取文档中的标题并计算对应页码。该方法也提供针对指定目录对象的重载。([e-iceblue.com][3])更新后目录中的2. 实施方案会变为2. 项目实施方案如果内容增减导致标题移动到其他页面目录页码也会相应更新。避免目录标题出现在目录中目录页上通常会显示“目录”或“Table of Contents”标题。这个标题不应使用 Heading 1 样式否则它自己也会被收录到目录中。可以直接手动设置格式ParagraphtocTitlesection.addParagraph();TextRangetextRangetocTitle.appendText(目 录);textRange.getCharacterFormat().setBold(true);textRange.getCharacterFormat().setFontSize(18);tocTitle.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);不要这样写tocTitle.applyStyle(BuiltinStyle.Heading_1);除非确实希望“目录”两个字也作为一级目录项显示。更新目录时的常见问题目录为空通常是因为章节标题没有使用正式的标题样式。仅设置加粗、字号或颜色并不会让段落自动进入目录。需要调用paragraph.applyStyle(BuiltinStyle.Heading_1);或使用其他标题级别。三级标题没有显示检查appendTOC()的结束级别。下面的设置只包含一级和二级标题tocParagraph.appendTOC(1,2);要包含三级标题应改为tocParagraph.appendTOC(1,3);目录页码没有变化修改正文后需要再次调用document.updateTableOfContents();如果只修改正文并直接保存原有目录字段可能仍然保留旧的标题或页码。目录出现在封面之前如果文档包含封面可以将目录放在单独的节中并插入到封面节之后而不是直接插入文档第一个段落。文档结构可以设计为第一节封面 第二节目录 第三节正文这种方式更适合正式报告、投标文件和产品说明书。标题编号重复Heading 样式只负责标题层级不会自动保证业务编号正确。如果标题文本中已经手动写入1. 项目概述 1.1 项目背景程序应确保编号与实际层级一致。如果使用 Word 多级列表自动编号则需要同时维护列表格式和标题样式。总结通过 Java 可以自动完成 Word 目录的生成与更新包括创建一级至三级标题根据标题样式生成目录为已有 Word 文档插入目录修改文档后刷新目录和页码控制目录包含的标题层级将目录放在封面和正文之间实现过程中最关键的不是目录本身而是确保文档中的章节标题使用了正确的 Heading 样式。只要标题结构规范就可以在内容变化后通过updateTableOfContents()重新生成目录减少人工维护标题和页码的工作。