EasyExcel实现excel导入(模版上传)
目录
- 效果
- pom.xml
- application.yml
- controller
- service
- 依赖类
- 前台
- vue代码
某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前台,本文就实现这两个功能
效果

- 模版 storeTemplate.xlsx


- 点击确定,会直接下载excel错误文件,打开如下图

- 删除第一行 第一列后,修正后,可再次导入,方便调整错误数据
pom.xml
<!-- easypoi-spring-boot-starter --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.1.3</version></dependency>
application.yml
#####模板下载位置
downloadTemplate:storePath: storeTemplate.xlsx
- 提供部分代码,主要是了解思路,可参考实现
controller
package com.zyee.iopace.web.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageInfo;
import com.zyee.iopace.web.config.annotation.Log;
import com.zyee.iopace.web.config.exception.BusinessException;
import com.zyee.iopace.web.dto.station.DeleteBatchPhotoDto;
import com.zyee.iopace.web.dto.station.StationStoreAddDto;
import com.zyee.iopace.web.dto.station.StationStoreDto;
import com.zyee.iopace.web.dto.store.DeleteStoreBatchPhotoDto;
import com.zyee.iopace.web.dto.store.StationStoreUpdateDto;
import com.zyee.iopace.web.dto.store.StoreBindStationDto;
import com.zyee.iopace.web.dto.store.StoreChangeTrackDto;
import com.zyee.iopace.web.entity.*;
import com.zyee.iopace.web.enums.BusinessType;
import com.zyee.iopace.web.enums.EcologyType;
import com.zyee.iopace.web.enums.StationStateEnum;
import com.zyee.iopace.web.enums.StoreStatusType;
import com.zyee.iopace.web.response.ResponseResult;
import com.zyee.iopace.web.service.*;
import com.zyee.iopace.web.utils.BeanCopyUtils;
import com.zyee.iopace.web.utils.PageUtils;
import com.zyee.iopace.web.vo.station.StationStoreDetailVo;
import com.zyee.iopace.web.vo.station.StationStoreVo;
import com.zyee.iopace.web.vo.store.StoreChangeTrackListVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;@Slf4j
@Api(tags = "库存管理")
@RestController
@RequestMapping("/stationStore")
public class StationStoreController {@Autowiredprivate StoreReviseRecordService storeReviseRecordService;@ApiOperation(value = "导入库存信息")@Log(title = "导入库存信息", businessType = BusinessType.IMPORT)@PostMapping("/importStore")public ResponseResult importStore(@RequestParam MultipartFile file, HttpServletResponse response) throws Exception {return ResponseResult.SUCCESS(stationStoreService.importStore(file,response));}
}
service
package com.zyee.iopace.web.service;import com.zyee.iopace.web.dto.dept.DeptSearchDto;
import com.zyee.iopace.web.dto.station.StationStoreAddDto;
import com.zyee.iopace.web.dto.station.StationStoreDto;
import com.zyee.iopace.web.dto.store.StationStoreUpdateDto;
import com.zyee.iopace.web.dto.store.StoreBindStationDto;
import com.zyee.iopace.web.dto.store.StoreChangeTrackDto;
import com.zyee.iopace.web.entity.StationStore;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zyee.iopace.web.entity.StoreChangeTrack;
import com.zyee.iopace.web.vo.element.ElementImportResponseVo;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.util.List;public interface StationStoreService extends IService<StationStore> {/*** 导入库存信息* @param file* @param response* @return 失败返回错误地址*/ElementImportResponseVo importStore(MultipartFile file, HttpServletResponse response) throws Exception;
}@Service
public class StationStoreServiceImpl extends ServiceImpl<StationStoreMapper, StationStore> implements StationStoreService {@Overridepublic ElementImportResponseVo importStore(MultipartFile file, HttpServletResponse response) throws Exception {List<StoreImportVo> stationImportVos = PoiUtils.importExcel(file, StoreImportVo.class, null);//成功List<StationStore> stationStoreList = new ArrayList<>();//失败信息的集合List<StoreImportVo> errorList = new ArrayList<>();//导入成功的数量int success = 0;//失败条数int failure = 0;//当前登录用户idString userId = userUtils.getUserId();//型号List<StoreCompanyModel> companyModelList = storeCompanyModelService.list();//序列号集合List<StationStore> stationStores = list(new LambdaQueryWrapper<StationStore>().select(StationStore::getSerialNumber));List<String> serialNumberList = new ArrayList<>();if(CollectionUtil.isNotEmpty(stationStores)){serialNumberList = stationStores.stream().map(StationStore::getSerialNumber).distinct().collect(Collectors.toList());}//站点集合List<Station> stationList = stationService.list(new LambdaQueryWrapper<Station>().orderByAsc(Station::getStationCode));if(CollectionUtil.isEmpty(stationList)){stationList = new ArrayList<>();}for (StoreImportVo storeImport : stationImportVos) {StringBuilder errMsg = new StringBuilder();StationStore stationStore = checkStore(storeImport, errMsg, userId, companyModelList, serialNumberList, stationList);if (errMsg.toString().length() > 0) {failure++;storeImport.setErrorCause(errMsg.toString());errorList.add(storeImport);}else{success++;stationStoreList.add(stationStore);}}if(CollectionUtil.isNotEmpty(stationStoreList)){//批量新增saveBatch(stationStoreList);//增加送检判断stationStoreList.stream().forEach(store->{if(Objects.nonNull(store.getRectifyTime())){//库存送检记录StationStoreAddDto dto = new StationStoreAddDto();dto.setRectifyTime(store.getRectifyTime());saveRevise(dto, store);}if(Objects.nonNull(store.getStationId())){//绑定站点stationChangeTrack(null, store);}});}//将错误数据上传String visitUrl = "";String msg = "批量站点信息完成,成功导入" + success + "条数据,失败" + failure + "条";if (failure > 0) {try {String name = UUID.randomUUID()+".xlsx";Workbook workbook = null;StoreExcelStyler.setProperties(stationService,storeCompanyService,storeCompanyModelService);workbook = PoiUtils.exportErrorExcel(errorList, name, name,StoreImportVo.class, name, StoreExcelStyler.class, response);StoreExcelStyler.setData(workbook);FileOutputStream outputStream = new FileOutputStream(pathService.getAbsoTemplateExcelPath(name));//写入workbook.write(outputStream);visitUrl = pathService.getTemplateExcelPath(name);} catch (Exception e) {e.printStackTrace();}}ElementImportResponseVo vo = new ElementImportResponseVo();vo.setMsg(msg);vo.setVisitUrl(visitUrl);return vo;}/*** 验证格式有问题* @param storeImport* @param errMsg* @param userId* @return*/private StationStore checkStore(StoreImportVo storeImport, StringBuilder errMsg, String userId,List<StoreCompanyModel> companyModelList,List<String> serialNumberList,List<Station> stationList) {StationStore store = new StationStore();if(StringUtils.isBlank(storeImport.getCompanyName(相关文章:
EasyExcel实现excel导入(模版上传)
目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…...
Vue 3最新组件解析与实践指南:提升开发效率的利器
目录 引言 一、Vue 3核心组件特性解析 1. Composition API与组件逻辑复用 2. 内置组件与生命周期优化 3. 新一代UI组件库推荐 二、高级组件开发技巧 1. 插件化架构设计 2. 跨层级组件通信 三、性能优化实战 1. 惰性计算与缓存策略 2. 虚拟滚动与列表优化 3. Tree S…...
【前端】如何安装配置WebStorm软件?
文章目录 前言一、前端开发工具WebStorm和VS Code对比二、官网下载三、安装1、开始安装2、选择安装路径3、安装选项4、选择开始菜单文件夹5、安装成功 四、启动WebStorm五、登录授权六、开始使用 前言 WebStorm 是一款由 JetBrains 公司开发的专业集成开发环境(IDE…...
vllm专题(一):安装-GPU
vLLM 是一个 Python 库,支持以下 GPU 变体。选择您的 GPU 类型以查看供应商特定的说明: 1. NVIDIA CUDA vLLM 包含预编译的 C++ 和 CUDA(12.1)二进制文件。 2. AMD ROCm vLLM 支持配备 ROCm 6.3 的 AMD GPU。 注意 此设备没有预构建的 wheel 包,因此您必须使用预构建的 Do…...
php文件包含
文章目录 基础概念php伪协议什么是协议协议的格式php中的协议file协议http协议ftp协议php://input协议php://filter协议php://data协议 php文件上传机制高级文件包含nginx文件日志包含临时文件包含session文件包含pear文件包含远程文件包含 基础概念 文件包含,相当…...
升级 SpringBoot3 全项目讲解 — Spring Boot 3 中如何发Http请求?
随着 Spring Boot 3 的发布,许多开发者开始考虑将他们的项目升级到这个新版本。Spring Boot 3 带来了许多新特性和改进,尤其是在 HTTP 请求处理方面。本文将详细介绍如何在 Spring Boot 3 中发送 HTTP 请求,并通过代码示例帮助你快速上手。 …...
分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现
分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现 目录 分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现MFO-LSSVM飞蛾扑火算法优化最小二…...
MyBatis Plus核心功能
一、条件构造器 1.为什么要学? 用于方便地构建SQL查询条件 2.如何使用? 3.实战案例 例:查询出名字中带o的,存款大于等于1000元的人的id,username,info,balance字段 数据库如图: 示例: Test void testL…...
nginx ngx_http_module(10) 指令详解
nginx ngx_http_module(10) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_v2_module:HTTP/2支持模块,允许Nginx通过HTTP/2协议与客户端进行通信。HTTP/2带来了许多性能优化,如多路复用、头部压缩和服务器推…...
【ENSP】链路聚合的两种模式
【ENSP】链路聚合的两种模式 1、背景介绍2、链路聚合的使用场景3、配置过程1、手工模式Eth-Trunk配置2、静态LACP模式Eth-Trunk 4、总结 1、背景介绍 随着网络规模的不断扩大,人们对骨干链路的带宽吞吐量和可靠性提出了越来越高的要求。在传统方案中,为…...
Windows环境安装部署minimind步骤
Windows环境安装部署minimind步骤 必要的软件环境 git git,可下载安装版,本机中下载绿色版,解压到本地目录下(如:c:\soft\git.win64),可将此路径添加到PATH环境变量中,供其他程序…...
让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
prompt 使用 crnn 提取图像特征,给出图像好坏的二分类结果,写清楚代码备注,注释清楚向量维度大小,并给出一个可运行的 demo1、GPT-4o 以下是一个使用 CRNN(Convolutional Recurrent Neural Network)提取图…...
代码随想录-- 第一天图论 --- 岛屿的数量
99 统计岛屿的数量 c 99. 岛屿数量 #include <iostream> #include <vector> #include <queue>using namespace std;struct MGraph {int numVertices, numEdges;vector<vector<int>> Edge; };int dir[4][2] {{1, 0}, {0, 1}, {-1, 0}, {0, -1}…...
Mybatis MyBatis框架的缓存 一级缓存
1. 缓存的概念 缓存的概念 在内存中临时存储数据,速度快,可以减少数据库的访问次数。经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…...
Weboffice在线Word权限控制:限制编辑,只读、修订、禁止复制等
在现代企业办公中,文档编辑是一项常见且重要的任务。尤其是在线办公环境中,员工需要在网页中打开和编辑文档,但如何确保这些文档只能进行预览而无法被编辑或复制,成为许多企业面临的一个痛点。尤其是在处理涉密文档时,…...
RT-Thread+STM32L475VET6实现呼吸灯
文章目录 前言一、板载资源资源说明二、具体步骤1.新建rt_thread项目2. 打开PWM设备驱动3. 在Stm32CubeMX配置定时器3.1打开Stm32CubeMX3.2 使用外部高速时钟,并修改时钟树3.3打开定时器1,并配置通道一为PWM输出模式(定时器根据自己需求调整)3.4 打开串口…...
【Web前端开发精品课 HTML CSS JavaScript基础教程】第二十四章课后题答案
文章目录 问题1:问题2:问题3: 问题1: 在HTML中嵌入JavaScript,应该使用的标签是( )。 选项: A. <style></style> B. <script></script> C. <js><…...
记录 pycharm 无法识别提示导入已有的模块解决方案 No module named ‘xxx‘
在windows下,使用pycharm开发项目,每个项目都有自己独立的虚拟环境,有时候就会出现,在该项目中明明已经安装了某个模块,但是在写代码的时候就是导入不了,无法识别导入,在运行的时候却又是正常的…...
网工项目实践2.6 广域网需求分析及方案制定
本专栏持续更新,整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 全网拓扑展示 一.广域网互联方式 1.专线 优点 稳定 独享。绝对安全。可靠性高,带宽高,完全取决于终端接口。 缺点: 费用高。建设时间长。难…...
【架构】分层架构 (Layered Architecture)
一、分层模型基础理论 模型是一种常见的软件设计架构,它将软件系统按照功能划分为不同的层次,每个层次都有特定的职责和功能…...
用STM32和VOFA+搞定水下机器人深度控制:一个完整的PID仿真与调试流程
用STM32和VOFA实现水下机器人深度控制的完整工程指南 水下机器人作为海洋探索、资源开发的重要工具,其深度控制精度直接影响作业效果。传统调试方法依赖物理水池测试,成本高、周期长。本文将展示如何通过STM32单片机VOFA上位机构建低成本、高效率的深度控…...
Go语言消息聚合器Meeper:轻量级通知网关的设计与实战部署
1. 项目概述:一个轻量级、可扩展的“消息聚合器”最近在折腾个人工作流自动化的时候,我一直在找一个能把我所有消息通知“收拢”到一个地方的工具。无论是GitHub的Issue提醒、服务器的监控告警,还是某个API接口的调用结果,我都希望…...
7大核心技术解密:MS-DOS源代码如何奠定现代操作系统基础
7大核心技术解密:MS-DOS源代码如何奠定现代操作系统基础 【免费下载链接】MS-DOS The original sources of MS-DOS 1.25, 2.0, and 4.0 for reference purposes 项目地址: https://gitcode.com/GitHub_Trending/ms/MS-DOS MS-DOS作为个人计算机操作系统的开山…...
2026年AI效率红利:小白也能轻松掌握Skills,抢占先机并收藏这篇新手指南!
本文针对对AI Skills存在认知误区的新手,介绍了Skills的核心概念、入门准备、实操步骤及进阶技巧。Skills是将个人隐性能力结构化、资产化的私人技能包,零代码、高复用、可联动。文章详细讲解了如何选择工具、明确核心原则、准备基础信息,并以…...
给硬件工程师的PCIe实战避坑指南:从BAR配置到链路训练,这些细节你踩过几个?
给硬件工程师的PCIe实战避坑指南:从BAR配置到链路训练,这些细节你踩过几个? 调试PCIe接口就像在迷宫中寻找出口——每个转角都可能藏着意想不到的陷阱。上周当我调试一块新设计的Gen3 x8板卡时,系统识别出了设备却无法分配BAR空间…...
SAP MM | S4500 第六章——自助申请 (Self-Service Requisitioning)
1. 章节概述与核心目标 在 S4500 采购业务流程课程中,第六单元(Unit 6)标志着从“专家模式”向现代用户体验的转型。相对于前面章节(如单元 3 和单元 5)中侧重于 SAP GUI 环境下的专家操作,本章聚焦于自助申请 (Self-Service Requisitioning)。 本单元不仅是操作层面的…...
为什么92%的MCP 2026审计报告被监管驳回?——4大元数据缺失陷阱与ISO/IEC 27001:2022对齐方案
更多请点击: https://intelliparadigm.com 第一章:MCP 2026权限审计报告的监管驳回现状与根本动因 近期,多家金融机构提交的MCP 2026权限审计报告连续遭遇监管机构驳回,驳回率高达68.3%(据2024年Q2银保监科技合规通报…...
跨平台鼠标自动化神器MouseClick:终极鼠标连点器解决方案
跨平台鼠标自动化神器MouseClick:终极鼠标连点器解决方案 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软件界面美观 ÿ…...
智能任务流引擎TaskFlow:Java并发编程与MCP集成的开发实践
1. 项目概述:一个为现代开发者打造的智能任务流引擎最近在折腾一个挺有意思的玩意儿,叫taskflow。这名字听起来平平无奇,对吧?市面上任务管理工具一抓一大把,从 Trello 到 Todoist,从 Jira 到 Notion 的看板…...
鱼群计数检测数据集VOC+YOLO格式1806张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1806标注数量(xml文件个数):1806标注数量(txt文件个数):1806标注类别…...
