Springboot使用EasyExcel导入导出Excel文件
1,准备Excel文件和数据库表结果


2,导入代码
1,引入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version></dependency>
2,创建请求body
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;/*** Description** @author WangYaoLong* @createdate 2023/11/01 0001 11:43*/
@Data
public class StudentImportExcelForm {@ExcelProperty(value = "学生姓名", index = 0)private String name;@ExcelProperty(value = "性别", index = 1)private String sex;@ExcelProperty(value = "学号", index = 2)private String stuId;@ExcelProperty(value = "身份证号", index = 3)private String identityNum;@ExcelProperty(value = "所在班级", index = 4)private String classesId;@ExcelProperty(value = "简介", index = 5)private String remarks;@ExcelProperty(value = "生日", index = 6)private String birthday;
}
3,Excel文件数据解析
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.wang.dog.exception.BusinessException;
import com.wang.dog.pojo.form.StudentImportExcelForm;
import com.wang.dog.service.StudentService;
import com.wang.dog.utils.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;/*** Description** @author WangYaoLong* @createdate 2023/11/01 0001 11:42*/
@Slf4j
public class StudentImportExcelListener extends AnalysisEventListener<StudentImportExcelForm> {private final List<StudentImportExcelForm> list = new ArrayList<>();private final StudentService studentService;public StudentImportExcelListener() {this.studentService = SpringContextHolder.getBean(StudentService.class);}private StringBuilder msg = new StringBuilder();@Overridepublic void invoke(StudentImportExcelForm studentExcelForm, AnalysisContext analysisContext) {log.info("学生信息" + studentExcelForm);checkStudentFiled(studentExcelForm);list.add(studentExcelForm);}/*** 校验学生信息** @param studentExcelForm 学生导入表单*/private void checkStudentFiled(StudentImportExcelForm studentExcelForm) {String name = studentExcelForm.getName();String stuId = studentExcelForm.getStuId();String classesId = studentExcelForm.getClassesId();String sex = studentExcelForm.getSex();String identityNum = studentExcelForm.getIdentityNum();if (StringUtils.isBlank(name)) {msg.append("学生姓名不能为空!");}if (StringUtils.isBlank(stuId)) {msg.append("学生学号不能为空!");}if (StringUtils.isBlank(classesId)) {msg.append("学生所在班级不能为空!");}if (StringUtils.isBlank(sex)) {msg.append("学生性别不能为空!");}if (StringUtils.isBlank(identityNum)) {msg.append("学生身份证信息不能为空!");}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {if (StringUtils.isNotBlank(msg)) {throw new ExcelAnalysisException("导入失败!<br/>" + msg.toString());}if (CollectionUtils.isEmpty(list)) {throw new BusinessException("导入文件为空");}// 保存学生信息saveData();// 清空集合和异常信息msg = null;list.clear();}/*** 保存 加上存储数据库*/@Transactional(rollbackFor = Exception.class)public void saveData() {studentService.importExcelData(list);}
}
4,在StudentService中新增接口以及实现类保存数据
接口方法
/*** 导入Excel学生信息** @param list 学生信息集合*/void importExcelData(List<StudentImportExcelForm> list);
实现类
@Overridepublic void importExcelData(List<StudentImportExcelForm> list) {List<Student> studentList = new ArrayList<>();list.forEach(s -> {Student student = new Student();student.setName(s.getName());student.setSex(Integer.parseInt(String.valueOf(s.getSex().equals("男") ? 0 : 1)));student.setStuId(s.getStuId());student.setIdentityNum(s.getIdentityNum());student.setClassesId(s.getClassesId());student.setCreateTime(new Date());student.setUpdateTime(new Date());student.setCreateBy(s.getName());student.setUpdateBy(s.getName());student.setDelFlag(0);student.setRemarks(s.getRemarks());student.setBirthday(s.getBirthday());studentList.add(student);});// 批量保存学生信息this.saveBatch(studentList);}
5,新增导入Excel接口
@Slf4j
@RequestMapping("/student")
@RestController
public class StudentController {@PostMapping("/import")public Result uploadStudentInfo(MultipartFile file) throws IOException {InputStream is = file.getInputStream();EasyExcel.read(is, StudentImportExcelForm.class, new StudentImportExcelListener()).sheet(0).headRowNumber(1).doRead();return Result.ok("success");}
}
6,测试

3,导出Excel
1,导出Excel表单请求
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;/*** Description** @author WangYaoLong* @createdate 2023/11/01 0001 13:03*/
@Data
public class StudentExportExcelForm {@ApiModelProperty(value = "姓名", example = "")private String name;@ApiModelProperty(value = "身份证号", example = "")private String identityNum;@ApiModelProperty(value = "所在班级", example = "")private String classesId;@ApiModelProperty(value = "性别", example = "")private String sex;}
2,返回表单
@Data
@HeadRowHeight(15) // 高度
@HeadFontStyle(fontHeightInPoints = 10)
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER) // 字体居中显示
public class StudentExportExcelVo {@ExcelProperty(value = "学生姓名", order = 1)@ColumnWidth(20) // excel 单元格间距private String name;@ExcelProperty(value = "性别", order = 2)@ColumnWidth(20)private String sex;@ExcelProperty(value = "学号", order = 3)@ColumnWidth(20)private String stuId;@ExcelProperty(value = "身份证号", order = 4)@ColumnWidth(20)private String identityNum;@ExcelProperty(value = "所在班级", order = 5)@ColumnWidth(20)private String classesId;@ExcelProperty(value = "简介", order = 6)@ColumnWidth(20)private String remarks;@ExcelProperty(value = "生日", order = 7)@ColumnWidth(20)private String birthday;
}
3,导出查询接口
@GetMapping("/export")public void exportStudentExcel(StudentExportExcelForm studentExportExcelForm, HttpServletResponse response) throws Exception {List<StudentExportExcelVo> list = studentService.exportStudent(studentExportExcelForm);// 不带表头//DownExcelUtils.download(response, StudentExportExcelVo.class, list, "学生信息导出");// 增加表头DownExcelUtils.download(response, StudentExportExcelVo.class, list, "学生信息导出", ExportStudentExcelHandler.class);}
4,学生数据查询
/*** 查询学生信息** @param studentExportExcelForm 学生请求表单* @return List*/List<StudentExportExcelVo> exportStudent(StudentExportExcelForm studentExportExcelForm);
实现类:
@Overridepublic List<StudentExportExcelVo> exportStudent(StudentExportExcelForm form) {List<StudentExportExcelVo> list = Lists.newArrayList();LambdaQueryWrapper<Student> studentQueryWrapper = Wrappers.<Student>lambdaQuery().orderByAsc(Student::getBirthday);if (StringUtils.isNotBlank(form.getName())) {studentQueryWrapper.like(Student::getName, form.getName());}if (StringUtils.isNotBlank(form.getIdentityNum())) {studentQueryWrapper.eq(Student::getIdentityNum, form.getIdentityNum());}if (StringUtils.isNotBlank(form.getClassesId())) {studentQueryWrapper.eq(Student::getClassesId, form.getClassesId());}if (StringUtils.isNotBlank(form.getSex())) {studentQueryWrapper.eq(Student::getSex, form.getSex().equals("男") ? 0 : 1);}List<Student> studentList = studentMapper.selectList(studentQueryWrapper);if (CollectionUtils.isNotEmpty(studentList)) {studentList.forEach(s -> {StudentExportExcelVo vo = new StudentExportExcelVo();BeanUtils.copyProperties(s, vo);vo.setSex(s.getSex() == 0 ? "男" : "女");list.add(vo);});}return list;}
5,导出工具类
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.handler.WriteHandler;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;/*** @author: WangYaoLong* @date: 2022/8/1* @description: excel导出工具类*/
public class DownExcelUtils {/*** 带有表头提示** @param response* @param t* @param list* @param fileName* @param z* @throws IOException* @throws IllegalAccessException* @throws InstantiationException*/public static void download(HttpServletResponse response, Class t, List list, String fileName, Class z) throws IOException, IllegalAccessException, InstantiationException {// 设置文本内省response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");EasyExcel.write(response.getOutputStream(), t).sheet(fileName)//设置拦截器或自定义样式.registerWriteHandler((WriteHandler) z.newInstance())//这里1代表第二行开始.relativeHeadRowIndex(1).doWrite(list);}/*** 不带表头提示** @param response* @param t* @param list* @param fileName* @throws IOException*/public static void download(HttpServletResponse response, Class t, List list, String fileName) throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");EasyExcel.write(response.getOutputStream(), t).sheet(fileName).doWrite(list);}
}
6,表头类
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;public class ExportStudentExcelHandler implements SheetWriteHandler {@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {Workbook workbook = writeWorkbookHolder.getWorkbook();Sheet sheet = workbook.getSheetAt(0);CellStyle cellStyle = workbook.createCellStyle();// 自动换行cellStyle.setWrapText(true);cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//第一行//设置标题Row row = sheet.createRow(0);row.setHeight((short) 900);Cell cell = row.createCell(0);cell.setCellStyle(cellStyle);cell.setCellValue("这是学生信息导出表格(注:xxxxxxxxx数据内容不可更改)");sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, 7));}
}
7,接口测试导出


相关文章:
Springboot使用EasyExcel导入导出Excel文件
1,准备Excel文件和数据库表结果 2,导入代码 1,引入依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifac…...
Pytorch L1,L2正则化
L1正则化和L2正则化是常用的正则化技术,用于在机器学习模型中控制过拟合。它们的主要区别在于正则化项的形式和对模型参数的影响。 L1正则化(Lasso正则化): 正则化项形式:L1正则化使用模型参数的绝对值之和作为正则化…...
【Elasticsearch 未授权访问漏洞复现】
文章目录 一、漏洞描述二、漏洞复现三、修复建议 一、漏洞描述 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布&am…...
pytorch笔记:PackedSequence对象送入RNN
pytorch 笔记:PAD_PACKED_SEQUENCE 和PACK_PADDED_SEQUENCE-CSDN博客 当使用pack_padded_sequence得到一个PackedSequence对象并将其送入RNN(如LSTM或GRU)时,RNN内部会进行特定的操作来处理这种特殊的输入形式。 使用PackedSequ…...
C#WPF工具提示(ToolTip)实例
本文演示C#WPF工具提示(ToolTip)实例 ToolTip ToolTip是当鼠标移到某个控件上后可以弹出提示的控件 属性说明 1、HasDropShadow 决定工具提示是否具有扩散的黑色阴影,使其和背后的窗口区别开来 2、Placement 使用PlacementMode枚举值决定如何放置工具提示。默认值是M…...
智慧矿山系统中的猴车安全监测与识别
智慧矿山是近年来兴起的一种采用人工智能(AI)技术的矿山管理方式,它通过利用智能传感设备和先进算法来实现对矿山环境和设备进行监测和管理,从而提高矿山的安全性和效率。在智慧矿山的AI算法系列中,猴车不安全行为识别…...
网络协议--TCP连接的建立与终止
18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将详细讨论一个TCP连接是如何建立的以及通信结束后是如何终止的。 这种两端间连接的建立与无连接协议如UDP不同。我们在第11章看到一端使用UDP向另一端发…...
react条件渲染
目录 前言 1. 使用if语句 2. 使用三元表达式 3. 使用逻辑与操作符 列表渲染 最佳实践和注意事项 1. 使用合适的条件判断 2. 提取重复的逻辑 3. 使用适当的key属性 总结 前言 在React中,条件渲染指的是根据某个条件来决定是否渲染特定的组件或元素。这在构…...
Docker中Failed to initialize NVML: Unknown Error
参考资料 Docker 中无法使用 GPU 时该怎么办(无法初始化 NVML:未知错误) SOLVED Docker with GPU: “Failed to initialize NVML: Unknown Error” 解决方案需要的条件: 需要在服务器上docker的admin list之中. 不需要服务器整体的admin权限.…...
学习笔记|单样本秩和检验|假设检验摘要|Wilcoxon符号检验|规范表达|《小白爱上SPSS》课程:SPSS第十一讲 | 单样本秩和检验如何做?很轻松!
目录 学习目的软件版本原始文档单样本秩和检验一、实战案例二、统计策略三、SPSS操作1、正态性检验2.单样本秩和检验 四、结果解读第一,假设检验摘要第二,Wilcoxon符号检验结果摘要。第三,Wilcoxon符号秩检验图第四,数…...
ttkefu在线客服在客户联络领域的价值
随着互联网的快速发展,越来越多的企业开始注重在线客服的应用。ttkefu作为一款智能在线客服系统,在客户联络领域中展现出了巨大的价值。本文将详细介绍ttkefu在线客服在客户联络领域的应用优势、专家分析以及未来发展趋势。 一、ttkefu在线客服简介 tt…...
创新方案|2023如何用5种新形式重塑疫后实体门店体验
在电商盛行的当下,线上购物已成为新零售的重要组成部分,实体零售业正处于两难境地。一方面,实体零售是绝对有必要的:美国约 85% 的销售额来自实体商店。 另一方面,尽管增长放缓,但电商收入占销售总额的比例…...
Aqua Data Studio 2023.1
为什么选择 Aqua Data Studio? 随着数据在业务中的作用不断发展,组织需要一种有效的方法来简化复杂的技术任务并缩小 IT 和业务团队之间的差距。 使用多个数据库平台不再复杂。使用 Aqua Data Studio 简化您的所有数据管理流程和任务:这是一…...
【C++智能指针】
智能指针 为什么使用智能指针?概念分类auto_ptrunique_ptrshared_ptr循环引用weak_ptr 为什么使用智能指针? 考虑以下场景: void div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return…...
gcc/g++使用格式+各种选项,预处理/编译(分析树,编译优化,生成目标代码)/汇编/链接过程(函数库,动态链接)
目录 gcc/g--编译器 介绍 使用格式 通用选项 编译选项 链接选项 程序编译过程 预处理(宏替换) 编译 (生成汇编) 分析树(parse tree) 编译优化 删除死代码 寄存器分配和调度 强度削弱 内联函数 生成目标代码 汇编 (生成二进制代码) 链接(生成可执行文件) 函…...
OSPF复习(2)
目录 一、LSA的头部 二、6种类型的LSA(课堂演示) 1、type1-LSA:----重要且复杂 2、type2-LSA: 3、type3-LSA: 4、type4-LSA: 5、type5-LSA: 6、type7-LSA: 三、OSPF的网络类…...
FPGA时序分析与约束(9)——主时钟约束
一、时序约束 时序引擎能够正确分析4种时序路径的前提是,用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息,这些信息只能由用户主动告知,时序引擎对有些信息可以自动推断,但是推断得到…...
sqlite3 关系型数据库语言 SQL 语言
SQL(Structured Query Language)语言是一种结构化查询语言,是一个通用的,功能强大的关系型数据库操作语言. 包含 6 个部分: 1.数据查询语言(DQL:Data Query Language) 从数据库的二维表格中查询数据,保留字 SELECT 是 DQL 中用的最多的语句 2.数据操作语言(DML) 最主要的关…...
spring boot中的多环境配置
1.切换环境 spring:profiles:include: devactive: dev的作用是为了启动某个环境,两个作用基本一致, 环境定义如下: spring:profiles: dev或者是查找application-dev.yml这个文件的所有配置 2.加载文件 spring:config:import:- optional:f…...
python3 阿里云api进行巡检发送邮件
python3 脚本爬取阿里云进行巡检 不确定pip能不能安装上,使用时候可以百度一下,脚本是可以使用的,没有问题的 太长时间了,pip安装依赖忘记那些了,使用科大星火询问了下,给了下面的,看看能不能使…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
