Web端Excel的导入导出Demo
📚目录
- 📚简介:
- ✨代码的构建:
- 💭Web端接口Excel操作
- 🚀下载接口
- 🚀导入读取数据接口
- 🏡本地Excel文件操作
- ⚡导出数据
- 🌈导入读取数据
📚简介:
使用阿里巴巴开源组件Easy Excel对Excel的读取和写入。如需更详细查看官方文档,当前案例主要对Web端的数据导出,和Excel文件上传到服务端进行数据解析的Demo.其中主要的是工具类的用法。
工具类的主要用法:
- web端接口导出
- web接口导入
- 本地文件读取
- 本地文件导出
✨代码的构建:
Maven坐标
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--easyexcel导出--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</artifactId><groupId>org.apache.poi</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version></dependency><!--这个库提供了操作 Microsoft Office 格式文件的核心功能,包括读取和写入 Excel、Word、PowerPoint 等文件格式的能力。--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency><!--这个库提供了对 OOXML 格式文件的读写能力,因此在处理 .xlsx 格式的 Excel 文件时需要导入这个库。--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.0</version></dependency></dependencies>
项目结构:
EasyExcelUtils 工具代码我放到文章的末尾,其他工具类如果需要的话可以去Gitee上拉代码自行查看 项目Demo
解析类的Excel注解解释
@Data
public class UserInfo {/*** 姓名*/@ExcelProperty(value = "姓名",index = 0)private String name;/*** 性别*/@ExcelProperty(value ="性别",index = 1)private String sex;/*** 年龄*/@ExcelProperty(value ="年龄",index = 2)private Integer age;/*** 忽略这个字段 ExcelIgnore添加后导出和导入都会过滤这个字段*///@ExcelIgnore()@ExcelProperty(value ="手机",index = 3)private String phone;
}
- ExcelProperty index 指定写到第几列,默认根据成员变量排序(使用了index那读取的时候Excel中的文件必须和这个index对应,Excel默认第一个字段就是index=0)。value指定写入的名称,默认成员变量的名字,多个value可以参照快速开始中的复杂头
- ExcelIgnore 添加后导出和导入都会过滤这个字段
- DateTimeFormat 日期转换,将Date写到excel会调用这个注解。里面的value参照java.text.SimpleDateFormat
- NumberFormat 数字转换,用Number写excel会调用这个注解。里面的value参照java.text.DecimalFormat
ExcelProperty的属性介绍
💭Web端接口Excel操作
本次使用的是ApiPost工具模拟接口请求
🚀下载接口
代码
@GetMapping("userInfo/excelExport")public ResultData userInfoExcelExport() {List<UserInfo> userInfoList = getUserInfoList();EasyExcelUtils.download("用户列表", userInfoList);return ResultData.success();}public List<UserInfo> getUserInfoList() {List<UserInfo> userInfoList = new ArrayList<>();List<String> sexStrList = Arrays.asList("男", "女");Random sexRandom = new Random();for (int i = 0; i < 10; i++) {UserInfo userInfo = new UserInfo();String sexStr = sexStrList.get(sexRandom.nextInt(sexStrList.size()));userInfo.setSex(sexStr);String name = UserBuildUtils.buildName(sexStr);userInfo.setName(name);userInfo.setAge(RandomUtils.nextInt(18, 35));userInfo.setPhone(UserBuildUtils.generatePhoneNumber());userInfoList.add(userInfo);}return userInfoList;}
效果
下载文件中打开
🚀导入读取数据接口
代码
@PostMapping("userInfo/excelImport")public ResultData userInfoExcelImport(@RequestParam("file") MultipartFile file) throws IOException {//解析导入的excel文件成对象List<UserInfo> userInfoList = EasyExcelUtils.readExcel(UserInfo.class, file.getInputStream());//处理对象System.out.println(userInfoList);return ResultData.success();}
效果
本地文件用户列表1713077847559.xlsx
文件中一共有100条用户数据,接下来使用工具请求导入接口完成Excel文件数的读取
请求接口:
🏡本地Excel文件操作
⚡导出数据
代码
/*** Excel的导出*/@Testvoid ExcelExport() {String outFile = System.getProperty("user.dir") + File.separatorChar + "file";List<UserInfo> userInfoList = new ArrayList<>();List<String> sexStrList = Arrays.asList("男","女");Random sexRandom = new Random();for (int i = 0; i < 100; i++) {UserInfo userInfo = new UserInfo();String sexStr = sexStrList.get(sexRandom.nextInt(sexStrList.size()));userInfo.setSex(sexStr);String name = UserBuildUtils.buildName(sexStr);userInfo.setName(name);userInfo.setAge(RandomUtils.nextInt(18, 35));userInfo.setPhone(UserBuildUtils.generatePhoneNumber());userInfoList.add(userInfo);}String outFileName = "用户列表" + System.currentTimeMillis() + ".xlsx";EasyExcelUtils.write(outFile, outFileName, UserInfo.class, userInfoList, "用户列表");}
效果:会在当前工程中的file文件夹中创建导出的Excel文件
🌈导入读取数据
代码
/*** Excel导入*/@Testvoid ExcelImport() {//Excel文件路径String filePath = System.getProperty("user.dir") + File.separatorChar + "file" + File.separatorChar+ "readFile" + File.separatorChar + "用户列表1713077847559.xlsx";List<UserInfo> userInfoList = EasyExcelUtils.readExcel(UserInfo.class, filePath);System.out.println(userInfoList);}
效果: 指定需要读取的文件路径
EasyExcelUtils 工具类:
/*** @Author itmei* @Date 2024/4/13 20:49* @description:* @Title: EasyExcelUtils* @Package com.itmei.exceldemo.utils*/
public class EasyExcelUtils {/*** 写文件** @param outFileName 写的路径* @param clazz 用于获取类中的Excel注解* @param list 数据*/public static void write(String outFileName, Class<?> clazz, List<?> list) {// 新版本会自动关闭流,不需要自己操作EasyExcel.write(outFileName, clazz).sheet().doWrite(list);}/*** 写文件** @param outFileName 文件名称* @param clazz 用于获取类中的Excel注解* @param list 数据* @param sheetName 工作簿名称*/public static void write(String outFileName, Class<?> clazz, List<?> list, String sheetName) {// 新版本会自动关闭流,不需要自己操作EasyExcel.write(outFileName, clazz).sheet(sheetName).doWrite(list);}/*** 写文件** @param outFile 保存的文件位置(必须存在否则报错)* @param outFileName 文件名称* @param clazz 用于获取类中的Excel注解* @param list 数据* @param sheetName 工作簿名称*/public static void write(String outFile, String outFileName, Class<?> clazz, List<?> list, String sheetName) {// 新版本会自动关闭流,不需要自己操作ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(outFile + File.separatorChar + outFileName, clazz);excelWriterBuilder.sheet(sheetName).doWrite(list);}/*** 写文件** @param outputStream 输出流* @param list 数据* @param sheetName 工作簿名称*/public static void write(OutputStream outputStream, List<?> list, String sheetName) {Class<?> clazz = list.get(0).getClass();// sheetName为sheet的名字,默认写第一个sheetEasyExcel.write(outputStream, clazz).sheet(sheetName).doWrite(list);}/*** 文件下载,用于前端下载Excel** @param sheetName 工作簿名称* @param list 数据* @throws IOException*/public static void download(String sheetName, List<?> list) {HttpServletResponse response = HttpServletUtil.getResponse();try {Class<?> clazz = list.get(0).getClass();response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode(sheetName + "_" + DateUtils.format(new Date()), "UTF-8").replaceAll("\\+", "%20") + ".xlsx";response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);EasyExcel.write(response.getOutputStream(), clazz).autoCloseStream(false).sheet(sheetName).doWrite(list);} catch (Exception e) {handleException(response, e);}}private static void handleException(HttpServletResponse response, Exception e) {response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, Object> map = MapUtils.newHashMap();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());try {response.getWriter().println(mapToJsonString(map));} catch (IOException ioException) {ioException.printStackTrace();}}/*** 将 Map 对象转换成 JSON 格式的字符串** @param map* @return*/public static String mapToJsonString(Map<String, Object> map) {StringBuilder json = new StringBuilder("{");boolean first = true;for (Map.Entry<String, Object> entry : map.entrySet()) {if (!first) {json.append(",");}json.append("\"").append(entry.getKey()).append("\":");Object value = entry.getValue();if (value instanceof String) {json.append("\"").append(value).append("\"");} else {json.append(value);}first = false;}json.append("}");return json.toString();}/*** 读取Excel文件并且返回集合对象** @param classT* @param filePath* @param <T>* @return*/public static <T> List<T> readExcel(Class<T> classT, String filePath) {List<T> readAllList = new ArrayList<>();EasyExcel.read(filePath, classT, new ReadListener<T>() {@Overridepublic void invoke(T data, AnalysisContext context) {//这个每一条数据解析都会来调用readAllList.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//全部读取完成后会调用}}).sheet().doRead();return readAllList;}public static <T> List<T> readExcel(Class<T> classT, InputStream inputStream) {List<T> readAllList = new ArrayList<>();try {EasyExcel.read(inputStream, classT, new ReadListener<T>() {@Overridepublic void invoke(T data, AnalysisContext context) {// 这个每一条数据解析都会来调用readAllList.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 全部读取完成后会调用try {inputStream.close(); // 关闭输入流} catch (IOException e) {e.printStackTrace();}}}).sheet().doRead();} catch (Exception e) {e.printStackTrace();// 处理异常情况,比如日志记录或者抛出自定义异常}return readAllList;}
}
相关文章:

Web端Excel的导入导出Demo
📚目录 📚简介:✨代码的构建:💭Web端接口Excel操作🚀下载接口🚀导入读取数据接口 🏡本地Excel文件操作⚡导出数据🌈导入读取数据 📚简介: 使用阿里巴巴开源组件Easy Exce…...

Java日期正则表达式(附Demo)
目录 前言1. 基本知识2. Demo 前言 对于正则匹配,在项目实战中运用比较广泛 原先写过一版Python相关的:ip和端口号的正则表达式 1. 基本知识 对于日期的正则相对比较简单 以下是一些常见的日期格式及其对应的正则表达式示例: 年-月-日&a…...

基于LabVIEW的CAN通信系统开发案例
基于LabVIEW的CAN通信系统开发案例 介绍了基于LabVIEW开发的CAN通信系统,该系统主要用于汽车行业的数据监控与分析。通过对CAN通信协议的有效应用,实现了车辆控制系统的高效信息交换与实时数据处理,从而提升了车辆性能的检测与优化能力。 项…...

SAP SD学习笔记07 - 紧急发注(急单),现金贩卖,贩卖传票Type/ 明细Category 及其Customize
上面讲SAP中主干流程的时候,还有后面讲一括处理的时候,都用的是 OR 标准受注。 SAP SD学习笔记01 - 简单走一遍SD的流程:受注,出荷,请求_怎么学好sd模块-CSDN博客 下面开始讲一些稀奇古怪的非标准流程。 当然&#x…...

(六)C++自制植物大战僵尸游戏关卡数据讲解
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 游戏关卡数据文件定义了游戏中每一个关卡的数据,包括游戏类型、关卡通关奖励的金币数量、僵尸出现的波数、每一波出现僵尸数量、每一波僵尸出现的类型等。根据不同的游戏类型,定义了不同的通…...

Java基于微信小程序的校园外卖平台设计与实现,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
渗透工具及其知识库(个人笔记)
1.IP搜寻 查看kali网段: ip addr 、 ifconfig namp:nmap -sP xxx.xxx.xxx.0/24 netdiscover:netdiscover xxx.xxx.xxx.0/24 arp:arp-scan -l 2.端口扫描 粗略扫描:nmap <IP> 深度扫描: …...

MongoDB的使用
一、Spring Boot集成MongoDB 1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency> 2 配置文件配置mongodb资料 # MongoDB连接信息 spring.…...

labview中FP.isFrontmost不生效?
主GUI界面中调用子GUI程序FP.isFrontmost不生效? 如果主GUI程序使用“floating”,子GUI程序使用default动作,则子GUI无法打开到最前。子GUI程序只能使用“模态”才能置顶。 主GUI程序: 子GUI程序: 改正的方法很简单,…...
Vela-OS: 记录一个class层,处理MSC协议的bug
一、关于USC-MSC类设备驱动层,处理SCSI指令的代码逻辑问题 1. 源文件 \nuttx\drivers\usbdev\usbmsc_scsi.c 2. 问题描述 对于INQUIRY指令,长度一般是6个字节,cdblen字段嵌入在CBW数据包中,如下: 命令阶段的CBW数据包: 55 53 42 43 60 2a c0 8b 24 00 00 00 0x80 0x…...

跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux
React Redux 和 Vuex 都是前端状态管理库,分别用于 React 和 Vue.js 框架。 它们都提供了一套规范的状态管理机制,帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点: 相同点: 中心化状态管理:两者都提…...

第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结
目录 个人总结 C/C 组真题 握手问题 小球反弹 好数 R 格式 宝石组合 数字接龙 爬山 拔河 编辑 再总结及后续规划 个人总结 第一次参加蓝桥杯,大二,以前都在在学技术,没有系统的学过算法。所以,还是花了挺多时间去备…...

【Qt踩坑】ARM 编译Qt5.14.2源码-QtWebEngine
1.下载源码 下载网站:Index of /new_archive/qt/5.14/5.14.2/single 2.QWebEngine相关依赖 sudo apt-get install flex libicu-dev libxslt-dev sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev sudo apt-get …...

SQL语法 case when语句用法讲解
CASE WHEN解释 : SQL中的CASE WHEN语句是一种条件表达式,它允许你根据不同的情况返回不同的值。CASE WHEN通常用于SELECT语句中,用于创建新的列,该列的值取决于其他列的值。CASE WHEN可以用于任何可以使用表达式的地方。 大致概…...

Project Euler_Problem 193_Few Repeated Digits_欧拉筛+容斥公式
解题思路:暴力搜索 代码: void solve() {ll i, j,k,x,y,z,p,q,u,v,l,l1;N 999966663333, NN 1024;//N 1000;double a, b, c,d;M.NT.get_prime_Euler(1000000);l M.NT.pcnt;for (i 1; i < l; i) {u M.NT.prime[i];v M.NT.prime[i 1];x u * …...

排序算法-基数排序
基数排序是一种非比较排序算法,它将待排序的数字按照位数进行排序。基数排序的思想是先按照个位数进行排序,然后按照十位数进行排序,接着按照百位数进行排序,以此类推,直到最高位排序完成。 基数排序的步骤如下&#x…...

ChatGPT在线网页版
ChatGPT镜像 今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像…...
5.SpringSpringBoot八股
Spring,Spring MVC,Spring Boot 之间什么关系? Spring就是整个Spring框架的整体,包含AOP、JDBC、Spring MVC等等模块 SpringBoot是Spring的精简版,它在Spring的基础上添加了自动装配、内置tomcat服务器等功能,使得代码量更少,同…...
0基础刷图论最短路 3(从ATcoder 0分到1800分)
AT最短路刷题3(本文难度rated 1200~ 1400) 题目来源:Atcoder 题目收集: https://atcoder-tags.herokuapp.com/tags/Graph/Shortest-Path (里面按tag分类好了Atcoder的所有题目,类似cf) &#x…...
k8s+docker一键安装过程
环境: k8s 1.20 docker 20.10 centos7.9 #docker安装 yum install -y epel-release yum install -y yum-utils yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce-20.10.6 docker-ce-cli-2…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...