SpringBoot项目使用EasyExcel读取上传Excel

SpringBoot项目使用EasyExcel读取上传Excel

1、EasyExcel简介

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

img

EasyExcel读取Excel的解析原理:

img

2、导入相应的依赖文件

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version>
</dependency>

3、编写对应数据库字段的pojo类,使用注解注入

package com.ec.wlfxxt.db.po;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;import javax.persistence.Id;
import javax.persistence.Table;@Table(name = "t_test_user")
@Data
public class TestUser {//主键/*** ExcelProperty注解 index参数是指第几列,0为第一列,1为第二列 ,value是对应的内容列*/@ExcelProperty(index = 0)@Idprivate String userSid;@ExcelProperty(index = 1)private String userAccount;@ExcelProperty(index = 2)
//    @ExcelProperty(value = "用户姓名")private String userName;@ExcelProperty(index = 3)private Integer userSexSid;}

4、编写对应下载的接口文件

(这里为固定的模版,不需要可以的去记录,大概了解执行流程即可,取即可用)

UserController层

   @PostMapping("/uploadLocal") //本地测试  @RequestParam("files")参数key名字public JsonResult uploadLocal(@RequestParam("files") MultipartFile[] excelFiles) throws IOException {//        System.out.println("excelFile:"+excelFiles);if (excelFiles.length != 0) {if (userService.testExcelLocal( excelFiles) == 0){return new JsonResult(Constant.SUCCESS_CODE, "上传成功",null);}else {return new JsonResult(Constant.ERROR1_CODE, "文件保存失败",null);}}else {return new JsonResult(Constant.ERROR1_CODE, "文件不能为空",null);}}@PostMapping("/uploadServer")//服务器测试  @RequestParam("files")参数key名字public JsonResult uploadServer(@RequestParam("files") MultipartFile[] excelFiles) throws IOException {//        System.out.println("excelFile:"+excelFiles);if (excelFiles.length != 0) {if (userService.testExcelServer( excelFiles) == 0){return new JsonResult(Constant.SUCCESS_CODE, "上传成功",null);}else {return new JsonResult(Constant.ERROR1_CODE, "文件保存失败",null);}}else {return new JsonResult(Constant.ERROR1_CODE, "文件不能为空",null);}}

UserServiceImpl层

//将文件存储到后读取public int testExcelLocal(MultipartFile[] excelFiles){//将文件存储到当前机器的某个目录String localPath = "E:\\JavaProject\\wlfxxt\\src\\main\\java\\com\\ec\\wlfxxt\\excelfile";for (MultipartFile excelFile:excelFiles) {//获取上传的文件的文件名 (ordersetting_template.xlsx)String originalFilename = excelFile.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//生成一个唯一文件名String uniqueFilename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;String dirPath = localPath ;//确保存放文件的目录是存在的File dirFile = new File(dirPath);if (!dirFile.exists()){dirFile.mkdirs();}//最终存放文件的文件路径String filePath = dirPath + "\\" + uniqueFilename;System.out.println(filePath);//保存文件try {excelFile.transferTo(new File(filePath));} catch (IOException e) {e.printStackTrace();return 1;}//读取上传后的文件中的内容,将数据添加/更新到ordersetting表中/*参数一File file: 要读取的目标文件参数二Class head :将目标文件中的行记录封装到java的那个类型对象参数三ReadListener readListener :读取过程中的回调对象(每读取一行,封装成一个对象后,都会触发这个对象的invoke方法)*/List<TestUser> testUsers = new ArrayList<>();EasyExcel.read(new File(filePath),TestUser.class,new SyncReadListener(){//读取每一行进行的操作@Overridepublic void invoke(Object object, AnalysisContext context) {testUsers.add((TestUser) object);}//读取表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头信息:"+headMap);}}).headRowNumber(3).doReadAll();//.headRowNumber(3)表示从第几行开始读取,有的文件title不在第一行System.out.println("===========");System.out.println(testUsers);
//        //更新或者添加
//        for (TestUser orderSetting : orderSettings) {
//            userMapper.insert(orderSetting);
//        }}return 0;}//将文件存储到后读取public int testExcelServer(MultipartFile[] excelFiles){//将文件存储到服务器的某个目录String localPath = "/usr/local/middleware/GIT_NTP_WLFXXT_Code_Mid/excleFile";for (MultipartFile excelFile:excelFiles) {//获取上传的文件的文件名 (ordersetting_template.xlsx)String originalFilename = excelFile.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//生成一个唯一文件名String uniqueFilename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;String dirPath = localPath;//确保存放文件的目录是存在的File dirFile = new File(dirPath);if (!dirFile.exists()){dirFile.mkdirs();}//最终存放文件的文件路径String filePath = dirPath + "/" + uniqueFilename;System.out.println(filePath);//保存文件try {excelFile.transferTo(new File(filePath));} catch (IOException e) {e.printStackTrace();return 1;}//读取上传后的文件中的内容,将数据添加/更新到ordersetting表中/*参数一File file: 要读取的目标文件参数二Class head :将目标文件中的行记录封装到java的那个类型对象参数三ReadListener readListener :读取过程中的回调对象(每读取一行,封装成一个对象后,都会触发这个对象的invoke方法)*/List<TestUser> testUsers = new ArrayList<>();EasyExcel.read(new File(filePath),TestUser.class,new SyncReadListener(){//读取每一行进行的操作@Overridepublic void invoke(Object object, AnalysisContext context) {testUsers.add((TestUser) object);}//读取表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头信息:"+headMap);}}).headRowNumber(3).doReadAll();//.headRowNumber(3)表示从第几行开始读取,有的文件title不在第一行System.out.println("===========");System.out.println(testUsers);
//        //更新或者添加
//        for (TestUser orderSetting : orderSettings) {
//            userMapper.insert(orderSetting);
//        }}return 0;}

5、postman测试接口

单个和多个文件都可

key 的名字要和controller代码RequestParam里面的一致

public JsonResult uploadLocal(@RequestParam(“files”) MultipartFile[] excelFiles) throws IOException {

}

    }return 0;
}
## 5、postman测试接口**单个和多个文件都可**  key 的名字要和controller代码RequestParam里面的一致public JsonResult uploadLocal(**@RequestParam("files")** MultipartFile[] excelFiles) throws IOException {![image-20230315202239481](https://img-blog.csdnimg.cn/img_convert/bc111231dc8f7208ddaf965117b58167.png)

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

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

