SpringBoot+easypoi+vue导出word文档

2023-10-26

因为项目需求需要,临时写的有什么错误的地方望各位见谅,可以借鉴参考。

easypoi依赖包

<!-- 若依自带poi4.1.2依赖包,因此需要过滤掉引起冲突的依赖 -->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>4.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>4.3.0</version>
</dependency>

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>4.3.0</version>
</dependency>

vue前端代码:

代码部分:

handleExport(name){
        this.queryParams.projectId = this.projectId;
          this.exportLoading = true;
          return getProjectLogListArr(this.queryParams).then(res=>{
            const url = window.URL.createObjectURL(new Blob([res],{type:"application/vnd.ms-excel;charset=utf-8"}));
            const link = document.createElement('a');
            link.href = url;
            let fileName = name+".docx";
            link.setAttribute('download', fileName);
            document.body.appendChild(link);
            link.click();
            this.exportLoading = false;
          });
      }


js部分:

    export function getProjectLogListArr(query) {
  return request({
    url: '/business/project/list/getProjectLogList',
    method: 'get',
    params: query,
    // responseType: 'blob',
    responseType: 'arraybuffer',
    headers: { 'Authorization': 'Bearer ' + getToken() }
  })
}

后端代码部分

Controller层代码:

@Value("${youfan.profile}")
    private String profile;


@GetMapping("/list/getProjectLogList")
    @ResponseBody
    public void getProjectLogListArr(ProjectLog projectLog, HttpServletResponse response, HttpServletRequest request) throws IOException {
        //查询所需导出的数据
        List<ProjectLogVo> list = projectService.getProjectLogList(projectLog);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 标题数据添加
        Map<String,Object> map = new HashMap<>();
        // 模块路径
        String templatePath = "static/template/projectLog.docx";
        map.put("title",list.get(0).getProjectName());

        // 渲染表格数据
        List<Map<String,Object>> jobMap = new ArrayList<>();
        Map<String,Object> job;
        for(ProjectLogVo plv:list){
            job = new HashMap<>();
            job.put("userNick", StringUtils.isNotBlank(plv.getUserNick()) ? plv.getUserNick() : "系统");
            job.put("name",plv.getName());
            job.put("createTime", sdf.format(plv.getCreateTime()));
            job.put("remark",plv.getRemark());
            jobMap.add(job);
        }

        // 将数据存入map中
        map.put("jobMap",jobMap);

        //临时文件存放路径
//        String temDir = profile;
        //生成文件名
        Long time = new Date().getTime();
        //生成格式
        String formatSuffix = ".docx";
        //拼接后的文件名称
        String fileName = time + formatSuffix;
        // word文档导出工具方法
        DeriveWord.exportWord(templatePath,profile,fileName,map,request,response);
    }


