SpringBoot+Hutool+thymeleaf完成导出Excel的实现方法

 更新时间:2022年03月10日 15:40:48   作者:怪咖软妹@  
这篇文章主要介绍了SpringBoot+Hutool+thymeleaf完成导出Excel,本篇示例当中不仅仅有后端,而且还提供了前端html,html当中利用js将后端 输出流直接下载为文件,需要的朋友可以参考下

导出Excel的框架有很多种,POI相对来说比较老了,很多Excel框架底层都是POI、有EasyPoi、EasyExcel、包括Hutool当中封装的也是POI。唯一不同的是Hutool工具包不局限与做Excel、他里面封装了大量的util,一般现在开发都会用到糊涂。

本篇示例当中不仅仅有后端,而且还提供了前端html,html当中利用js将后端 输出流直接下载为文件。

实现的效果如下:一点击导出文件直接下载到本地。应该现在导出普遍都是这样。

1、引入依赖

这里用到了lombok,就是简化实体类当中的get、set方法的。

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 导出重要依赖|截止2022-03-09 hutool和poi-ooxml依赖是最新的 -->
<!--POI组件 设置字体样式-->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>5.2.1</version>
</dependency>
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.7.22</version>
</dependency>

2、创建实体类

用于导出测试使用。

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {
    private String name;
    private Integer age;
    private String sex;

}

3、创建导出接口

导出主要是围绕ExcelWriter类来进行开发的。

hutool在线api:https://apidoc.gitee.com/dromara/hutool/

我大概看了一眼,根据api其实任何复杂的Excel导出都可以做出来,API可以设置指定单元格样式字体、还有指定行的样式字体、合并单元格等等…

在这里插入图片描述

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.gzl.cn.hutoolexcel.domain.User;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;

@Controller
@RequestMapping("/test")
public class TestController {

    /**
     * 导出测试
     *
     * @param response
     * @param startDate
     * @param endDate
     */
    @PostMapping("/export")
    public void export2(HttpServletResponse response, String startDate, String endDate) {
        List<User> list = data();

        // 1.创建ExcelWriter
        // 通过工具类创建writer,默认创建xls格式
        ExcelWriter excelWriter = ExcelUtil.getWriter();
        //创建xlsx格式的
        //ExcelWriter writer = ExcelUtil.getWriter(true);

        // 2.设置一级标题
        // 合并单元格后的标题行,使用默认标题样式,从0开始
        excelWriter.merge(2, "学生记录");
        // 设置表头高度
        excelWriter.setRowHeight(0, 25);

        // 3.设置二级标题
        excelWriter.addHeaderAlias("name", "姓名");
        excelWriter.addHeaderAlias("age", "年龄");
        excelWriter.addHeaderAlias("sex", "性别");

        // 4.设置表头字体
        // 获取表头样式,获取样式后可自定义样式
        CellStyle headCellStyle = excelWriter.getHeadCellStyle();
        // 获取单元格样式
//        CellStyle cellStyle = excelWriter.getCellStyle();
        // 设置内容字体
        Font font = excelWriter.createFont();
        // 设置字体
        font.setFontName("宋体");
        // 设置字体大小
        font.setFontHeightInPoints((short) 14);
        // 字体加粗
        font.setBold(true);
        // 字体颜色
        font.setColor(Font.SS_NONE);
        headCellStyle.setFont(font);

        // 5.设置单元格宽度
        int[] arr = {30, 30, 25};
        for (int i = 0; i < arr.length; i++) {
            excelWriter.setColumnWidth(i, arr[i]);
        }

        // 只导出有别名的字段
        excelWriter.setOnlyAlias(true);
        // 一次性写出内容,使用默认样式,强制输出标题
        excelWriter.write(list, true);
        // 从第几行写入
//        excelWriter.setCurrentRow(1);
//        excelWriter.writeRow(data());
        // 设置某个单元格的样式
//        CellStyle orCreateCellStyle = excelWriter.getOrCreateCellStyle(0, 1);
        // 设置某行的样式
//        excelWriter.setRowStyle();

        try {
            String fileName = URLEncoder.encode("统计" + startDate + "日到" + endDate + "日", StandardCharsets.UTF_8.name());
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            // 将Excel Workbook刷出到输出流
            excelWriter.flush(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("文件写入失败!");
        }
        //关闭流
        excelWriter.close();
    }

    /**
     * 构造 导出的数据
     *
     * @return
     */
    public List<User> data() {
        List<User> users = new ArrayList<>();
        users.add(new User("张三", 2, "男"));
        users.add(new User("李四", 2, "女"));
        return users;
    }
}

4、创建html

在templates下创建index.html,这样启动项目后直接访问8080端口,他会直接调到index.html。

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script>
</head>
<body>
<input type="button" id="clickme" value="导出"/>
</body>
<script type="text/javascript">
    function postExcelFile(params, url) { //params是post请求需要的参数,url是请求url地址
        var form = document.createElement("form");
        form.style.display = 'none';
        form.action = url;
        form.method = "post";
        document.body.appendChild(form);

        for (var key in params) {
            var input = document.createElement("input");
            input.type = "hidden";
            input.name = key;
            input.value = params[key];
            form.appendChild(input);
        }

        form.submit();
        form.remove();
    }

