EasyExcel入门介绍及工具类,网络下载excel
前言:在这里分享自己第一次使用EasyExcel并且编写工具类,且在接口中支持excel文件下载的一系列流程,包含所有前后端(JS+JAVA)完整代码,可以根据自己需要自行提取,仅供参考。
一.引入EasyExcel依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version>
</dependency>
二.自定义创建一个实体类,如下,这里使用了lombok
package com.genew.nms.cloud.lm.vo;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.genew.nms.cloud.lm.config.LocalDateStringConverter;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable;
import java.time.LocalDateTime;/*** @author Salong* @date 2023/5/29 15:38*/@Data
@Accessors(chain = true)
public class UserModel implements Serializable {private static final long serialVersionUID = 1L;@ExcelIgnoreprivate String id;@ExcelProperty(value = "User Name")@ColumnWidth(20)private String userId;@ExcelProperty(value = "User IP")@ColumnWidth(20)private String userIp;@ExcelProperty(value = "Log Time", converter = LocalDateStringConverter.class)@ColumnWidth(20)@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime logTime;}
其中各个注解功能如下:
@ExceIgnore标注的属性,不会被EasyExcel读取识别;
@ExcelProperty(value = "用户名") 被此标记的对象属性,将会显示在‘用户名’的表头下面,此注解还有一个index字段,int类型,从1开始,可以不写,默认按照从上往下的顺序给excel排列。
@ColumnWidth(20) 表示此列的宽度,可以根据内容的长短自定义宽度
需要注意,日期类型的属性,在@ExcelProperty注解中需要额外添加coverter字段
三.编写EasyExcel工具类(这里有两个class,完整代码已贴出,直接复制即可使用)
1.ExcelUtils类
package com.genew.nms.cloud.lm.util;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Salong* @date 2022/8/18 10:51*/@Slf4j
public class ExcelUtils {/*** 本地访问* @param fileFullPath 本地完整路径* @param sheets sheet模板*/public static void writeLocalExcel(String fileFullPath, SheetModel... sheets) {if (null ==sheets || sheets.length==0){log.error("所需参数sheets缺失!");}ExcelWriter excelWriter = EasyExcel.write(fileFullPath).build();List<SheetModel> list = Arrays.asList(sheets);list.forEach(e->{WriteSheet writeSheet = EasyExcel.writerSheet(e.getIndex(), e.getSheetName()).head(e.getClazz()).build();excelWriter.write(e.getData(),writeSheet);});log.info("写入excel成功!");excelWriter.finish();}/**** @param response http请求返回response对象* @param fileName excel文件名* @param excelTypeEnum excel后缀类型(输入ExcelTypeEnum.XLS或者ExcelTypeEnum.XLSX)* @param sheets sheet表单模板* @throws IOException*/public static void writeWebExcel(HttpServletResponse response, String fileName, ExcelTypeEnum excelTypeEnum, SheetModel... sheets) {if (null ==sheets || sheets.length==0){log.error("所需参数sheets缺失!");}List<SheetModel> list = Arrays.asList(sheets);try {OutputStream outputStream = getOutputStream(response, fileName,excelTypeEnum);ExcelWriter excelWriter = EasyExcel.write(outputStream).build();list.forEach(e->{WriteSheet writeSheet = EasyExcel.writerSheet(e.getIndex(), e.getSheetName()).head(e.getClazz()).build();excelWriter.write(e.getData(),writeSheet);});log.info("写入excel成功!");excelWriter.finish();} catch (IOException e) {log.error("excel导出出失败!", e);// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<>();map.put("status", "500");map.put("message", "下载文件失败" + e.getMessage());try {response.getWriter().println(JSON.toJSONString(map));} catch (IOException ex) {log.error("response写入信息失败!",ex);}}}/*** 导出时生成OutputStream*/private static OutputStream getOutputStream(HttpServletResponse response, String fileName,ExcelTypeEnum excelTypeEnum)throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码String file = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + file + excelTypeEnum.getValue());return response.getOutputStream();}
}
2.SheetModel类
package com.genew.nms.cloud.lm.util;import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;
import java.util.List;/*** @author Salong* @date 2022/8/18 10:52*/@Data
@Accessors(chain = true)
public class SheetModel<T> implements Serializable {/*** 表单排序(一个Excel的不同的sheet名称不能一样,会覆盖)*/private int index;/*** sheet表单名称(一个Excel的不同的sheet名称不能一样,会覆盖)*/private String sheetName;/*** 表单填充内容*/private List<T> data;/*** 表头数据类型*/private Class<T> clazz;
}
四.使用方法示例
其中下面演示的response为HttpServletResponse对象,可以用于在网络中传输,
本地生成的参考工具类ExcelUtils.writeLocalExcel方法,这里不一一举例。
//1.模拟获取到的数据信息,并且放在List中,这里用UserModel来举例
List<UserModel> users=new ArrayList<>();
//2.新建SheetModel对象(工作表)
SheetModel<UserModel> model = new SheetModel<>();
//3.构建SheetModel对象基本信息(工作表)
model.setData(users)
.setIndex(0)
.setSheetName("user log")
.setClazz(UserModel.class);//其中,model为此excel中的一个工作表,若excel中有多个工作表,可重复构建多个model对象
//但是index不能一样,否则会覆盖内容
SheetModel<UserModel> model01 = new SheetModel<>();
model01 .setData(users)
.setIndex(1)
.setSheetName("user1 log")
.setClazz(UserModel.class);//4.将上面定义的所有工作表写入到excel(上面的名称是工作表名称,这里的名称为excel名称)
ExcelUtils.writeWebExcel(response, "system Log", ExcelTypeEnum.XLS, model,model01);
五.前端接收文件(JS)
//js中定义,需要引入axios
export function cg(config){let url='/api/xxx';return axios.post(url,config,{responseType: 'blob'});
}//vue中使用
cg(config).then((response)=>{const blob = new Blob([response.data], { type: "application/zip" });let url = window.URL.createObjectURL(blob);const link = document.createElement("a"); // 创建a标签link.href = url;link.download = "gc.zip"; // 重命名文件link.click();URL.revokeObjectURL(url); // 释放内存}).catch((err)=>{console.log(err);})
相关文章:
EasyExcel入门介绍及工具类,网络下载excel
前言:在这里分享自己第一次使用EasyExcel并且编写工具类,且在接口中支持excel文件下载的一系列流程,包含所有前后端(JSJAVA)完整代码,可以根据自己需要自行提取,仅供参考。 一.引入EasyExcel依赖…...
【HarmonyOS北向开发】-04 ArkTS开发语言-ArkTS基础知识
飞书原文档:Docs...
【Alibaba中间件技术系列】「RocketMQ技术专题」小白专区之领略一下RocketMQ基础之最!
应一些小伙伴们的私信,希望可以介绍一下RocketMQ的基础,那么我们现在就从0开始,进入RocketMQ的基础学习及概念介绍,为学习和使用RocketMQ打好基础! RocketMQ是一款快速地、可靠地、分布式、容易使用的消息中间件&#…...
营销活动:提升小程序的用户活跃度的关键
在现今竞争激烈的商业环境中,小程序已成为企业私域营销的重要工具之一。然而,拥有一个小程序并不足以保证用户的活跃度。营销活动作为推动用户参与的有效方式,对于提升小程序的用户活跃度起着至关重要的作用。本文将深入探讨营销活动在提升小…...
Neo4j之CALL基础
CALL 语句用于调用 Neo4j 数据库中预定义的函数、过程或者自定义的函数。它是用来执行一些特定操作或计算的重要工具。以下是一些常用的 CALL 语句示例和解释: 调用内置函数: CALL db.labels()这个示例中,调用了内置函数 db.labels() 来获取…...
【TypeScript】元组
元组(Tuple)是 TypeScript 中的一种特殊数据类型,它允许你定义一个固定数量和类型的元素组合。元组可以包含不同类型的数据,每个数据的类型在元组中都是固定的。以下是 TypeScript 中元组的基本用法和特点: // 声明一…...
数据仓库一分钟
数据分层 一、数据运营层:ODS(Operational Data Store) “面向主题的”数据运营层,也叫ODS层,是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的 ETL…...
提升Python代理程序性能的终极解决方案:缓存、连接池和并发
在开发Python代理程序时,优化性能是至关重要的。本文将为你介绍一套终极解决方案,通过缓存、连接池和并发处理等技术,极大地提升Python代理程序的效率和稳定性。 游戏国内地更换虚拟含ip地址数据库地区 1.缓存技术 缓存是 .0-*-696ES2 0一…...
CSS和AJAX阶段学习记录
1、AJAX的工作原理: 如图所示,工作原理可以分为以下几步: 网页中发生一个事件(页面加载、按钮点击) 由 JavaScript 创建 XMLHttpRequest 对象 XMLHttpRequest 对象向 web 服务器发送请求 服务器处理该请求 服务器将响应…...
Android自定义View知识体系
View的概念、作用和基本属性 View是Android中的基本UI组件,用于构建用户界面。它可以是按钮、文本框、图像等可见元素,也可以是容器,用于组织其他View。View的作用是展示数据和接收用户的输入。它可以显示文本、图片、动画等内容,…...
Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)
前言 ps:最近在参与3100保卫战,战况很激烈,刚刚打完仗,来更新一下之前写了一半的博客。 该篇针对日常写查询的时候,那些动态条件sql 做个简单的封装,自动生成(抛砖引玉,搞个小玩具&a…...
Go 1.21新增的 slices 包详解(三)
Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片。 slices.Max 定义如下: func Max[S ~[]E, E cmp.Ordered](x S) E 返回 x 中的最大值,如果 x 为空,则 panic。对于浮点数 E, 如果有元素为 NaN&am…...
Python 在logging.config.dictConfig()日志配置方式下,使用自定义的Handler处理程序
文章目录 一、基于 RotatingFileHandler 的自定义处理程序二、基于 TimedRotatingFileHandler 的自定义处理程序 Python logging模块的基本使用、进阶使用详解 Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍 …...
Anaconda, Python, Jupyter和PyCharm介绍
目录 1 Anaconda, Python, Jupyter和PyCharm介绍 2 macOS通过Anaconda安装Python, Jupyter和PyCharm 3 使用终端创建虚拟环境并安装PyTorch 4 安装PyCharm并导入Anaconda虚拟环境 5 Windows操作系统下Anaconda与PyCharm安装 6 通过 Anaconda Navigator 创建 TensorFlow 虚…...
axios 各种方式的请求 示例
GET请求 示例一: 服务端代码 GetMapping("/f11") public String f11(Integer pageNum, Integer pageSize) {return pageNum " : " pageSize; }前端代码 <template><div class"home"><button click"getFun1…...
基于开源模型搭建实时人脸识别系统(四):人脸质量
续人脸识别实战之基于开源模型搭建实时人脸识别系统(三):人脸关键点、对齐模型概览与模型选型_CodingInCV的博客-CSDN博客 不论对于静态的人脸识别还是动态的人脸识别,我们都会面临一个问题,就是输入的人脸图像的质量可…...
【开发笔记】ubuntu部署指定版本的前后端运行环境(npm nodejs mysql)
目录 1 背景2 环境要求3 部署流程3.1 npm的安装3.2 nodejs的安装3.3 MySQL的安装 4 可能的问题 1 背景 在远程服务器上的Ubuntu系统中,部署指定版本的前后端项目的运行环境 2 环境要求 npm 9.5.1Nodejs v18.16.1MySQL 8.0.33 3 部署流程 3.1 npm的安装 通过安…...
用于优化开关性能的集成异质结二极管的4H-SiC沟道MOSFET
标题:4H-SiC Trench MOSFET with Integrated Heterojunction Diode for Optimizing Switching Performance 摘要 本研究提出了一种新型的4H-SiC沟道MOSFET,其在栅槽底部集成了异质结二极管(HJD-TMOS),并通过TCAD模拟进…...
优化个人博客总结
前面学习完怎么搭建个人博客,后面要做的就是排版优化自己的博客了,今天通过教程学习到了然后更爱美化其中的效果,还通过改写代码来带到基本的效果展示,同时也把最开始学习的计算速成课的笔记输出在上面,这也是一个很好…...
从零构建深度学习推理框架-9 再探Tensor类,算子输入输出的分配
再探Tensor类: 第二节中我们编写的Tensor类其实并不能满足我们的使用需要,我们将在这一节以代码阅读的方式来看看一个完全版本的Tensor应该具备怎样的要素,同时我们对Tensor类的分析来看看在C中一个设计好的类应该是怎么样的。 Tensor<fl…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
