SpringBoot实现文件上传(Excel表)
需求:
SpringBoot搭建项目实现文件的上传,对文件字段进行校验,将校验后的数据用对象封装,调用dao接口进行批量update操作,结果保存到MySQL数据库。对有格式有错误的数据进行统计并反馈到前端页面。
关于实现批量update操作,见(https://blog.csdn.net/m0_52850461/article/details/121504680?spm=1001.2014.3001.5501)
思路:
后端使用MultipartFile 接收文件,
使用EasyExcel组件完成Excel文件的处理,
在service目录创建一个监听器来监控字段,并进行校验。
实现:
准备表格:
pom文件:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version></dependency>
实体类:
@Data
@AllArgsConstructor
public class CustomNetworkBaseSupplyInfo {@ExcelProperty("DNN")private String dnnName;@ExcelProperty("用户名称")private String cusName;@ExcelProperty("基站IP(多个以英文逗号相隔)")private String basestationIp;
}
Controller层:
/*** 批量导入信息** @param file* @throws IOException*/@PostMapping("ImportInfo")@ApiOperation(value = "批量导入信息", httpMethod = "POST")public ReturnJson importCustomNetworkInfo(@ApiParam(name = "file", value = "要导入的文件") MultipartFile file,) throws IOException {ExcelImportResult result = customNetworkSupplyInfoService.importCustomNetworkInfo(file);return new ReturnJson(result);}
service层:
/*** 通过Excel批量导入信息** @param file* @return* @throws IOException*/@Overridepublic ExcelImportResult importCustomNetworkInfo(MultipartFile file) throws IOException {//保存导出来的信息List<CustomNetworkBaseSupplyInfo> lists = new ArrayList<>();//记录错误的信息StringBuffer errorMessage = new StringBuffer();//记录操作的结果,初始化为falseString result = "false";//创建监听器CustomNetworkSupplyListener listener = new CustomNetworkSupplyListener(lists, errorMessage);EasyExcel.read(file.getInputStream(), CustomNetworkBaseSupplyInfo.class, listener).sheet().doRead();//判断Excel信息是否有错误if (!StringUtils.isEmpty(errorMessage.toString())) {result = "success";//调用接口存到数据库supplyInfoMapper.importCustomNetworkInfo(lists, updateName);}return new ExcelImportResult(result, errorMessage.toString());}
监听器:
/*** 信息监听器** @author libo* @data 2021/11/19 - 15:37*/
public class CustomNetworkSupplyListener extends AnalysisEventListener<CustomNetworkBaseSupplyInfo> {//保存导出来的信息private List<CustomNetworkBaseSupplyInfo> lists;//记录错误的信息private StringBuffer errorMessage;public CustomNetworkSupplyListener(List<CustomNetworkBaseSupplyInfo> lists, StringBuffer errorMessage) {this.lists = lists;this.errorMessage = errorMessage;}@Overridepublic void invoke(CustomNetworkBaseSupplyInfo customNetworkBaseSupplyInfo, AnalysisContext analysisContext) {//格式检查StringBuffer errorInfo = validInfo(customNetworkBaseSupplyInfo);//获取当前Excel行号ReadRowHolder readRowHolder = analysisContext.readRowHolder();Integer index = readRowHolder.getRowIndex() + 1;//判断当前行号的数据是否有数据错误if (StringUtils.isNotEmpty(errorInfo)) {errorMessage.append("第" + index + "行填写有误:" + errorInfo + "\n");} else {lists.add(customNetworkBaseSupplyInfo);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}public StringBuffer validInfo(CustomNetworkBaseSupplyInfo supplyInfo) {//记录单个errorStringBuffer errorInfo = new StringBuffer();//dnn非空String dnnName = supplyInfo.getDnnName();if (StringUtils.isEmpty(dnnName)) {errorInfo.append("DNN的值不能为空;");}//cusName非空String cusName = supplyInfo.getCusName();if (StringUtils.isEmpty(cusName)) {errorInfo.append("用户名称的值不能为空;");}//多个以英文逗号相隔,格式为:设备名称/设备IPString equipmentB = supplyInfo.getEquipmentB();if (!checkIp(equipmentB)) {errorInfo.append("B设备格式有误");}/*** ip的格式判断,格式为:设备名称1/设备IP1,设备名称2/设备IP2,...** @param baseIp* @return*/public boolean checkIp(String baseIp) {if (!StringUtils.isEmpty(baseIp)) {String[] baseIps = baseIp.split(",");//大于1if (baseIps.length >= 1) {for (String ip : baseIps) {String[] lists = ip.split("/");if (lists.length >= 2 && !"NULL".equals(lists[1])) { //ip为有效值if (Validator.isIpv4(lists[1]) || Validator.isIpv6(lists[1])) {continue;} else { //不符合Ipv4或者Ipv6即为错误,其他为正确值return false;}}}}}return true;}
}
Mapper层:
Integer importCustomNetworkInfo(@Param("supplyInfos")List<CustomNetworkBaseSupplyInfo> customNetworkBaseSupplyInfo);
Mapper.xml文件:
<update id="importCustomNetworkInfo">update cus_network_info set<foreach collection="supplyInfos" item="supplyInfo" open="cus_name = case dnn_name" close="end,">when #{supplyInfo.dnnName} then #{supplyInfo.cusName}</foreach><foreach collection="supplyInfos" item="supplyInfo" open="basestation_ip = case dnn_name" close="end">when #{supplyInfo.dnnName} then #{supplyInfo.basestationIp}</foreach>where dnn_name in<foreach collection="supplyInfos" item="supplyInfo" open="(" close=")" separator=",">#{supplyInfo.dnnName}</foreach></update>
SpringBoot实现文件上传(Excel表)相关推荐
- SpringBoot图文教程4—SpringBoot 实现文件上传下载(亲测)
SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」 SpringBoot图文教程2-日志的使用「logback」「log4j」 Spring ...
- 微信小程序+SpringBoot实现文件上传与下载
微信小程序+SpringBoot实现文件上传与下载 1.文件上传 1.1 后端部分 1.1.1 引入Apache Commons FIleUpload组件依赖 1.1.2 设置上传文件大小限制 1.1 ...
- SpringMVC的请求-文件上传-客户端表单实现
文件上传客户端表单需要满足: 表单项type="file" 表单的提交方式是post 表单的enctype属性是多部分表单形式,及enctype="multipart/f ...
- vueform表单文件上传_峰哥说技术系列-8.Spring Boot文件上传(Form表单和Ajax方式)
今日份主题 Spring Boot文件上传(Form表单和Ajax方式) 在Spring Boot中,和文件上传的主要和MultipartResolver接口有关,他有两个实现类 StandardSe ...
- springboot改文件头_SpringBoot图文教程4—SpringBoot 实现文件上传下载
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- 【SpringBoot学习】5、SpringBoot 实现文件上传,图片上传并显示功能
SpringBoot 实现文件上传,图片上传并显示功能 我先看一下<颈椎病康复指南>再给大家说怎么实现的这两个功能,毕竟只是一个新手,解决这种复杂点的问题(相对而言),还是需要花费大量时间 ...
- SpringBoot实现文件上传接口
作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- | ...
- Django(文件上传+分页+表单)
一.文件上传 form表单中需要添加 enctype="multipart/form-data" 1.media: 文件上传的文件 在settings.py 文件中配置:MEDIA ...
- springboot+web文件上传和下载
一.首先安装mysql数据库,开启web服务器. 二.pom.xml文件依赖包配置如下: <?xml version="1.0" encoding="UTF-8&q ...
- SpringBoot(SpringMVC)文件上传下载
话说,springboot不是一个全新的框架,它只是将其它框架整合在一起,提供一个"开箱即用"的环境.此文,利用的正是SpringMVC的功能. 创建springboot项目:ht ...
最新文章
- pod setup慢的解决方法
- 1102: 火车票退票费计算(函数专题)
- C语言中被常用到的宏
- 英语和数学不好可以学python-Day2 怎么学 Python?
- ocr python opencv_如何使用(opencv/python)来实现OCR处
- css3轮播不用jpuery_15款效果很酷的最新jQuery/CSS3特效
- 浙大计算机学院朱建科,浙江大学计算机科学与技术学院导师介绍:朱建科
- odbc远程连接mysql_无法使用unixodbc,libmyodbc连接到远程mysql服务器
- 并发场景下的幂等问题——分布式锁详解
- c语言字符串怎么转为正数,把字符串转换为与之等价的整型值
- 转hdmi_即插即用轻松双屏,毕亚兹 VGA转HDMI转换器评测
- 【论文解读】AAAI 2020 持续学习语义理解框架ERNIE 2.0
- 20200308——多项式回归预测工资
- 未来教育python软件_未来教育考试系统
- 计算机团队霸气名称大全,霸气吃鸡游戏团队名字大全
- 江西省赣州市谷歌高清卫星地图下载
- 深入理解Amazon Alexa Skill(四)
- 太强!拿下腾讯公司技术突破奖,腾讯云 RTC 实时音视频技术到底了有多牛?...
- 大屏antdesign走马灯轮播加图形渲染
- java 且 或 符号_Java 、、|、||、^、、、~、等运算符