    //点击导出按钮导出excel表格
    clickme.onclick = function () {
        var params = {};
        params.startDate = '2022-01-01';
        params.endDate = '2022-03-03';
        postExcelFile(params, "/test/export");
    }

</script>
</html>

5、测试导出

在这里插入图片描述

到此这篇关于SpringBoot+Hutool+thymeleaf完成导出Excel的文章就介绍到这了,更多相关SpringBoot导出Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的Fork/Join框架使用详解

    Java中的Fork/Join框架使用详解

    这篇文章主要介绍了Java中的Fork/Join框架使用详解,Fork/Join 框架:就是在必要的情况下,将一个大任务,进行<BR>拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个<BR>的小任务运算的结果进行 join 汇总,需要的朋友可以参考下
    2024-01-01
  • Java中AIO、BIO、NIO应用场景及区别

    Java中AIO、BIO、NIO应用场景及区别

    本文主要介绍了Java中AIO、BIO、NIO应用场景及区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java中url任意跳转漏洞的解决

    java中url任意跳转漏洞的解决

    URL任意跳转漏洞是一种安全漏洞,它发生在应用程序没有正确地验证目标URL,允许攻击者将用户重定向到恶意网站,本文就来介绍一下漏洞的解决修复方案,感兴趣的可以了解一下
    2024-06-06
  • SpringBoot设置首页(默认页)跳转功能的实现方案

    SpringBoot设置首页(默认页)跳转功能的实现方案

    这篇文章主要介绍了SpringBoot设置首页(默认页)跳转功能,本文通过两种方案,给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 学习Java之Java中的异常处理机制详解

    学习Java之Java中的异常处理机制详解

    在本文中,小编将带领大家来学习Java的异常处理机制,包括异常机制、异常类型、如何捕获异常、如何抛出异常以及如何创建自定义异常等核心内容,感兴趣的同学跟着小编一起来看看吧
    2023-08-08
  • springboot vue前后端接口测试树结点添加功能

    springboot vue前后端接口测试树结点添加功能

    这篇文章主要为大家介绍了springboot vue前后端接口测试树结点添加功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Springboot启动流程详细分析

    Springboot启动流程详细分析

    这篇文章主要介绍了SpringBoot启动过程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • SpringBoot中使用websocket出现404的解决方法

    SpringBoot中使用websocket出现404的解决方法

    在Springboot中使用websocket时,本地开发环境可以正常运行,但部署到服务器环境出现404问题,所以本文小编讲给大家详细介绍一下SpringBoot中使用websocket出现404的解决方法,需要的朋友可以参考下
    2023-09-09
  • Java线程池7个参数的详细含义

    Java线程池7个参数的详细含义

    java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Mybatis接口式编程的原理

    Mybatis接口式编程的原理

    mybatis有两种实现方式,一种可以通过xml配置文件实现,其二是面向接口编程的实现。本文重点给大家介绍mybatis接口编程的原理,需要的的朋友参考下
    2017-03-03

最新评论