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

作者:怪咖软妹@ 时间:2023-09-05 17:39:10 

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

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

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

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

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可以设置指定单元格样式字体、还有指定行的样式字体、合并单元格等等&hellip;

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

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。

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

<!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的实现方法

来源:https://blog.csdn.net/weixin_43888891/article/details/123400868

标签:SpringBoot,thymeleaf,导出,Excel
0
投稿

猜你喜欢

  • C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题

    2022-07-06 19:04:51
  • 基于Android10渲染Surface的创建过程

    2022-02-02 12:25:13
  • C语言实现学生信息管理系统

    2023-05-24 12:08:50
  • 分享C#操作内存读写方法的主要实现代码

    2022-10-08 08:08:44
  • Flutter实现底部和顶部导航栏

    2021-10-26 20:15:53
  • 老生常谈Java动态编译(必看篇)

    2022-04-02 14:19:38
  • 在Spring Boot2中使用CompletableFuture的方法教程

    2022-09-27 14:18:51
  • HttpClient 在Java项目中的使用详解

    2021-12-06 02:36:57
  • Android进程运行中权限被收回导致关闭的问题解决

    2023-11-21 16:56:45
  • JAVA 格式化日期、时间的方法

    2023-10-17 07:53:22
  • 自己动手写一个java版简单云相册

    2022-09-08 01:28:56
  • Java StringBuffer与StringBuilder有什么区别

    2022-12-15 22:35:12
  • C#中Request.Cookies 和 Response.Cookies 的区别分析

    2023-07-10 07:24:59
  • Java数据结构之AC自动机算法的实现

    2023-08-31 07:23:57
  • java中的key接口解析

    2023-09-22 14:44:00
  • Unity3D使用UGUI开发原生虚拟摇杆

    2021-10-04 17:28:26
  • springboot集成elasticsearch7的图文方法

    2022-05-15 19:46:11
  • Java实现字符串转换成可执行代码的方法

    2022-06-14 02:30:49
  • 关于java 图形验证码的解决方法

    2023-08-09 15:21:19
  • MyBatis Oracle 自增序列的实现方法

    2023-08-03 11:30:08
  • asp之家 软件编程 m.aspxhome.com