通过POI实现Word文档的导出

1.添加POI的依赖

        <!-- 通过POI生成word文档 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>

2.创建word模版

创建如下template.docx文件
在这里插入图片描述

3.新增word导出工具类

package com.word.demo.util;

import org.apache.poi.xwpf.usermodel.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CreateWordUtil {

    public static void main(String[] args) throws IOException {
        // 模板文件路径
        String templatePath = "D:/study/template.docx";
        // 输出文件路径
        String outputPath = "D:/study/output.docx";

        // 准备替换的数据
        Map<String, String> placeholders = new HashMap<>();
        placeholders.put("name", "John Doe");
        placeholders.put("date", "September 29, 2024");
        placeholders.put("address", "123 Main Street, Anytown");

        // 加载Word模板文件
        FileInputStream fis = new FileInputStream(templatePath);
        XWPFDocument document = new XWPFDocument(fis);

        // 替换段落中的占位符
        replacePlaceholders(document, placeholders);

        // 输出新的Word文件
        FileOutputStream fos = new FileOutputStream(outputPath);
        document.write(fos);

        // 关闭资源
        fos.close();
        document.close();
        fis.close();
    }

    /**
     * 替换文档中所有段落的占位符
     */
    public static void replacePlaceholders(XWPFDocument document, Map<String, String> placeholders) {
        for (XWPFParagraph paragraph : document.getParagraphs()) {
            replaceTextInParagraph(paragraph, placeholders);
        }

        // 处理表格内的内容(如果文档中有表格)
        for (XWPFTable table : document.getTables()) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    for (XWPFParagraph paragraph : cell.getParagraphs()) {
                        replaceTextInParagraph(paragraph, placeholders);
                    }
                }
            }
        }
    }

    /**
     * 替换段落中的占位符
     */
    public static void replaceTextInParagraph(XWPFParagraph paragraph, Map<String, String> placeholders) {
        // 获取段落中的文本
        String paragraphText = paragraph.getText();

        // 遍历占位符并进行替换
        for (Map.Entry<String, String> entry : placeholders.entrySet()) {
            String placeholder = "{{" + entry.getKey() + "}}";
            String replacement = entry.getValue();
            if (paragraphText.contains(placeholder)) {
                paragraphText = paragraphText.replace(placeholder, replacement);
                // 删除现有的runs
                for (int i = paragraph.getRuns().size() - 1; i >= 0; i--) {
                    paragraph.removeRun(i);
                }
                // 创建新的run,并设置替换后的文本
                paragraph.createRun().setText(paragraphText);
            }
        }
    }
}

使用stream和lambda优化过后的代码如下:

package com.word.demo.util;

import org.apache.poi.xwpf.usermodel.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CreateWordUtil {

    public static void main(String[] args) throws IOException {
        // 模板文件路径
        String templatePath = "D:/study/template.docx";
        // 输出文件路径
        String outputPath = "D:/study/output.docx";

        // 准备替换的数据
        Map<String, String> placeholders = new HashMap<>();
        placeholders.put("name", "John Doe");
        placeholders.put("date", "September 29, 2024");
        placeholders.put("address", "123 Main Street, Anytown");

        // 加载Word模板文件
        FileInputStream fis = new FileInputStream(templatePath);
        XWPFDocument document = new XWPFDocument(fis);

        // 替换段落中的占位符
        replacePlaceholders(document, placeholders);

        // 输出新的Word文件
        FileOutputStream fos = new FileOutputStream(outputPath);
        document.write(fos);

        // 关闭资源
        fos.close();
        document.close();
        fis.close();
    }

    /**
     * 替换文档中所有段落的占位符
     */
    public static void replacePlaceholders(XWPFDocument document, Map<String, String> placeholders) {
        document.getParagraphs().stream()
                .forEach(paragraph -> replaceTextInParagraph(paragraph, placeholders));
        // 处理表格内的内容(如果文档中有表格)
        document.getTables().stream()
                .flatMap(table -> table.getRows().stream())
                .flatMap(row -> row.getTableCells().stream())
                .flatMap(cell -> cell.getParagraphs().stream())
                .forEach(paragraph -> replaceTextInParagraph(paragraph, placeholders));
    }

    /**
     * 替换段落中的占位符
     */
    public static void replaceTextInParagraph(XWPFParagraph paragraph, Map<String, String> placeholders) {
        // 遍历占位符并进行替换
        placeholders.entrySet().stream()
                .filter(entry -> paragraph.getText().contains("{{" + entry.getKey() + "}}"))
                .forEach(entry ->  {
                    String placeholder = "{{" + entry.getKey() + "}}";
                    String replacement = entry.getValue();
                    String paragraphText = paragraph.getText().replace(placeholder, replacement);
                    // 删除现有的runs
                    for (int i = paragraph.getRuns().size() - 1; i >= 0; i--) {
                    paragraph.removeRun(i);
                    }
                    // 创建新的run,并设置替换后的文本
                    paragraph.createRun().setText(paragraphText);
                });
    }
}

4.验证word文档的导出

在这里插入图片描述
导出文件如下:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值