填充word文档【Apache POI】

填充word文档【Apache POI】

  • [1. 引入依赖](#1. 引入依赖)
  • [2. 示例代码](#2. 示例代码)
  • [3. 填充效果](#3. 填充效果)

1. 引入依赖

xml 复制代码
<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>5.2.3</version>
</dependency>

2. 示例代码

java 复制代码
import org.apache.poi.xwpf.usermodel.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TemplateUtils {

    public static void replacePlaceholder(XWPFDocument xwpfDocument, Map<String, String> dataMap) {
        for (XWPFParagraph paragraph : xwpfDocument.getParagraphs()) {
            replacePlaceholder(paragraph, dataMap);
        }
    }

    /**
     * 填充段落中的占位符
     */
    public static void replacePlaceholder(XWPFParagraph paragraph, Map<String, String> dataMap) {
        if (paragraph.getText().contains("$")) {
            for (XWPFRun run : paragraph.getRuns()) {
                String text = run.text();
                System.out.println(text);
                for (String key : dataMap.keySet()) {
                    String placeHolder = "${" + key + "}";
                    if (text.contains(placeHolder)) {
                        text = text.replace(placeHolder, dataMap.get(key));
                        run.setText(text, 0);
                    }
                }
            }
        }
    }
    

    /**
     * 填充表格中的占位符
     */
    public static void replacePlaceholderInTable(XWPFTable table, Map<String, String> dataMap) {
        for (XWPFTableRow row : table.getRows()) {
            for (XWPFTableCell tableCell : row.getTableCells()) {
                for (XWPFParagraph paragraph : tableCell.getParagraphs()) {
                    replacePlaceholder(paragraph, dataMap);
                }
            }
        }
    }


    public static void main(String[] args) throws Exception {
        // 准备数据
        Map<String, String> dataMap = prepareData();

        // 加载文件
        String docPath = "src/main/resources/doc/信息表.docx";
        FileInputStream fileInputStream = new FileInputStream(docPath);
        XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream);

        // 填充段落
        List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
        System.out.println(paragraphs.size());
        for (XWPFParagraph paragraph : paragraphs) {
            replacePlaceholder(paragraph, dataMap);
        }

        // 填充表格
        // 表格的每个单元格,也是段落
        List<XWPFTable> tables = xwpfDocument.getTables();
        System.out.println(tables.size());
        for (XWPFTable table : tables) {
            replacePlaceholderInTable(table, dataMap);
        }


        FileOutputStream fileOutputStream = new FileOutputStream("src/main/resources/doc/out.docx");
        xwpfDocument.write(fileOutputStream);

        fileOutputStream.close();
        fileInputStream.close();
        xwpfDocument.close();
    }

    private static Map<String, String> prepareData() {
        Map<String, String> dataMap = new HashMap<>();

        dataMap.put("author", "荧");
        dataMap.put("createTime", LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME));


        dataMap.put("name", "Tom");
        dataMap.put("age", "14");
        dataMap.put("gender", "男");
        dataMap.put("birth", "1940-01-01");

        dataMap.put("address", "北京");
        dataMap.put("workAddress", "上海");
        dataMap.put("mobile", "6570123");
        dataMap.put("phone", "13478965412");


        dataMap.put("petName", "jerry");
        dataMap.put("petAge", "10");
        dataMap.put("petGender", "男");
        dataMap.put("petBirth", "1940-01-01");
        return dataMap;
    }

}

3. 填充效果

填充前

填充后

相关推荐
AOI小白新手上路3 分钟前
视频去雨·论文蒸馏笔记:从物理先验到状态空间模型
数据库·笔记·音视频
AOI小白新手上路1 小时前
DRSformer·论文蒸馏笔记:可学习 Top-k 稀疏注意力去雨网络
网络·笔记·学习
AOI小白新手上路2 小时前
单幅图像去雨·论文蒸馏笔记:统一评测、方法谱系与 HQ-RAIN 新基准
笔记
糖炒栗子要加糖2 小时前
Windows 大量小文件复制太慢?使用 Robocopy 多线程加速
笔记·提升效率
2601_961146203 小时前
我的等离子表面处理设备周度保养折腾记录
笔记·设备·设备选型
小新科研测评3 小时前
文献管理工具同步太麻烦?2026年4款多端同步工具实测,换设备不丢笔记
论文阅读·人工智能·笔记·ai·电脑
龙仔7254 小时前
RustDesk 1.5.0 升级安装故障处理笔记
笔记
星恒随风5 小时前
Linux基础IO万字详解:从文件描述符fd到重定向、FILE缓冲机制及MiniShell升级
linux·运维·笔记·学习·状态模式
喜欢打篮球的普通人5 小时前
MiniMind 学习笔记(二十二):数学 Cookbook——把概率空间、期望、似然一次讲明白
人工智能·笔记·学习
乐橙开放平台6 小时前
通道国标 ID 贴反会串店:海康大华宇视摄像头怎么用 GB28181 统一接入?
网络·笔记·物联网·自动化·音视频·智能家居