1. 准备工作添加 docx4j 依赖在pom.xml中加入以 8.2.9 版本为例支持 JAXB 自带实现避免 JDK 9 的模块问题dependencygroupIdorg.docx4j/groupIdartifactIddocx4j/artifactIdversion8.2.9/version/dependencydependencygroupIdjavax.xml.bind/groupIdartifactIdjaxb-api/artifactIdversion2.3.1/version/dependency若使用 Spring Boot 项目且 JDK 版本较高docx4j 8.2.9 会自动引入合适的 JAXB 实现通常只需上面两个依赖。2. 核心代码创建一个带标记和标题的内容控件下面的方法会创建一个新的空白 Word 文档并在其中插入一个格式文本内容控件 (SdtBlock)同时设置 Tag 和 Title代码中通过SdtPr.Alias对应 Word 的标题字段。importorg.docx4j.openpackaging.packages.WordprocessingMLPackage;importorg.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;importorg.docx4j.wml.*;importjava.io.File;publicclassCreateSdtBlockExample{publicstaticvoidmain(String[]args)throwsException{// 1. 创建空白 docx 包WordprocessingMLPackagewordMLPackageWordprocessingMLPackage.createPackage();MainDocumentPartmainDocumentPartwordMLPackage.getMainDocumentPart();// 2. 创建一个格式文本内容控件 SdtBlockSdtBlocksdtBlockcreateRichTextSdtBlock(REF_QUAL_001,资格条件内容区域);// 3. 将控件添加到文档主体mainDocumentPart.getContent().add(sdtBlock);// 4. 保存文件wordMLPackage.save(newFile(output_with_sdt.docx));System.out.println(文档已生成output_with_sdt.docx);}/** * 构建一个带 Tag 和 TitleAlias的富文本内容控件 * param tagValue 标记对应 Word 属性中的“标记” * param titleValue 标题对应 Word 属性中的“标题” * return SdtBlock 对象 */privatestaticSdtBlockcreateRichTextSdtBlock(StringtagValue,StringtitleValue){ObjectFactoryfactorynewObjectFactory();// -------- 构建控件属性 w:sdtPr --------SdtPrsdtPrfactory.createSdtPr();// 设置 Tagw:tag w:val.../Tagtagfactory.createTag();tag.setVal(tagValue);sdtPr.getRPrOrAliasOrLock().add(tag);// 设置 Title在 docx4j 中用 SdtPr.Alias 对应 w:alias w:val.../SdtPr.Aliasaliasfactory.createSdtPrAlias();alias.setVal(titleValue);sdtPr.getRPrOrAliasOrLock().add(alias);// 可选设置控件为富文本类型place holder 等这里保持默认即可// -------- 构建控件内容 w:sdtContent --------SdtContentBlocksdtContentfactory.createSdtContentBlock();// 在控件内放一个占位段落Pparagraphfactory.createP();Rrunfactory.createR();Texttextfactory.createText();text.setValue(请在此输入内容...);run.getContent().add(text);paragraph.getContent().add(run);sdtContent.getContent().add(paragraph);// -------- 组装 SdtBlock --------SdtBlocksdtBlockfactory.createSdtBlock();sdtBlock.setSdtPr(sdtPr);sdtBlock.setSdtContent(sdtContent);returnsdtBlock;}}代码对应关系Word 界面操作docx4j 代码实现开发工具 → 格式文本内容控件创建SdtBlock对象选中控件 → 属性 → 标记TagTag tag factory.createTag(); tag.setVal(ID);放入SdtPr选中控件 → 属性 → 标题TitleSdtPr.Alias alias factory.createSdtPrAlias(); alias.setVal(标题);放入SdtPr控件内的提示文字在SdtContentBlock中添加一个P段落内含R和Text3. 向现有文档追加内容控件如果你的场景是基于已有模板动态插入控件只需加载现有文件然后添加到mainDocumentPart.getContent()即可WordprocessingMLPackagewordMLPackageWordprocessingMLPackage.load(newFile(template.docx));MainDocumentPartmainPartwordMLPackage.getMainDocumentPart();SdtBlocknewSdtcreateRichTextSdtBlock(REF_EVAL_005,评标办法区);mainPart.getContent().add(newSdt);// 追加到末尾或按需插入指定位置wordMLPackage.save(newFile(template_with_sdt.docx));4. 两个容易混淆的属性说明Tag标记在 OOXML 中对应w:tag w:valxxx/是程序识别控件的主要标识你的SdtBlockUtils正是通过它来查找控件。Title标题在 OOXML 中对应w:alias w:valxxx/docx4j 中用SdtPr.Alias表示也就是 Word 属性对话框中的“标题”输入框。它更多用于界面提示也可作为备用标识。代码中getSdtBlockAlias读取的就是这个Alias值。5. 注意事项JAXB 兼容性如果运行时报 JAXB 相关错误请检查依赖是否完整。使用 docx4j 8.2.9 以上版本一般可以自动处理但你也可尝试org.docx4j:docx4j-JAXB-ReferenceImpl等预绑定包。控件的默认样式新创建的 SdtBlock 使用的字体、缩进等会继承文档默认样式你可以通过添加PPr/RPr进一步设置。生产环境建议你的示例工具类中已经有很好的异常降级机制这部分创建控件的逻辑也可以整合进去作为生成模板模块的一部分。这样就完全用 Java 实现了“给 Word 补充内容控件并设置标记和标题”的全过程。生成的 docx 文件再用SdtBlockUtils去填充内容就形成了一套完整的自动化文档流水线。