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,接口测试导出

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32—PWM开发SG90舵机

目录 PWM介绍 PWM输出模式&#xff1a; ​编辑PWM占空比&#xff1a; PWM周期与频率公式&#xff1a;​编辑 SG90舵机介绍 1. 什么是舵机 2. 怎么控制舵机 SG90舵机介绍实战 1. 在 SYS 选项里&#xff0c;将 Debug 设为 Serial Wire​编辑 2. 将 RCC 里的 HSE 设置为 …

代码随想录算法训练营第四十天丨 动态规划part03

343. 整数拆分 思路 看到这道题目&#xff0c;都会想拆成两个呢&#xff0c;还是三个呢&#xff0c;还是四个.... 来看一下如何使用动规来解决。 动态规划 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]…

JVM修炼印记之初识

文章目录 JVM认识JVM的功能常见JVMHotSpot的发展历程 JVM认识 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是一个用于执行Java字节码的虚拟计算机。它是Java语言的核心&#xff0c;可以在不同的操作系统和硬件平台上运行Java程序。 JVM负责将Java…

【广州华锐互动】飞机诊断AR远程指导系统为工程师提供更多支持

随着科技的发展&#xff0c;飞机的维护工作也在不断进步。其中&#xff0c;AR&#xff08;增强现实&#xff09;技术的应用使得远程运维成为可能。本文将探讨AR在飞机诊断远程指导系统中的应用&#xff0c;以及它对未来航空维护模式的影响。 AR远程指导系统是一种使用增强现实技…

撕掉Hadoop标签,Cloudera未来可期吗?

Cloudera&#xff1a;大数据的弄潮儿 1、Cloudera发展史2、Cloudera问题出在哪里&#xff1f;3、参考文章 1、Cloudera发展史 说起Cloudera&#xff0c;就不得不提起Hadoop&#xff0c;Cloudera的过去就是Hadoop时代中的一个缩影。作为全球第一家也是最大一家Hadoop商业化公司&…

HarmonyOS鸿蒙原生应用开发设计- 隐私声明

HarmonyOS设计文档中&#xff0c;为大家提供了独特的隐私声明&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的隐私声明内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的内容产生的侵权意外情况等&#xff…

[MySQL]——SQL预编译、动态sql

键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、SQL的预编译 &#x1f4d5;一条SQL语句的执行过程 &#x1f4d5;弊端 &#x1f4d5;预编译SQL的优势 &#x1f4d5;两种参数占位符 &#x1f4d5;小结 二、动态SQL &#x1f4d5;概念介绍&#xff1a; &#x1f4…

Opencv学习笔记(最近更新2023.11.1)

文章目录 棋盘格角点检测findChessboardCorners()亚像素角点检测cornerSubPix(&#xff09;棋盘格角点的绘制drawChessboardCorners()计算外参solvePnPRansac()旋转向量转旋转矩阵Rodrigues()鱼眼畸变矫正initUndistortRectifyMap()检测轮廓findContours()轮廓显示drawContours…

springboot2.x使用@RestControllerAdvice实现通用异常捕获

文章目录 demo地址实现效果引入基础类准备1.通用枚举与错误状态枚举2.定义通用返回结果3.自定义业务异常 统一异常捕获测试 demo地址 demo工程地址 实现效果 当我们输入1时&#xff0c;正常的返回通用的响应结果当我们输入2时&#xff0c;抛出异常&#xff0c;被捕获然后返回…

react-组件生命周期

一、生命周期阶段 官方文档&#xff1a;https://zh-hans.legacy.reactjs.org/docs/react-component.html React组件生命周期可分为三个阶段&#xff1a;挂载、更新、卸载 挂载&#xff1a;当组件实例被创建并插入 DOM 中时。其生命周期调用顺序如下&#xff1a; constructor()s…

【c++Leetcode】287. Find the Duplicate Number

问题入口 思想&#xff1a;Floyds Tortoise and Hare 这个算法除了可以检测是否有环&#xff08;问题入口&#xff09;&#xff0c;还可以用来检测重复数。当然这还需要一个慢指针才能实现。具体请点击标题跳转到原视频&#xff0c;这里是把内容再梳理一遍。如果有不对的地方…

Web自动化测试之图文验证码的解决方案

对于web应用程序来讲&#xff0c;处于安全性考虑&#xff0c;在登录的时候&#xff0c;都会设置验证码&#xff0c; 验证码的类型种类繁多&#xff0c;有图片中辨别数字字母的&#xff0c;有点击图片中指定的文字的&#xff0c;也有算术计算结果的&#xff0c;再复杂一点就是滑…

无测试组织:测试团队的敏捷转型

文章目录 写在前面01 从测试角度理解敏捷理念什么是敏捷&#xff1f;测试人员应该怎样理解敏捷理念&#xff1f;敏捷宣言对于测试活动的启发与思考总结如下敏捷原则12条敏捷实践框架为什么要做敏捷 02 什么是敏捷测试03 敏捷测试为什么会失败04 诊断脑暴会的成果示例测试团队转…

表格识别软件:科技革新引领行业先锋,颠覆性发展前景广阔

表格识别软件的兴起背景可以追溯到数字化和自动化处理的需求不断增加的时期。传统上&#xff0c;手动处理纸质表格是一项费时费力的工作&#xff0c;容易出现错误&#xff0c;效率低下。因此&#xff0c;开发出能够自动识别和提取表格数据的软件工具变得非常重要。 随着计算机…

使用 Python 进行自然语言处理第 5 部分:文本分类

一、说明 关于文本分类&#xff0c;文章已经很多&#xff0c;本文这里有实操代码&#xff0c;明确而清晰地表述这种过程&#xff0c;是实战工程师所可以参照和依赖的案例版本。 本文是 2023 年 1 月的 WomenWhoCode 数据科学跟踪活动提供的会议系列文章中的一篇。 之前的文章在…

【深度学习基础】专业术语汇总(欠拟合和过拟合、泛化能力与迁移学习、调参和超参数、训练集、测试集和验证集)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

linux的环境安装以及部署前后端分离后台接口

⭐⭐ linux专栏&#xff1a;linux专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.linux安装环境 1.1 jdk和tomcat的安装配置 1.1.1 解压jdk和tomcat的安装包 解压jdk安装包 解压tomcat安装包 1.2 jdk环境变量配置 1.3 tomcat启动 1.4 MySQL的安装 二.部署前后端分离…

机器学习快速入门教程 Scikit-Learn实现

机器学习是什么? 机器学习是一帮计算机科学家想让计算机像人一样思考所研发出来的计算机理论。他们曾经说过,人和计算机其实本没有差别,同样都是一大批互相连接的信息传递和存储元素所组成的系统。所以有了这样的想法,加上他们得天独厚的数学功底,机器学习的前身也就孕育而生…

RHCSA -- VMware虚拟机配置及破解密码

一、配置虚拟机 1、开启VMware&#xff08;自定义&#xff09; 2、设置虚拟机硬件兼容性&#xff08;默认&#xff09; 3、稍后安装虚拟机操作系统 4、选择为Linux的虚拟机 5、虚拟机机名 6、设置虚拟机处理器 7、设置虚拟机所连接的网络类型 8、选择磁盘类型 9、设置所选磁…

【源码】医院绩效考核系统-对接HIS核算

医院绩效考核系统&#xff0c;它需要和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作量&#xff0c;绩效考核系统设有手工录入功能&#xff08;可以批量导入&#xff09;&…