EasyExcel 通过模板 导入、导出、下载模板
EasyExcel 通过模板 导入、导出、下载模板
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;/*** @author ext.libo15* @title: 导入员工花名册*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadRowHeight(value = 40)
public class StudentExcel implements Serializable {private static final long serialVersionUID = -5144055068797033748L;/*** 姓名*/@ExcelProperty(value = "姓名", index = 0)@ColumnWidth(value = 20)@NotBlank(message="姓名不能为空")private String name;/*** 性别 1:男 :2女*/@ExcelProperty(value = "性别\r1:男 :2女", index = 1)@ColumnWidth(value = 20)@NotBlank(message="性别不能为空")private String gender;/*** 出生日期*/@ExcelProperty(value = "出生日期", index = 2)@ColumnWidth(value = 20)@NotBlank(message="出生日期不能为空")@DateTimeStr(format ="yyyy-MM-dd", message = "出生日期格式错误,正确格式为:yyyy-MM-dd")private String birthday;/*** 年龄*/@ExcelProperty(value = "年龄", index = 3)@ColumnWidth(value = 20)@NotBlank(message="年龄不能为空")private String age;/*** 身份证号码*/@ExcelProperty(value = "身份证号码", index = 4)@ColumnWidth(value = 20)@NotBlank(message="身份证号码不能为空")@Pattern(regexp = "^\\d{15}$|^\\d{17}[0-9Xx]$",message = "身份证格式不正确!")//长度18,0-9private String cardNo;/*** 联系电话*/@ExcelProperty(value = "联系电话", index = 5)@ColumnWidth(value = 20)@NotBlank(message="联系电话不能为空")@Pattern(regexp = "^[1][3,4,5,7,8][0-9]{9}$",message = "联系电话格式不正确!")//长度11private String telephone;/*** 是否已婚 1:是 2:否*/@ExcelProperty(value = "是否已婚", index = 6)@ColumnWidth(value = 20)@NotBlank(message="是否已婚不能为空")private String marryStatus;/*** 银行卡号*/@ExcelProperty(value = "银行卡号", index = 8)@ColumnWidth(value = 20)@NotBlank(message="银行卡号不能为空")@Pattern(regexp = "^([1-9]{1})(\\d{14}|\\d{18})$",message = "银行卡号格式不正确!")//长度11private String bankCardNo;
Student 对象(你的业务对象,就是数据库对应的对象)
public class Student implements Serializable {private static final long serialVersionUID = -5144055068797033748L;/*** 姓名*/private String name;/*** 性别 1:男 :2女*/private int gender;/*** 出生日期*/private Date birthday;/*** 年龄*/private int age;/*** 身份证号码*/private String cardNo;/*** 联系电话*/private String telephone;/*** 是否已婚 1:是 2:否*/private int marryStatus;/*** 银行卡号*/private String bankCardNo;/*** 时间*/private Date dimissionDate;
Controller 代码:
/*** 导入*/@RequestMapping(value="/import")public void importExcel(HttpServletRequest request, HttpServletResponse response,@RequestBody MultipartFile file) throws Exception {staffManageService.importExcel(file);}/*** 导出*/@RequestMapping(value="/export",method = RequestMethod.POST)public void batchExport(HttpServletResponse response) throws ParseException {staffManageService.export(response,staffRosterVo);}/*** 下载模板** @param* @return* @throws Exception* @author ext.libo15*/@GetMapping(value="/download")public void download(HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException {FileUtil.downloadExcel(request,response);}
}
2.下载模板
这里其实 Controller + FileUtil 工具类,下载模板的操作已经做好了。工具类我放最下面了
**
3.导入
**
/*** 导入* @param file*/@Overridepublic void importExcel(MultipartFile file) throws Exception {List<Student> ExcelList = null;String validate = "";//校验文件大小 100Mboolean size = FileUtil.checkFileSize(file.getSize(), 100, "M");if(size == false){//文件过大啦,只能100M}//excel读取数据staffExcelList = EasyExcel.read(new BufferedInputStream(file.getInputStream())).head(StaffDataExcel.class).sheet().doReadSync();if (ExcelList.size() > 1000) {//最多导入1000条哦}// excel数据校验validate = ValidatorUtils.beanValidate(ExcelList);if(!validate.equals("success")){//参数异常提示 如:姓名不能为空哦~}//把Excel数据转换成你对应的对象集合ListList<Student> studentList = ExcelUtil.excelListConvertList(ExcelList);//拿到数据后就可以 入库操作啦 -----我自己的入库就不给你们写了StudentService.importExcel(studentList );}
4.导出
/*** 导出* @param response* @param staffRosterVo* @return* @throws ParseException*/@Overridepublic void export(HttpServletResponse response) throws ParseException {String fileName = "导出的文件名称";String sheetName = "导出的 sheetName ";List<Student> list = studentService.findList();List<StaffDataExportExcel> studentExcelList = ExcelUtil.listConvertexcelList(list );try {ExcelUtil.writeExcel(response, studentExcelList , fileName, sheetName, StaffDataExportExcel.class);} catch (Exception e) {e.printStackTrace();}}
5.工具类 FileUtil :
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;public class FileUtil {/*** 判断文件大小** @param len* 文件长度* @param size* 限制大小* @param unit* 限制单位(B,K,M,G)* @return*/public static boolean checkFileSize(Long len, int size, String unit) {
// long len = file.length();double fileSize = 0;if ("B".equals(unit.toUpperCase())) {fileSize = (double) len;} else if ("K".equals(unit.toUpperCase())) {fileSize = (double) len / 1024;} else if ("M".equals(unit.toUpperCase())) {fileSize = (double) len / 1048576;} else if ("G".equals(unit.toUpperCase())) {fileSize = (double) len / 1073741824;}if (fileSize > size) {return false;}return true;}public static void downLoadFile(String filePath, String fileName, HttpServletResponse response) {try (InputStream inStream = new FileInputStream(filePath);OutputStream os = response.getOutputStream()) {response.setHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode(fileName, "UTF-8"));response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");byte[] buff = new byte[100];int len;while ((len = inStream.read(buff)) > 0) {os.write(buff, 0, len);}os.flush();} catch (Exception e) {e.Exception ();}}//下载模板public static void downloadExcel(HttpServletRequest request, HttpServletResponse response){//方法一:直接下载路径下的文件模板(这种方式貌似在SpringCloud和Springboot中,打包成JAR包时,无法读取到指定路径下面的文件,不知道记错没,你们可以自己尝试下!!!)try {//文件名称String fileName = "importStaffRoster.xlsx";//设置要下载的文件的名称response.setHeader("Content-disposition", "attachment;fileName=" + fileName);//通知客服文件的MIME类型response.setContentType("application/vnd.ms-excel;charset=UTF-8");//获取文件的路径String filePath = FileUtil.class.getResource("/template/" + fileName).getPath();FileInputStream input = new FileInputStream(filePath);OutputStream out = response.getOutputStream();byte[] b = new byte[2048];int len;while ((len = input.read(b)) != -1) {out.write(b, 0, len);}//修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是"response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));input.close();} catch (Exception ex) {ex.printStackTrace();}}}
6.工具类 ValidatorUtils (导入的时候参数校验)
import cn.hutool.core.lang.Assert;
import org.apache.commons.lang3.ObjectUtils;import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.*;public class ValidatorUtils {private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();public static String beanValidate(@Valid Object obj) throws IllegalArgumentException {if (obj instanceof Collection) {ValidCollection<Object> validCollection = new ValidCollection<>();validCollection.setList((Collection) obj);return validate(validCollection);} else {return validate(obj);}}public static String validate(@Valid Object obj) {try {Map<String, String> validatedMsg = new HashMap<>();Set<ConstraintViolation<Object>> constraintViolations = validator.validate(obj);String validate = "";String message = "";for (ConstraintViolation<Object> c : constraintViolations) {validate = c.getPropertyPath().toString();validate = validate.substring(5,6);int unm = Integer.valueOf(validate) +1;validatedMsg.put( "表格第"+unm+"条 ", c.getMessage());}Assert.isTrue(ObjectUtils.isEmpty(constraintViolations), validatedMsg.toString());} catch (IllegalArgumentException e) {e.printStackTrace();return e.getMessage();}return "success";}private static class ValidCollection<T> {@Validprivate Collection<T> list;public Collection<T> getList() {return list;}public void setList(Collection<T> list) {this.list = list;}}
}
工具类
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.HorizontalAlignment;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;public class ExcelUtil {/*** 导出* @param response* @param data* @param fileName* @param sheetName* @param clazz* @throws Exception*/public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class clazz) throws Exception {//表头样式WriteCellStyle headWriteCellStyle = new WriteCellStyle();//设置表头居中对齐headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//内容样式WriteCellStyle contentWriteCellStyle = new WriteCellStyle();//设置内容靠左对齐contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);EasyExcel.write(getOutputStream(fileName, response), clazz).excelType(ExcelTypeEnum.XLSX).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy).doWrite(data);}private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {fileName = URLEncoder.encode(fileName, "UTF-8");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");return response.getOutputStream();}/** Excel转换实体类对象*/public static List<Student> excelListConvertList(List<StudentExcel> studentExcelList) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");List<Student> list = new ArrayList<>();for (StudentExcel s : studentExcelList) {Student student = Student.builder().name(staffDataExcel.getname()).age(staffDataExcel.age()).city(staffDataExcel.getCity()).sex(staffDataExcel.getsex().equals("男")?1:2).birthday(sdf.parse(staffDataExcel.getBirthday())).build();list.add(student);}return list ;}/** 导出的List集合 转换 Excel*/public static List<StudentExportExcel> listConvertexcelList(List<Student> student) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");List<StudentExcel> list= new ArrayList<>();for (Student s : student) {StudentExcel excel = StudentExcel.builder().name(staffDataExcel.getname()).age(staffDataExcel.age()).city(staffDataExcel.getCity()).sex(staffDataExcel.getsex().equals("男")?1:2).birthday(sdf.parse(staffDataExcel.getBirthday())).build();.build();list.add(excel);}return list;}}
7.校验日期注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = CheckDateTimeCaseValidator.class)
public @interface DateTimeStr {String message() default "{javax.validation.constraints.DateTimeStr.message}";String format() default "yyyy-MM-dd";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
相关文章:
EasyExcel 通过模板 导入、导出、下载模板
EasyExcel 通过模板 导入、导出、下载模板 import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import java.io.…...

SAP ABAP通过代码解锁SM12中被锁定目标<转载>(RFC: ENQUEUE_READ和 ENQUE_DELETE)
原文链接:https://blog.csdn.net/sinat_38119716/article/details/121406275 备注 RFC:ENQUEUE_READ 读取的是SM12的数据 RFC:ENQUEUE_READ2 读取的是SMENQ的数据 SM12 和 SMENQ 的数据其实是一样的,只是一个是旧的TCODE 一个是新的 解锁用的都是RFC: …...

跳跃表原理及实现
一、跳表数据结构 跳表是有序表的一种,其底层是通过链表实现的。链表的特点是插入删除效率高,但是查找节点效率很低,最坏的时间复杂度是O(N),那么跳表就是解决这一痛点而生的。 为了提高查询效率,我们可以给链表加上索…...

详解Vue3中的鼠标事件mousemove、mouseover和mouseout
本文主要介绍Vue3中的常见鼠标事件mousemove、mouseover和mouseout。 目录 一、mousemove——鼠标移动事件二、mouseover——鼠标移入事件三、mouseout——鼠标移出事件 下面是Vue 3中常用的鼠标事件mousemove、mouseover和mouseout的详解。 一、mousemove——鼠标移动事件 鼠…...

Java:socket编程
目录 1、主程序 2、socket任务类 3、jdbc任务类 4、tomcat-jdbc连接池 5、jar包依赖 1、主程序 创建2个线程池,一个用于管理socket连接,一个用来管理jdbc连接。 package socket;import java.io.IOException; import java.net.ServerSocket; import…...

哨兵1号回波数据(L0级)FDBAQ压缩算法详解
本专栏目录: 全球SAR卫星大盘点与回波数据处理专栏目录-CSDN博客 1. 全球SAR卫星回波数据压缩算法统计 各国的SAR卫星的压缩算法按照时间轴排列如下: 可以看出传统的分块BAQ压缩算法(上图粉色)仍然是主流,哨兵1号其实也有传统的BAQ压缩模式。 本文介绍哨兵1号用的FDBAQ算…...

盾构机数据可视化监控平台 | 图扑数字孪生
2002 年,中国 863 计划把盾构机列为国家关键技术,以国家力量为主导,集中力量进行盾构机专项研究。在 2008 年,中国成功研制出属于自己的国产盾构机——中国中铁一号,同时还打通了天津地铁 1500m 的隧道。此举更彻底地打破了国内盾…...

计算机网络课程设计-企业网三层架构
(单人版) 摘 要 本篇报告主要解决了为一家名为西宫的公司网络搭建问题,该网络采用企业网三层架构对完了过进行设计。首先使用以太网中继,主要使用VLAN划分的技术来划定不同部门。使用MSTP对每个组配置生成树,防止交换机…...
Docker上传镜像到Harbor
上传镜像到Harbor 给镜像打上标签 语法 docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/] docker tag eureka:v1 127.0.0.1:85/tensquare/eureka:v1推送镜像 docker push 127.0.0.12:85/tensquare/eureka:v1如果出现以下错误,是因为Docker没有把Har…...

mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南
mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分,它就像一款程序生活中不可或缺的零件,没了它,程序肯定跑不起来。想想看,没有一个重要的零件ÿ…...

【ArcGIS微课1000例】0084:甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)
甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)。 文章目录 一、成果预览二、实验数据三、符号化四、地图整饰一、成果预览 本实验最终效果图如下所示: 二、实验数据 以下数据可以从本专栏配套的实验数据包中0084.rar中获取。 1. 历史灾害数据。为2005-2020时…...

java SSM拖拉机售后管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
一、源码特点 java SSM拖拉机售后管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源 代码和数据库,系统主要…...

侯捷C++ 2.0 新特性
关键字 nullptr and std::nullptr_t auto 一致性初始化:Uniform Initialization 11之前,初始化方法包括:小括号、大括号、赋值号,这让人困惑。基于这个原因,给他来个统一,即,任何初始化都能够…...

计算机网络——基础知识汇总(八)
个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…...

DIA数皆智能客户体验管理CEM获伊利“健康+AI”生态创新大奖
DIA数皆智能客户体验管理CEM获伊利“健康AI”生态创新大奖 数皆智能再获殊荣! 北京,2023年12月26日 — 在全球瞩目的伊利集团“健康AI”生态创新大赛中,上海数皆智能技术有限公司大放异彩,其创新领先的“智能化客户体验管理CEM&a…...
linux 休眠唤醒中设备、总线、用户进程、内核线程调试分析流程
一、suspending consoles打印 代码位置:Kernel/power/suspend.c 函数调用流程:devices_and_enter(suspend_state_t state) --> suspend_console(); void suspend_console(void) { if (!console_suspend_enabled) 注释这一行,可以看到…...

k8s陈述式资源管理(命令行)
1、资源管理 (1)陈述式资源管理(常用——查、增) 使用kubectl工具进行命令行管理 ①特点:对资源的增删查比较方便,对改不友好 ②优点:90%以上的场景都可以满足 ③缺点:命令冗长…...

五、HTML 标题
在 HTML 文档中,标题很重要。 一、HTML 标题 标题(Heading)是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。 <h1>这是一个标题。</h1> <h2>这是一个标题。&l…...

三菱MR-JE伺服脉冲轴应用参数设置
三菱MR-JE伺服在脉冲轴控制上的应用,常用参数设置如下: 1、常用参数 未完......
通信原理课设(gec6818) 006:网络编程
目录 1、概念 2、通信 3、通信基本流程 TCP: UDP: 4、函数 I 创建套接字 II 绑定地址 III 字节序转换 IV 地址转换 V 监听 VI accept VII connect VIII 从套接字接收信息 IX 从套接字发送消息 X 关闭套接字 5、网络配置 1、确保你的网卡里面有两个虚拟网卡&a…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

在 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…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...