填充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. 填充效果

填充前

填充后

相关推荐
一木 之林6 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
箓维11 小时前
TCP Socket的进阶实现
网络·笔记·tcp/ip
二哈赛车手11 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
星恒随风13 小时前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
智学AI14 小时前
AI博主写作素材管理方法分享:资料归集、笔记关联与文档归档
人工智能·笔记
叼烟扛炮14 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
weixin_4481199414 小时前
Datawhale Jev Cookbook 202610 笔记5
笔记
一木 之林15 小时前
Dify学习笔记 04 · 检索底座:Embedding、Rerank与向量数据库(第46-54集)
笔记·学习·embedding·dify
ljt272496066115 小时前
Python笔记(十一)--Numpy(一)
笔记·python·numpy
芯思路15 小时前
STM32开发学习笔记之十【AI部署】
笔记·stm32·学习