需求:
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表)相关推荐

  1. SpringBoot图文教程4—SpringBoot 实现文件上传下载(亲测)

    SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」 SpringBoot图文教程2-日志的使用「logback」「log4j」 Spring ...

  2. 微信小程序+SpringBoot实现文件上传与下载

    微信小程序+SpringBoot实现文件上传与下载 1.文件上传 1.1 后端部分 1.1.1 引入Apache Commons FIleUpload组件依赖 1.1.2 设置上传文件大小限制 1.1 ...

  3. SpringMVC的请求-文件上传-客户端表单实现

    文件上传客户端表单需要满足: 表单项type="file" 表单的提交方式是post 表单的enctype属性是多部分表单形式,及enctype="multipart/f ...

  4. vueform表单文件上传_峰哥说技术系列-8.Spring Boot文件上传(Form表单和Ajax方式)

    今日份主题 Spring Boot文件上传(Form表单和Ajax方式) 在Spring Boot中,和文件上传的主要和MultipartResolver接口有关,他有两个实现类 StandardSe ...

  5. springboot改文件头_SpringBoot图文教程4—SpringBoot 实现文件上传下载

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  6. 【SpringBoot学习】5、SpringBoot 实现文件上传,图片上传并显示功能

    SpringBoot 实现文件上传,图片上传并显示功能 我先看一下<颈椎病康复指南>再给大家说怎么实现的这两个功能,毕竟只是一个新手,解决这种复杂点的问题(相对而言),还是需要花费大量时间 ...

  7. SpringBoot实现文件上传接口

    作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- | ...

  8. Django(文件上传+分页+表单)

    一.文件上传 form表单中需要添加 enctype="multipart/form-data" 1.media: 文件上传的文件 在settings.py 文件中配置:MEDIA ...

  9. springboot+web文件上传和下载

    一.首先安装mysql数据库,开启web服务器. 二.pom.xml文件依赖包配置如下: <?xml version="1.0" encoding="UTF-8&q ...

  10. SpringBoot(SpringMVC)文件上传下载

    话说,springboot不是一个全新的框架,它只是将其它框架整合在一起,提供一个"开箱即用"的环境.此文,利用的正是SpringMVC的功能. 创建springboot项目:ht ...

最新文章

  1. pod setup慢的解决方法
  2. 1102: 火车票退票费计算(函数专题)
  3. C语言中被常用到的宏
  4. 英语和数学不好可以学python-Day2 怎么学 Python?
  5. ocr python opencv_如何使用(opencv/python)来实现OCR处
  6. css3轮播不用jpuery_15款效果很酷的最新jQuery/CSS3特效
  7. 浙大计算机学院朱建科,浙江大学计算机科学与技术学院导师介绍:朱建科
  8. odbc远程连接mysql_无法使用unixodbc,libmyodbc连接到远程mysql服务器
  9. 并发场景下的幂等问题——分布式锁详解
  10. c语言字符串怎么转为正数,把字符串转换为与之等价的整型值
  11. 转hdmi_即插即用轻松双屏,毕亚兹 VGA转HDMI转换器评测
  12. 【论文解读】AAAI 2020 持续学习语义理解框架ERNIE 2.0
  13. 20200308——多项式回归预测工资
  14. 未来教育python软件_未来教育考试系统
  15. 计算机团队霸气名称大全,霸气吃鸡游戏团队名字大全
  16. 江西省赣州市谷歌高清卫星地图下载
  17. 深入理解Amazon Alexa Skill(四)
  18. 太强!拿下腾讯公司技术突破奖,腾讯云 RTC 实时音视频技术到底了有多牛?...
  19. 大屏antdesign走马灯轮播加图形渲染
  20. java 且 或 符号_Java 、、|、||、^、、、~、等运算符

热门文章

  1. 什么是LTE(Long Time Evolution 长期演进技术)
  2. ros入门与控制无人机
  3. 730KII 打印机 Win7 2017年11月更新系统补丁后无法打印
  4. Huber robust error function
  5. 2019美亚个人赛复盘
  6. 【运维面试】k8s的日志你们是如何收集与管理的?
  7. Tip | 佳能(EOS 750D) USB无法连接电脑
  8. iwatch支付宝提示未连接
  9. android firewall apk,DroFireWall
  10. 三易通采购进货单保存单据