Word工具类:

       /**
     * easyPoi 导出
     * @param templatePath
     * @param temDir
     * @param fileName
     * @param params
     * @param request
     * @param response
     */
    public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
        Assert.notNull(templatePath,"模板路径不能为空");
        Assert.notNull(temDir,"临时文件路径不能为空");
        Assert.notNull(fileName,"导出文件名不能为空");
        Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");
        String file = temDir+fileName;
        if (!temDir.endsWith("/")){
            temDir = temDir + File.separator;
        }
        File dir = new File(temDir);
        // 文件是否存在,不存在创建文件
        if (!dir.exists()) {
            dir.mkdirs();
        }
        try {
            String userAgent = request.getHeader("user-agent").toLowerCase();
            if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
                fileName = URLEncoder.encode(fileName, "UTF-8");
            } else {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            }
            // 根据模板导出数据
            XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            // 根据地址创建临时文件
            String tmpPath = temDir + fileName;
            FileOutputStream fos = new FileOutputStream(tmpPath);
            // 临时文件
            doc.write(fos);
            //关流
            fos.close();
            doc.close();
            //下载文件
            downloadFile(response,temDir+fileName);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //删除临时文件
            delFileWord(temDir,fileName);
        }
    }


    /**
     * word文件下载
     * @param response
     * @param filePath
     * @return
     */
    public static String downloadFile(HttpServletResponse response, String filePath) {
        String filename = "项目日志.docx";
        response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        try {
            response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
        } catch (UnsupportedEncodingException e2) {
            e2.printStackTrace();
        }
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            bis = new BufferedInputStream(new FileInputStream(new File(filePath)));
            int i = bis.read(buff);
            while (i != -1) {
                os.write(buff, 0, buff.length);
                os.flush();
                i = bis.read(buff);
            }
            os.close();
        } catch (FileNotFoundException e1) {
            //e1.getMessage()+"系统找不到指定的文件";
            return "系统找不到指定的文件";
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return "success";
    }

    /**
     * 删除零时生成的文件
     */
    public static void delFileWord(String filePath, String fileName) {
        File file = new File(filePath + fileName);
        File file1 = new File(filePath);
        file.delete();
        file1.delete();
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot+easypoi+vue导出word文档 的相关文章

  • PDFBox 更改线条颜色

    我使用 pdfbox 1 8 5 并尝试使用绘制彩色线PDPageContentStream drawLine 我尝试过PDPageContentStream setNonStrokingColor 255 0 0 但它不起作用 我也没有找
  • 在 Java 1.7.0 下运行的 SQL-Server (MSSQL-JDBC 3.0) 中的日期列检索为过去 2 天

    当使用 SQLServer2008 从 SQLServer2008 检索 DATE 类型的列时 出现奇怪的效果在官方 Oracle JDK 1 7 0 下运行时 主机操作系统是Windows Server 2003 所有日期列均检索为two
  • 如何在 Spring MVC 中使用延迟加载

    Spring MVC中如何使用延迟加载 我现在正在使用 eager 但这会使我的应用程序运行速度变慢 这是我的域的一部分 ManyToMany fetch FetchType EAGER JoinTable name NEWS TAG jo
  • Android 支持 v4 22.2.0 的 Proguard 配置

    更新 Gradle Android 构建的依赖关系后使用com android support support v4 22 2 0从本地 Maven extras 存储库 在 SDK 内 Proguard 开始抛出这些问题 Warning
  • 与Java混淆覆盖访问级别[重复]

    这个问题在这里已经有答案了 可能的重复 为什么不能降低java子类中方法的可见性 https stackoverflow com questions 1600667 why cant you reduce the visibility of
  • 如何阻止 Apache CXF 发送响应消息?

    如果给定的 SOAP 标头元素具有给定值 例如 如果标头标记 response 的值为 0 我根本不希望 Apache CXF 返回响应 我怎样才能做到这一点 CXF 似乎假设所有呼叫都会收到响应 我知道这在 Web 服务上下文中看起来很奇
  • Jackson @JsonRawValue 获取地图的值

    我有以下 Java bean 类 使用 Jackson 将其转换为 JSON public class Thing public String name JsonRawValue public Map content new HashMap
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • 根据使用频率随机生成字母?

    如何根据常用语音中的使用频率随机生成字母 任何伪代码都值得赞赏 但如果用 Java 实现就更棒了 否则 只需朝正确的方向戳一下就会有所帮助 注意 我不需要生成使用频率 我确信我可以很容易地查找到它 我假设您将频率存储为 0 到 1 之间的浮
  • 为单个 Maven 项目创建两个工件(war)

    我有一个Java Web项目 我们部署在两个不同客户的服务器上 99 的代码是相同的 现在我有两个ApplicationBuilder 它是包含每个客户的定制的类 每当我想要部署新版本时 我都必须手动注释一行 构建 使用 Maven 取消注
  • 单击 libGDX 中的 Actor

    我的游戏中有一个覆盖层 其中包含屏幕图像和屏幕 上 的一组按钮 截屏 My Screen有一个Stage The Stage有一组Group对象 我将其视为图层 第一组具有背景 中间的组具有游戏元素 最前面的组具有屏幕覆盖 覆盖层由一个Im
  • Dao 和服务接口的需求

    我是Spring Mvc的新手 在很多教程中 我发现有一个像这样的Dao接口 public interface StudentDAO public List
  • Hadoop:处理大型序列化对象

    我正在开发一个应用程序来使用 Hadoop 框架处理 和合并 几个大型 java 序列化对象 顺序 GB 大小 Hadoop 存储将文件块分布在不同的主机上 但由于反序列化需要所有块都存在于单个主机上 因此它会极大地影响性能 我该如何处理这
  • 编写无 BOM 的 UTF-8

    这段代码 OutputStream out new FileOutputStream new File C file test txt out write A getBytes 和这个 OutputStream out new FileOu
  • 如何从 Java 中的字符串表示形式获取 Locale?

    有没有一种巧妙的方法来获得Locale http java sun com javase 6 docs api java util Locale html来自 Locale 返回的 编程名称 的实例toString 方法 一个明显且丑陋的解
  • Java 泛型和数字

    为了看看我是否可以清理一些数学代码 主要是矩阵代码 我尝试使用一些 Java 泛型 我有以下方法 private
  • java中如何在另一个类中使用嵌套类?

    我有一些情况 我想在另一个类中使用另一个类的内部类 喜欢 public class ListData public static class MyData public String textSongName textArtistName
  • Primefaces 中的过滤数据表仅有效一次

    我正在尝试使用 Primefaces 过滤数据表 就像这个例子 http www primefaces org showcase ui datatableFiltering jsf 在网络浏览器中 我输入要过滤的文本 它会工作一次 但是当我
  • 为什么 Collections.addAll 应该比 c.addAll 更快

    The Java API 文档说 http java sun com javase 6 docs api java util Collections html addAll java util Collection 20T 以下关于Coll
  • 连接空字符串来进行字符串转换真的那么糟糕吗?

    假设我有两个char变量 稍后我想将它们连接成一个字符串 我就是这样做的 char c1 c2 String s c1 c2 我见过有人说 trick 是 丑陋的 等等 你应该使用String valueOf or Character to

随机推荐

  • (个人)AR电子书系统创新实训第一周(2)

    了解ZXing Net 想要在unity上实现下载资源的功能 我首先需要确认二维码扫描系统在unity上的可行性 如果要自行开发一套二维码扫描系统 不仅需要知道二维码生成和解码的原理 而且应该还需要用到一些图形学相关的代码库 如opencv
  • Android中为layout创建子文件夹

    在开发Android项目的时候 往往都有一大批java文件和layout文件 java文件分类比较简单 直接方法创建文件夹就行 但layout还需要多一步配置 看最后的文件结构图 实现步骤 1 创建相应的文件夹结构 需要注意的是 无论如何
  • ‘float‘ object has no attribute ‘decode‘

    错误代码 weibo df pd read csv Users dl Desktop 情感分析论文 词云图 微博文本数据 原始数据 原数据 表格 微博文本内容 csv print weibo df head 在读取csv或者excel文件时
  • Python基础—文件操作

    Python基础 文件操作 文件操作 文件是指为了重复使用或长期使用的目的 以文本或二进制形式存放于外部存储器 硬盘 U盘 光盘等 中的数据保存形式 文件是信息交换的重要途径 也是利用程序解决实际问题的重要媒介 程序对数据读取和处理都是在内
  • 单片机裸机环境下编写AT指令程序

    1 写在前面 AT指令在各种WIFI模块 2G 4G模块以及一些无线通讯模块中应用广泛 但是用过的朋友都知道 这种方式对于单片机编程来说 并不友好 本篇文章将以ESP8266 WIFI模块为例介绍在单片机裸机环境下编写AT指令程序的一种方式
  • 高精地图在无人驾驶中的应用

    转自 http 36kr com p 5060994 html 编者按 本文来自 程序员 作者 陈辰 刘少山 36氪经授权发布 高精地图是无人驾驶核心技术之一 精准的地图对无人车定位 导航与控制 以及安全至关重要 本文是 无人驾驶技术系列
  • PHP操作Redis LIST ,SET, HASH 的相关命令 (一)

    博客搬家 请访问 PHP操作Redis LIST SET HASH 的相关命令 一 PHP操作Redis KEY String 的相关命令 二 PHP操作Redis 有序集 Sorted Set 的相关命令 三
  • HttpServletRequest.getServletContext()一直提示找不到,而引出的问题

    开发j2ee项目的时候 需要用到servlet api 如果使用了maven web项目可以在pom xml中手动加入所需jar包 达到与依赖j2ee libarary同样的功能 可问题来了 1 问题描述 最近使用myeclipse10 7
  • 2023华为OD机试真题【打印机队列/排序】

    题目内容 有5台打印机打印文件 每台打印机有自己的待打印队列 因为打印的文件内容有轻重缓急之分 所以队列中的文件有1 10不同的代先级 其中数字越大优先级越高 打印机会从自己的待打印队列中选择优先级最高的文件来打印 如果存在两个优先级一样的
  • Struts框架(一)——简介

    引言 Struts 一个web应框架 概述 Struts基于MVC的一个web开源框架 也是一个表示层的框架 只能用于Web项目 内容 一 优缺点 1 优点 1 这是一个开源框架 能让开发人员更深入的了解其内部实现机制和原理 2 框架自带的
  • Spring之AOP的实现

    文章目录 什么是AOP jdk动态代理实现AOP spring实现AOP 什么是AOP AOP Aspect Oriented Programming 意为面向切面编程 我们所熟悉的是面向对象编程 OOP 将程序中所有参与模块都抽象成对象
  • vue2、3复习02-组件的生命周期,父子组件、兄弟组件、后代之间组件的数据共享,vuex,全局配置axious,使用ref引用dom元素,使用ref引用组件的方法,this.$nextTick

    1 组件的运行过程 声明周期函数 略 2 父子组件中的数据共享 父向子共享数据 子向父共享数据 父子之间双向数据同步 1 父组件向子组件共享数据 父组件通过v bind属性想子组件共享数据 子组件使用props接收数据 2 子组件向父组件共
  • 【C++】字体文件解析(FreeType)

    目录 字体文件解析 一 前言 二 基本排版概念 1 字体文件 2 字符图像和字符表 3 字符和字体指标 三 字形轮廓 四 字形指标 1 基线 笔和布局 2 排版指标和边界框 3 方位与步进 4 网格拟合的效果 5 文本宽度与边界框 五 代码
  • ipad怎么修改服务器,ipad怎么设置ipv6网络

    ipad怎么设置ipv6网络 内容精选 换一换 本文将为您介绍如何快速搭建IPv4网段或IPv6网段的VPC 以及搭建前的准备工作 IPv4 创建VPC及子网时 默认创建的网段为IPv4类型 IPv4网络无法访问Internet上的IPv6
  • 计算机组成原理实验四 微程序控制器实验报告

    我班算是几乎最后一个做实验的班级了 报告参考了一些朋友提供的数据加上一些自己的主观拙见 本人水平有限加之制作仓促难免有错误 望大家批评指正 4 1 微程序控制器实验 一 实验目的 1 掌握微程序控制器的组成原理 2 掌握微程序的编制 写入
  • 关于安装MinGw的问题

    前段时间电脑很卡 重装了系统 换了两条内存 电脑瞬间满血复活 不过重装各种东西就很麻烦了 安装个MinGW搞了我半天 所以今天记录一下怎么安装MinGW 1 哪下 MinGW w64GCC for Windows 64 32 bitshtt
  • Linux下配置java环境版本opencv

    安装gcc等编译环境 yum install gcc yum install python3 8 yum install cmake yum groupinstall Development Tools 去官方网站下载使用的压缩包4 5 0
  • nerf训练自己的数据,过程记录十分详细

    之前跑很多项目没有记录 后来再弄就不行了 这次特别记录一下 在梳理流程的同时希望给大家带来小小的帮助 我自己是在cuda11 2 windows环境下成功的 过程十分详细 有需要的朋友耐心看完 有问题可以评论区交流 首先 本文nerf是基于
  • Ubuntu 查看系统资源占用(CPU、内存、网络)

    系统监视器 CPU 内存 网络图 仅限当前桌面登录用户 gnome system monitor 查看内存占用 free h w 主要参数 b k m 分别以字节 KB MB 为单位显示内存使用情况 h 以合适的单位显示内存使用情况 最大为
  • SpringBoot+easypoi+vue导出word文档

    因为项目需求需要 临时写的有什么错误的地方望各位见谅 可以借鉴参考 easypoi依赖包