SpringBoot+Hutool+thymeleaf完成导出Excel的实现方法
作者:怪咖软妹@ 发布时间:2023-09-05 17:39:10
标签:SpringBoot,thymeleaf,导出,Excel
导出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、测试导出
来源:https://blog.csdn.net/weixin_43888891/article/details/123400868


猜你喜欢
- 其实嵌套滚动已经算一个比较常见的特效了,下面这个动图就是嵌套滚动的一个例子:看到这个动效,大家可能都知道可以用CoordinatorLayo
- idea手动刷新git分支相信很多小伙伴都遇到过这样的问题,在git上新建的分支却在idea的git分支中找不到又不知在哪里刷新,博主最近也
- 最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低。当然到目
- 前言我们在实际项目中,除了会碰到一对一的情况,还有一对多的情况,比如一个用户可以有多辆车,而一辆车只能有一个用户等等,今天我们就来一起学习下
- GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台
- application.properties大家都不陌生,我们在开发的时候,经常使用它来配置一些可以手动修改而且不用编译的变量,这样的作用在
- 一、堆的创建1、向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent
- 有时我们在应用中会用到圆形头像,下面是利用CircleImageView实现圆形头像的演示,下面效果和代码,效果如图实现起来也比较简单,先在
- 话不多说,请看代码:/// <summary> /// 根据指定尺寸得到按比例缩放的尺寸,返回true
- 1.值类型值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。值类型的变量直接存储数据,分配在托管栈中。变量会在创建
- 前言本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效
- redisson的几大特性相信看了这个标题的同学,对这个问题以已经非常不陌生了,信手拈来redisson的几大特性:可重入性【多个业务线同一
- Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常
- 本文实例为大家分享了Java实现马踏棋盘的具体代码,供大家参考,具体内容如下马在某个点最多可能有8种走法,用递归和回溯实现。注:代码中,查找
- 这种结果的原因在于,Random()函数的默认种子是时间,但在循环中产生随机数时,由于运算速度太快,用做种子的时间是相同的(毫秒级),因此产
- 一、需求C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉
- 配置文件<?xml version="1.0" encoding="utf-8" ?>&
- 下面就WPF项目框架搭建步骤一步一步的分享给大家。在WPF项目开发中最常用的开发模式无疑是MVVM模式, MVVM模式开发的好处
- 本文实例讲述了C#隐藏控制台键盘输入的方法。分享给大家供大家参考。具体如下:using System;namespace Robvander
- package com.cjonline.foundation.authority.pojo;import java.util