根据Word模板,使用POI生成文档

突然想起来有个小作业:需要根据提供的Word模板填充数据。这里使用POI写了一个小demo验证下。

测试用模板:

执行结果

1.引入依赖坐标

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

2.获取相关数据的方法

java 复制代码
    private static Object getValueFromData(String key) {
        // 根据需要实现此方法以从数据源获取值
        // 例如,从数据库、配置文件或用户输入中获取值
        Map<String, Object> textMap = new HashMap<String, Object>();
        textMap.put("title","《模板》");
        textMap.put("myName","--尉某人--");
        textMap.put("today","2023-11-02");

        List<Map> tables = new ArrayList<Map>();
        Map<String, String> tableMap = new HashMap<String, String>();
        tableMap.put("name","尉某人");
        tableMap.put("age","26");
        tableMap.put("phone","189*******");
        tables.add(tableMap);
        tableMap = new HashMap<String, String>();
        tableMap.put("name","王某人");
        tableMap.put("age","28");
        tableMap.put("phone","186*******");
        tables.add(tableMap);
        tableMap = new HashMap<String, String>();
        tableMap.put("name","张某人");
        tableMap.put("age","24");
        tableMap.put("phone","130*******");
        tables.add(tableMap);
        textMap.put("tables",tables);

        return textMap.get(key);
    }

3.解析模板并填充数据

java 复制代码
    public static void readTemplate() throws Exception {
        // 读取Word模板文件
        FileInputStream fis = new FileInputStream("C:\\Users\\Desktop\\template.docx");
        XWPFDocument document = new XWPFDocument(fis);

        // 获取所有段落
        List<XWPFParagraph> paragraphs = document.getParagraphs();
        for (XWPFParagraph paragraph : paragraphs) {
            List<XWPFRun> runs = paragraph.getRuns();
            for (XWPFRun run : runs) {
                String text = run.getText(0);
                if (text != null && text.startsWith("${")) {
                    String key = text.substring(2, text.length() - 1);
                    String value = getValueFromData(key).toString(); 
                    run.setText(value, 0);
                }
            }
        }
        // 获取表格
        List<XWPFTable> rowTables = document.getTables();
        for (XWPFTable table : rowTables) {
            // 遍历表格的每一行
            for (XWPFTableRow row : table.getRows()) {
                row.getCell(0).setText("尉某人");
                row.getCell(1).setText("26");
                row.getCell(2).setText("おひさしぶりだな");
            }
        }

        // 创建表格并填充数据
        List<Map> tables = (List<Map>) getValueFromData("tables");
        int size = tables.size();
        XWPFTable table = document.createTable(size+1, 3);
        table.getRow(0).getCell(0).setText("姓名");
        table.getRow(0).getCell(1).setText("年龄");
        table.getRow(0).getCell(2).setText("联系方式");

        for (int i = 0; i < tables.size(); i++) {
            Map<String,String> map = tables.get(i);
            XWPFTableRow row = table.getRow(i + 1);
            row.getCell(0).setText(map.get("name"));
            row.getCell(1).setText(map.get("age"));
            row.getCell(2).setText(map.get("phone"));
        }


        // 保存文件
        FileOutputStream fos = new FileOutputStream("C:\\Users\\Desktop\\output.docx");
        document.write(fos);
        fos.close();
        document.close();
        fis.close();
    }

4.测试结果

java 复制代码
    public static void main(String[] args){
        try {
            readTemplate();
            System.out.println("执行成功!!!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
相关推荐
名字还没想好☜30 分钟前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏
IT爱学堂2 小时前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
小贤plus3 小时前
SpringBoot 三大核心注解精讲:@ControllerAdvice、@RestControllerAdvice、@Validated 分组校验(实战)
java
吠品3 小时前
Java byte数组与String互转:编码细节与踩坑记录
java·linux·服务器
晚风醉蝶4 小时前
1-6-插入排序-InsertionSort
java·数据结构·排序算法
yaoxin5211234 小时前
497. Java 反射 - 使用反射读取注解
java·开发语言·python
Lam Tang4 小时前
APS 系列文章 01
java·代理模式
eralong5 小时前
Java 面向对象:继承、多态、接口
java·后端
哦虎!5 小时前
【数据库】事务
java·数据库·mysql
CDN3605 小时前
流媒体加速实践:出海东南亚短视频点播频繁缓冲,HLS 分片与 Nginx 配置调优
java·网络·nginx·流媒体加速