最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java自动化生成Word目录并更新页码
时间:2026-08-03 09:13:51 编辑:袖梨 来源:一聚教程网
项目报告、产品说明书和技术文档通常包含多个章节。随着内容不断调整,标题名称、章节顺序和页码也会发生变化。如果目录完全依靠人工维护,不仅操作重复,还容易出现标题遗漏或页码不一致的问题。

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>
版本号可以根据项目使用时的仓库版本进行调整。
代码中需要导入以下类:
import com.spire.doc.Document;import com.spire.doc.FileFormat;import com.spire.doc.Section;import com.spire.doc.documents.BreakType;import com.spire.doc.documents.BuiltinStyle;import com.spire.doc.documents.HorizontalAlignment;import com.spire.doc.documents.Paragraph;import com.spire.doc.fields.TextRange;
使用 Java 创建带目录的 Word 文档
下面的示例从零创建一个 Word 文档,并在文档开头插入一级至三级目录。
import com.spire.doc.Document;import com.spire.doc.FileFormat;import com.spire.doc.Section;import com.spire.doc.documents.BreakType;import com.spire.doc.documents.BuiltinStyle;import com.spire.doc.documents.HorizontalAlignment;import com.spire.doc.documents.Paragraph;import com.spire.doc.fields.TextRange;public class CreateWordWithToc { public static void main(String[] args) { // 创建 Word 文档 Document document = new Document(); try { // 添加节 Section section = document.addSection(); // 添加目录标题 Paragraph tocTitle = section.addParagraph(); TextRange titleText = tocTitle.appendText("目 录"); titleText.getCharacterFormat().setBold(true); titleText.getCharacterFormat().setFontSize(18); tocTitle.getFormat().setHorizontalAlignment( HorizontalAlignment.Center ); // 插入一级至三级目录 Paragraph tocParagraph = 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(); } } /** * 添加标题段落。 */ private static void addHeading( Section section, String text, BuiltinStyle style ) { Paragraph paragraph = section.addParagraph(); paragraph.appendText(text); paragraph.applyStyle(style); } /** * 添加正文段落。 */ private static void addBodyText( Section section, String text ) { Paragraph paragraph = 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 文档,并在第一节的开头插入目录。
import com.spire.doc.Document;import com.spire.doc.FileFormat;import com.spire.doc.Section;import com.spire.doc.documents.BreakType;import com.spire.doc.documents.HorizontalAlignment;import com.spire.doc.documents.Paragraph;import com.spire.doc.fields.TextRange;public class AddTocToExistingDocument { public static void main(String[] args) { Document document = new Document(); try { // 加载已有 Word 文档 document.loadFromFile("ProjectReport.docx"); // 获取第一节 Section firstSection = document.getSections().get(0); // 创建目录标题 Paragraph tocTitle = new Paragraph(document); TextRange titleText = tocTitle.appendText("目 录"); titleText.getCharacterFormat().setBold(true); titleText.getCharacterFormat().setFontSize(18); tocTitle.getFormat().setHorizontalAlignment( HorizontalAlignment.Center ); // 创建目录段落 Paragraph tocParagraph = new Paragraph(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.docxProjectReportWithTOC.docx
需要注意,原文档中的章节段落必须已经使用 Heading 1、Heading 2 等标题样式。否则,即使成功插入目录字段,目录中也可能没有完整的标题条目。
为普通段落设置标题样式
如果已有文档中的章节标题只是普通段落,可以在生成目录前为其应用标题样式。
例如,已知第一节中的第3个段落是一级标题,第5个段落是二级标题:
Section section = document.getSections().get(0);section.getParagraphs() .get(2) .applyStyle(BuiltinStyle.Heading_1);section.getParagraphs() .get(4) .applyStyle(BuiltinStyle.Heading_2);
然后插入并更新目录:
Paragraph tocParagraph = new Paragraph(document);tocParagraph.appendTOC(1, 3);section.getParagraphs().insert( 0, tocParagraph);document.updateTableOfContents();
这种方法适用于结构固定的模板文档。
如果文档来源不固定,不建议完全依赖段落索引。因为只要正文增加或删除一个段落,后面的索引就会发生变化。
更稳妥的方式是根据标题文本、现有样式或特定标记识别目标段落。
更新已有 Word 目录
当标题文字、章节顺序或正文长度发生变化时,可以重新更新目录。
下面的示例修改一个章节标题,然后刷新目录:
import com.spire.doc.Document;import com.spire.doc.FileFormat;public class UpdateWordToc { public static void main(String[] args) { Document document = new Document(); 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 样式,否则它自己也会被收录到目录中。
可以直接手动设置格式:
Paragraph tocTitle = section.addParagraph();TextRange textRange = 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() 重新生成目录,减少人工维护标题和页码的工作。