使用 EasyPoi 快速导出 Word 文档

EasyPoi 是一个基于 Apache POI 的开源 Java 工具库,旨在简化 Excel 和 Word 文档的操作。本文将详细介绍如何使用 EasyPoi 快速导出 Word 文档。

一、准备工作

1、引入依赖

在 Maven 项目中,添加以下依赖:

xml 复制代码
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easy-poi-base</artifactId>
    <version>4.4.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easy-poi-annotation</artifactId>
    <version>4.4.0</version>
</dependency>

二、准备好一个word模版文件

  1. 在项目的 resources 目录下创建一个 template/exportTemplate.docx 文件作为模板。

  2. 使用 EasyPoi 提供的占位符 {{}} 来定义动态内容的位置。例如:

css 复制代码
{{title}}
{{content}}

三、编写导出方法的工具类

java 复制代码
package com.example.simple.util;


import cn.afterturn.easypoi.cache.manager.POICacheManager;
import cn.afterturn.easypoi.word.WordExportUtil;
import cn.afterturn.easypoi.word.entity.MyXWPFDocument;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.Map;

@Slf4j
public class ExportWordUtil {

    /**
     * 通用Word文档导出方法
     * @param templateName 模板文件名
     * @param params 模板参数
     * @param response HTTP响应对象
     * @param outputFileName 输出文件名
     * @throws RuntimeException 导出过程中的异常
     */
    public static void exportWordDocument(String templateName, Map<String, Object> params,
                                          HttpServletResponse response, String outputFileName) {
        MyXWPFDocument doc = null;
        try {
            // 获取模板文档
            doc = getXWPFDocument(templateName);
            if (doc == null) {
                throw new RuntimeException("未能找到模板文件");
            }

            // 使用模板引擎替换内容
            WordExportUtil.exportWord07(doc, params);

            // 设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);

            // 输出文档
            try (ServletOutputStream outputStream = response.getOutputStream()) {
                doc.write(outputStream);
                outputStream.flush();
            }
        } catch (Exception e) {
            log.error("导出Word文档失败", e);
            throw new RuntimeException("导出Word文档失败: " + e.getMessage());
        } finally {
            // 关闭文档
            if (doc != null) {
                try {
                    doc.close();
                } catch (Exception e) {
                    log.error("关闭文档失败", e);
                }
            }
        }
    }


    public static MyXWPFDocument getXWPFDocument(String templateName) throws IOException {
        // 从classpath获取模板
        InputStream is = null;
        try {
            is = POICacheManager.getFile(templateName);
            if (is == null) {
                throw new FileNotFoundException("模板文件不存在: " + templateName);
            }
            return new MyXWPFDocument(is);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    log.error("关闭输入流失败", e);
                }
            }
        }
    }
}

四、在ExportWordServiceImpl层调用导出word工具方法

注意:在spring-boot3中使用时response引入的是import jakarta.servlet.http.HttpServletResponse;

java 复制代码
@Override
    public void exportWord(Map<String, Object> map, HttpServletResponse response) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("title", "我是一个好标题");
        params.put("content", "我是一个很有深度的内容");
        ExportWordUtil.exportWordDocument("template/exportTemplate.docx", params, response, "export.docx");
    }

五、前端请求接口后word文档的展示效果

六、总结

通过 EasyPoi,我们可以轻松实现 Word 文档的导出功能。希望本文能帮助你快速上手并完成相关开发任务!

如果你有任何问题或建议,欢迎留言交流!

相关推荐
鼠爷ねずみ3 小时前
SpringCloud前后端整体开发流程-以及技术总结文章实时更新中
java·数据库·后端·spring·spring cloud
oden4 小时前
0成本搭建!20分钟用 Workers AI + Vectorize 搞定 RAG(附全套源码)
后端
不会画画的画师5 小时前
Go开发指南:io/ioutil包应用和迁移指南
开发语言·后端·golang
youliroam6 小时前
ESP32-S3+OV2640简单推流到GO服务
开发语言·后端·golang·esp32·ov2640
码luffyliu6 小时前
从 2 小时价格轮询任务通知丢失,拆解 Go Context 生命周期管控核心
后端·golang·go
a努力。7 小时前
宇树Java面试被问:方法区、元空间的区别和演进
java·后端·面试·宇树科技
码事漫谈7 小时前
二叉树中序遍历:递归与非递归实现详解
后端
码事漫谈7 小时前
跨越进程的对话之从管道到gRPC的通信技术演进
后端
无限大68 小时前
为什么"数据压缩"能减小文件大小?——从冗余数据到高效编码
后端