Java 读取 Word 模板文档并替换内容生成新文档

devtools/2025/2/11 18:06:47/

嘿,朋友们!在实际开发中,经常会遇到需要根据 Word 模板生成特定文档的需求,比如合同、报告等。咱们可以使用 Apache POI 库来读取 Word 模板文档,然后替换其中的指定内容,最后生成新的文档。下面我就详细给大家讲讲具体怎么做。

1. 引入依赖

如果你使用的是 Maven 项目,在 pom.xml 中添加以下依赖:

 
<dependencies><!-- Apache POI 处理 Word 文档 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency>
</dependencies>

2. 创建 Word 模板

首先,创建一个 Word 模板文件 template.docx,在模板中使用特定的占位符来表示需要替换的内容,例如 {name}{date} 等。假设模板内容如下:

 
这是一份测试文档。
姓名:{name}
日期:{date}

3. Java 代码实现

 
java">import org.apache.poi.xwpf.usermodel.*;import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class WordTemplateProcessor {public static void main(String[] args) {try {// 读取 Word 模板文件FileInputStream fis = new FileInputStream("template.docx");XWPFDocument document = new XWPFDocument(fis);// 准备要替换的数据Map<String, String> data = new HashMap<>();data.put("{name}", "张三");SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");data.put("{date}", sdf.format(new Date()));// 替换文档中的占位符replacePlaceholders(document, data);// 保存为新的 Word 文档FileOutputStream fos = new FileOutputStream("output.docx");document.write(fos);fos.close();fis.close();System.out.println("新的 Word 文档生成成功!");} catch (IOException e) {e.printStackTrace();System.out.println("生成新的 Word 文档失败:" + e.getMessage());}}private static void replacePlaceholders(XWPFDocument document, Map<String, String> data) {// 遍历文档中的每个段落for (XWPFParagraph paragraph : document.getParagraphs()) {// 遍历段落中的每个文本运行对象for (XWPFRun run : paragraph.getRuns()) {String text = run.getText(0);if (text != null) {// 遍历数据映射,替换占位符for (Map.Entry<String, String> entry : data.entrySet()) {String placeholder = entry.getKey();String replacement = entry.getValue();if (text.contains(placeholder)) {text = text.replace(placeholder, replacement);run.setText(text, 0);}}}}}}
}

4. 代码解释

读取 Word 模板文件

 
java">FileInputStream fis = new FileInputStream("template.docx");
XWPFDocument document = new XWPFDocument(fis);

通过 FileInputStream 读取 template.docx 文件,然后使用 XWPFDocument 类将其加载到内存中。

准备要替换的数据

 
java">Map<String, String> data = new HashMap<>();
data.put("{name}", "张三");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
data.put("{date}", sdf.format(new Date()));

创建一个 Map 对象,将占位符和要替换的内容进行映射。

替换文档中的占位符

 
java">private static void replacePlaceholders(XWPFDocument document, Map<String, String> data) {for (XWPFParagraph paragraph : document.getParagraphs()) {for (XWPFRun run : paragraph.getRuns()) {String text = run.getText(0);if (text != null) {for (Map.Entry<String, String> entry : data.entrySet()) {String placeholder = entry.getKey();String replacement = entry.getValue();if (text.contains(placeholder)) {text = text.replace(placeholder, replacement);run.setText(text, 0);}}}}}
}

遍历文档中的每个段落和文本运行对象,检查文本中是否包含占位符,如果包含则进行替换。

保存为新的 Word 文档

 
java">FileOutputStream fos = new FileOutputStream("output.docx");
document.write(fos);
fos.close();
fis.close();

使用 FileOutputStream 将替换后的文档保存为 output.docx 文件。

嘿,朋友们!按照上面的步骤,你就可以使用 Java 读取 Word 模板文档并替换指定内容,生成新的文档啦。赶紧动手试试吧!


http://www.ppmy.cn/devtools/157993.html

相关文章

设计模式学习(四)

行为模式 观察者模式&#xff08;Observer Pattern&#xff09; 定义 它定义了对象之间的一对多依赖关系。当一个对象&#xff08;被观察者&#xff09;的状态发生变化时&#xff0c;所有依赖它的对象&#xff08;观察者&#xff09;都会收到通知并自动更新。 观察者模式的…

网络工程师 (29)CSMA/CD协议

前言 CSMA/CD协议&#xff0c;即载波监听多路访问/碰撞检测&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;协议&#xff0c;是一种在计算机网络中&#xff0c;特别是在以太网环境下&#xff0c;用于管理多个设备共享同一物理传输介质的重要…

【AI学习】关于 DeepSeek-R1的几个流程图

遇见关于DeepSeek-R1的几个流程图&#xff0c;清晰易懂形象直观&#xff0c;记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》&#xff0c; 文章链接&#xff1a;https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…

国内知名Deepseek培训师培训讲师唐兴通老师讲授AI人工智能大模型实践应用

课程名称 《Deepseek人工智能大模型实践应用》 课程目标 全面了解Deepseek人工智能大模型的技术原理、功能特点及应用场景。 熟练掌握Deepseek大模型的提示词工程技巧&#xff0c;能够编写高质量的提示词。 掌握Deepseek大模型在办公、营销等领域的应用方法&#xff0c;提升…

2024美团春招硬件开发笔试真题及答案解析

目录 一、选择题 1、在 Linux,有一个名为 file 的文件,内容如下所示: 2、在 Linux 中,关于虚拟内存相关的说法正确的是() 3、AT89S52单片机中,在外部中断响应的期间,中断请求标志位查询占用了()。 4、下列关于8051单片机的结构与功能,说法不正确的是()? 5、…

C++字符串相关内容

字符串 字符串&#xff0c;本质上是一个接一个字符的一组字符。字母、数字、符号等。 const char* 字符串名 字符后面会有一个空终止符&#xff0c;为0。 字符串从指针的内存地址开始&#xff0c;然后继续下去&#xff0c;直到它碰到0&#xff0c;然后意识到字符串终止了。 …

SpringCloud面试题----Nacos和Eureka的区别

功能特性 服务发现 Nacos&#xff1a;支持基于 DNS 和 RPC 的服务发现&#xff0c;提供了更为灵活的服务发现机制&#xff0c;能满足不同场景下的服务发现需求。Eureka&#xff1a;主要基于 HTTP 的 RESTful 接口进行服务发现&#xff0c;客户端通过向 Eureka Server 发送 HT…

ASP.NET Core程序的部署

发布 不能直接把bin/Debug部署到生产环境的服务器上&#xff0c;性能低。应该创建网站的发布版&#xff0c;用【发布】功能。两种部署模式&#xff1a;“框架依赖”和“独立”。独立模式选择目标操作系统和CPU类型。Windows、Linux、iOS&#xff1b;关于龙芯。 网站的运行 在…