Java 在 Word 中生成和更新目录:多级标题与页码

📅 2026/8/1 4:28:44 👁️ 阅读次数 📝 编程学习
Java 在 Word 中生成和更新目录:多级标题与页码

项目报告、产品说明书和技术文档通常包含多个章节。随着内容不断调整,标题名称、章节顺序和页码也会发生变化。如果目录完全依靠人工维护,不仅操作重复,还容易出现标题遗漏或页码不一致的问题。

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中添加仓库和依赖:

<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.com/nexus/content/groups/public/</url></repository></repositories><dependencies><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc</artifactId><version>14.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 文档Documentdocument=newDocument();try{// 添加节Sectionsection=document.addSection();// 添加目录标题ParagraphtocTitle=section.addParagraph();TextRangetitleText=tocTitle.appendText("目 录");titleText.getCharacterFormat().setBold(true);titleText.getCharacterFormat().setFontSize(18);tocTitle.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);// 插入一级至三级目录ParagraphtocParagraph=section.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){Paragraphparagraph=section.addParagraph();paragraph.appendText(text);paragraph.applyStyle(style);}/** * 添加正文段落。 */privatestaticvoidaddBodyText(Sectionsection,Stringtext){Paragraphparagraph=section.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){Documentdocument=newDocument();try{// 加载已有 Word 文档document.loadFromFile("ProjectReport.docx");// 获取第一节SectionfirstSection=document.getSections().get(0);// 创建目录标题ParagraphtocTitle=newParagraph(document);TextRangetitleText=tocTitle.appendText("目 录");titleText.getCharacterFormat().setBold(true);titleText.getCharacterFormat().setFontSize(18);tocTitle.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);// 创建目录段落ParagraphtocParagraph=newParagraph(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个段落是二级标题:

Sectionsection=document.getSections().get(0);section.getParagraphs().get(2).applyStyle(BuiltinStyle.Heading_1);section.getParagraphs().get(4).applyStyle(BuiltinStyle.Heading_2);

然后插入并更新目录:

ParagraphtocParagraph=newParagraph(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){Documentdocument=newDocument();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 样式,否则它自己也会被收录到目录中。

可以直接手动设置格式:

ParagraphtocTitle=section.addParagraph();TextRangetextRange=tocTitle.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()重新生成目录,减少人工维护标题和页码的工作。