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

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

1. 引入依赖

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

复制代码
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} 等。假设模板内容如下:

复制代码
XML 复制代码
这是一份测试文档。
姓名:{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 模板文档并替换指定内容,生成新的文档啦。赶紧动手试试吧!

相关推荐
Seoyoneh23 分钟前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人28 分钟前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr1 小时前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei1 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界1 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
彧azz2 小时前
Java学习语法篇:变量
java·学习
繁星蓝雨2 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J2 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥3 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk5553 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python