相关文章

EasyV数据可视化|精选2022多行业可视化作品合集,看这篇就够了

​​时光荏苒 2022进度条■■■■■■■■□□ 80% 又是一年金秋时节&#xff0c;又是一年硕果累累&#xff0c;在这丰收的时节里&#xff0c;工作也陆续到了冲刺的阶段&#xff0c;准备开干的你&#xff0c;是否有这些疑惑 想要的效果构思不出来&#xff0c;需要点小灵感&am…

英文Essay各部分的写作攻略

以下是英文Essay各部分的写作攻略&#xff1a; 引言部分&#xff1a;在引言中&#xff0c;应该清晰明了地陈述你的主题和目的&#xff0c;以及你将要探讨的问题和论点。你可以使用一个有趣的事实、例子、名言、问题或者比喻来引起读者的兴趣。同时&#xff0c;你也可以在引言中…

从头到尾写SQL(二)

二 数据表的创建和管理 数据库是我们用的别人的。。数据表就该我们自己创建了吧。。 1.数据基本类型 建表的时候&#xff0c;需要我们确定好这个表有多少字段&#xff0c;这些字段又都是什么类型的(其实创建完以后这些东西也能改)。那么数据库接纳的数据类型有哪些呢&#…

暑假用chatgpt肝了一篇顶会...

小时候特别羡慕大雄&#xff0c;因为他有可以帮他写作业的机器猫小叮当。 熬夜读论文&#xff0c;却无法得出一个好的idea&#xff0c;深夜薅头发苦恼的时候&#xff0c;就会想如果有一个机器人&#xff0c;给出一串指令就能马上生成一篇质量上佳的论文就好了。 现在&#xff0…

Unity Open Day 北京站-技术专场:生成式AI技术助力Unity创作

【获取 2023 Unity Open Day 北京站演讲 PPT】 伴随Unity中国版引擎的布局以及AI技术的爆发式发展&#xff0c;ChatGPT、StableDiffusion等生成式AI技术受到广大Unity创作者的关注。Unity已经在AI领域探索多年&#xff0c;一直致力于利用人工智能技术以及工具&#xff0c;帮助创…

3D引擎龙头Unity:元宇宙和AI活跃玩家

Unity是用于创建和操作交互式实时3D内容的世界领先平台。凭借灵活的编辑器、友好的开发环境、丰富的工具套件&#xff0c;Unity吸引了大量开发者&#xff0c;全球排名前1000的移动游戏70%以上使用了Unity的创作和运营解决方案&#xff0c;如今&#xff0c;Unity引擎在工业场景、…

城市的 “数字生命” 是怎么被赋予的?|场景创新公司是这样开会的

ChatGPT 为我们带来了巨大便利的同时&#xff0c;也让更多人茫然、焦虑甚至恐惧。对于这一重塑我们生活的技术&#xff0c;每个渺小的个体或许都在心里有过类似的疑问&#xff1a;我&#xff0c;还能做什么&#xff1f; 当体力劳动、内容生产都能够以技术的方式进行翻天覆地的变…

关于ChatGPT应用于软件测试中的思考

前言 关于最近大火的ChatGPT相信各位也听过不同渠道听说过他的厉害&#xff0c;目前发展趋势比较火热&#xff0c;科技公司都有在考虑怎么使用ChatGPT进行提高研发效率以及办公效率&#xff0c;最近我所在的公司也有在要求大家使用ChatGPT进行改善工作效率&#xff0c;所以引发…

借助 AI 我为 Raycast 制作了一个可以 OCR 中文的插件

本文速通&#xff1a;最近用了 Raycast&#xff0c;真的很棒&#xff01;但是没有好用的中文 OCR 插件&#xff0c;不怎么会写 Typescript 的我&#xff0c;在 ChatGPT 的指导下&#xff0c;整了一个小插件。开发过程非常不严肃&#xff0c;充满了野路子&#xff0c;不敢妄称指…

ChatGPT令人触目惊心的地方

前两天&#xff0c;马斯克联合数千名AI科技人员&#xff0c;要求暂停巨型AI实验的新闻&#xff0c;想必大家都知道了。 这个消息挺爆炸&#xff0c;一度加剧了人们的恐慌情绪。 鸣哥当时灵光一闪&#xff0c;这件事ChatGPT是如何看待的&#xff1f; 于是我输入这一新闻事件&a…

卷积神经网络与循环神经网络实战 --- 手写数字识别及诗词创作

卷积神经网络与循环神经网络实战 — 手写数字识别及诗词创作 文章目录 卷积神经网络与循环神经网络实战 --- 手写数字识别及诗词创作一、神经网络相关知识1. 深度学习2. 人工神经网络回顾3. 卷积神经网络&#xff08;CNN&#xff09;3.1 卷积层3.2 汇集&#xff08;池化&#x…

chatgpt赋能python:如何在Python中中断程序并退出程序

如何在Python中中断程序并退出程序 在Python编程的过程中&#xff0c;有时候我们需要中断程序的执行&#xff0c;并让程序退出。这在调试程序时尤为重要。本文将介绍Python中如何中断程序并退出程序。 使用sys.exit()函数 在Python中&#xff0c;我们可以使用sys.exit()函数…

常见快捷令与指令

快捷指令 ctrlc:复制 ctrlv:粘贴 ctrla:全选 ctrlx:剪切 ctrlz:撤销 ctrls:保存 altF4:关闭窗口 打开cmd的方式 开始Windows系统找到命令提示符 win键R 输入cmd打开控制台&#xff08;推荐使用&#xff09; 管理员身份运行&#xff1a;右键选择以管理员方式运行即可 …

linux基本功系列之chattr命令

文章目录 一. chattr命令介绍二. 语法格式及常用选项三. 参考案例3.1 给指定文件添加隐藏属性&#xff0c;阻止文件被修改&#xff1a;3.2 撤销i属性3.3 允许补充&#xff08;追加&#xff09;内容&#xff0c;无法覆盖/删除内容 总结 前言&#x1f680;&#x1f680;&#x1f…

外箱标签是怎么制作的

外箱标签设计都较为复杂&#xff0c;无论条码类型还是数据都比较多&#xff0c;且在出库时每个标签上的条码、数字一般都是流水变化的。外箱标签一般包含了供应商、收货人、产品编码、生产日期、发货日期等信息。下面我们就看看这样的外箱标签是如何制作的。 启动条码标签软件&…

5分钟包你搞懂箱形图分析!

最近有很多用户说到了年终需要回顾这一年的工作&#xff0c;根据这一年的数据看看有没有异常的情况&#xff0c;那么哪种图能够清晰直观地展现出这一信息呢&#xff1f; 答案只有一个&#xff0c;那就是... 箱形图 箱形图&#xff08;英文&#xff1a;Box plot&#xff09;&…

Python绘制箱型图-boxplot()

boxplot(&#xff09;语法格式如下&#xff1a; boxplot(x,notchnone,symnone,vertnone,whisnone,positionsnone,widthsnone,patch_artistnone,meanlinenone,showcapsnone,showboxnone,showfliersnone,boxpropsnone,) x:表示箱型图的数据。 sym:表示异常值对应的符号&#x…

【java基础】包装类,自动装箱和自动拆箱

文章目录 基本介绍包装类自动装箱自动拆箱包装类注意事项包装类比较包装器内容不可变 基本介绍 有时&#xff0c;需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。 例如&#xff0c;Integer类对应基本类型int。通常&#xff0c;这些类称为包装器&…

纸箱外观设计 包装盒版面设计 纸箱尺寸设计 纸箱纸盒包装设计 纸箱设计图

瓦楞纸板是由面纸、里纸、芯纸和加工成波形瓦楞的瓦楞纸通过粘合而成。根据商品包装的需求&#xff0c;瓦楞纸板可以加工成单面瓦楞纸板、三层瓦楞纸板、五层、七层、十一层等瓦楞纸板。 不同波纹形状的瓦楞&#xff0c;粘结成的瓦楞纸板的功能也有所不同。即使使用同样质量的面…

今年下半年程序员生存指南!

​ 见字如面&#xff0c;我是军哥&#xff01; 今天早上一醒来发现今天都 7 月 3 日&#xff0c;2023 的上半年已经悄然无声的离开我们了&#xff0c;你今年上半年目标达成如何&#xff1f; 最近看到新闻报道 5 月份&#xff0c;我国青年失业率 20.8%&#xff0c;比 4 月还高了…