当前位置: 首页 > news >正文

EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端

产品需求:

前端上传个csv 或 excel 文件,文件共4列,验证文件大小,类型,文件名长度,文件内容,如果某行某个单元格数据验证不通过,就把错误信息放到这行第五列,然后把带有错误信息的文件,返回给前端。

    @ApiOperation(value = "上传新增")@PostMapping(path = "uploadFile")public ResultMsg<?> uploadExcelFile(@RequestParam("file") MultipartFile file) throws IOException {if (file.getOriginalFilename().length() > 256) {return ResultMsg.failed("文件名超长");}if (file.getSize() > 3 * 1024 * 1024) {return ResultMsg.failed("文件太大");}String fileType = Optional.ofNullable(file.getOriginalFilename()).map(name -> name.substring(name.lastIndexOf("."))).orElse(null);if (!".xls".equalsIgnoreCase(fileType) && !".xlsx".equalsIgnoreCase(fileType) && !".csv".equalsIgnoreCase(fileType)) {return ResultMsg.failed("仅支持 [xls xlsx csv] 格式");}StyleOfWritingExcelDTO dto = null;try {dto = this.validateAndReadExcel(file.getInputStream());} catch (IOException e) {throw new RuntimeException(e);}if (dto.getHasError()) {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();EasyExcel.write(byteArrayOutputStream, StyleOfWritingExcelModel.class)
//                        .excelType(ExcelTypeEnum.XLSX).sheet("sheet1").doWrite(dto.getStyleOfWritingExcelModelList());String base64Str = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());Map<Object, Object> base64Map = new HashMap<>();base64Map.put("errStr", "文件内容不合格");base64Map.put("fileData", base64Str);return ResultMsg.failed(4001, "文件内容不合格", base64Map);}if (dto.getStyleOfWritingExcelModelList().isEmpty()) return ResultMsg.failed("文件内容为空");saveData(dto.getStyleOfWritingExcelModelList());return ResultMsg.success();}private StyleOfWritingExcelDTO validateAndReadExcel(InputStream inputStream) {StyleOfWritingExcelDTO result = new StyleOfWritingExcelDTO();List<StyleOfWritingExcelModel> dataList = new ArrayList<>();EasyExcel.read(inputStream, StyleOfWritingExcelModel.class, new AnalysisEventListener<StyleOfWritingExcelModel>() {@Overridepublic void invoke(StyleOfWritingExcelModel styleOfWritingExcelModel, AnalysisContext analysisContext) {StringBuilder errorInfo = new StringBuilder();CategoryEntity firstCategory = null;if (StringUtils.isBlank(styleOfWritingExcelModel.getFirstCategoryName())) {errorInfo.append("品类不能为空;");} else if (styleOfWritingExcelModel.getFirstCategoryName().length() > 50) {errorInfo.append(String.format("品类名长度超限,限制最大[%d]字符;", 50));} else {firstCategory = this.getCategoryCode(styleOfWritingExcelModel.getFirstCategoryName());if (ObjectUtils.isEmpty(firstCategory))errorInfo.append(String.format("品类在库里未找到;"));elsestyleOfWritingExcelModel.setFirstCategory(firstCategory.getCode());}CategoryEntity secondCategory = null;if (StringUtils.isBlank(styleOfWritingExcelModel.getSecondCategoryName())) {errorInfo.append("二级品类不能为空; ");} else if (styleOfWritingExcelModel.getSecondCategoryName().length() > 50) {errorInfo.append(String.format("二级品类名长度超限,限制最大[%d]字符", 50));} else {secondCategory = this.getCategoryCode(styleOfWritingExcelModel.getSecondCategoryName());if (ObjectUtils.isEmpty(secondCategory))errorInfo.append(String.format("二级品类在库里未找到;"));elsestyleOfWritingExcelModel.setSecondCategory(secondCategory.getCode());}if (ObjectUtils.isNotEmpty(firstCategory) && ObjectUtils.isNotEmpty(secondCategory)) {if (!firstCategory.getCode().equals(secondCategory.getParentCode())) {errorInfo.append(String.format("二级品类 和 品类 不匹配"));}}if (StringUtils.isBlank(styleOfWritingExcelModel.getContent())) {errorInfo.append("内容不能为空; ");} else if (styleOfWritingExcelModel.getContent().length() > 3000) {errorInfo.append(String.format("内容长度超限,限制最大[%d]字符", 3000));}styleOfWritingExcelModel.setErrorInfo(errorInfo.toString());dataList.add(styleOfWritingExcelModel);if (!result.getHasError() && StringUtils.isNotBlank(errorInfo.toString())) {result.setHasError(true);}}private CategoryEntity getCategoryCode(String categoryName) {List<CategoryEntity> categoryList = categoryService.list(new QueryWrapper<CategoryEntity>().lambda().eq(CategoryEntity::getName, categoryName));return categoryList.stream().findFirst().orElse(null);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 解析完成后的操作}}).sheet().doRead();result.setStyleOfWritingExcelModelList(dataList);return result;}返回:{"code": 4001,"message": "文件内容不合格","data": {"fileData": "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","errStr": "文件内容不合格"},"timestamp": 63417752000000
}

相关文章:

EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端

产品需求&#xff1a; 前端上传个csv 或 excel 文件&#xff0c;文件共4列&#xff0c;验证文件大小&#xff0c;类型&#xff0c;文件名长度&#xff0c;文件内容&#xff0c;如果某行某个单元格数据验证不通过&#xff0c;就把错误信息放到这行第五列&#xff0c;然后把带有…...

单片机软件定时器V4.0

单片机软件定时器V4.0 用于单片机定时执行任务等&#xff0c;比如LED GPIO等定时控制&#xff0c;内置前后台工作模式 头文件有使用例子 #ifndef __SORFTIME_APP_H #define __SORFTIME_APP_H#ifdef __cplusplus extern "C" { #endif#include <stdint.h>// #…...

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…...

C++ 入门第26天:文件与流操作基础

往期回顾&#xff1a; C 入门第23天&#xff1a;Lambda 表达式与标准库算法入门-CSDN博客 C 入门第24天&#xff1a;C11 多线程基础-CSDN博客 C 入门第25天&#xff1a;线程池&#xff08;Thread Pool&#xff09;基础-CSDN博客 C 入门第26天&#xff1a;文件与流操作基础 前言…...

使用python将多个Excel表合并成一个表

import pandas as pd# 定义要合并的Excel文件路径和名称 file_paths [file1.xlsx, file2.xlsx, file3.xlsx, file4.xlsx, file5.xlsx]# 创建一个空的DataFrame来存储合并后的数据 merged_data pd.DataFrame()# 循环遍历每个Excel文件&#xff0c;并读取其中的数据 for file_p…...

halcon三维点云数据处理(七)find_shape_model_3d_recompute_score

目录 一、find_shape_model_3d_recompute_score例程代码二、set_object_model_3d_attrib_mod函数三、prepare_object_model_3d 函数四、create_cube_shape_model_3d函数五、获得CamPose六、project_cube_image函数七、find_shape_model_3d函数八、project_shape_model_3d函数 一…...

vue js实现时钟以及刻度效果

2025.01.08今天我学习如何用js实现时钟样式&#xff0c;效果如下&#xff1a; 一、html代码如下&#xff1a; <template><!--圆圈--><div class"notice_border"><div class"notice_position notice_name_class" v-for"item in …...

unity学习15:预制体prefab

目录 1 创建多个gameobject 2 创建prefab 2.1 创建prefab &#xff08;类&#xff09; 2.2 prefab 是一个文件 2.3 prefab可以导出 3 创建prefab variant &#xff08;子类&#xff09; 3.1 除了创建多个独立的prefab&#xff0c; 还可以创建 prefab variant 3.2 他…...

基于Thinkphp6+uniapp的陪玩陪聊软件开发方案分析

使用uni-app框架进行前端开发。uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;支持一次编写&#xff0c;多端发布&#xff0c;包括APP、小程序、H5等。 使用Thinkphp6框架进行后端开发。Thinkphp6是一个轻量级、高性能、面向对象的PHP开发框架&#xff0c;具有易…...

MySQL - 子查询和相关子查询详解

在SQL中&#xff0c;子查询&#xff08;Subquery&#xff09;和相关子查询&#xff08;Correlated Subquery&#xff09;是非常强大且灵活的工具&#xff0c;可以用于执行复杂的数据检索和操作。它们允许我们在一个查询中嵌套另一个查询&#xff0c;从而实现更复杂的逻辑和条件…...

Android 系统签名 keytool-importkeypair

要在 Android 项目中使用系统签名并将 APK 打包时与项目一起打包&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;准备系统签名文件 从 Android 系统源码中获取系统签名文件&#xff0c;通常位于 build/target/product/security 目录下&#xff0c;包括 pla…...

安卓漏洞学习(十八):Android加固基本原理

APP加固技术发展历程 APK加固整体思路 加固整体思路&#xff1a;先解压apk文件&#xff0c;取出dex文件&#xff0c;对dex文件进行加密&#xff0c;然后组合壳中的dex文件&#xff08;Android类加载机制&#xff09;&#xff0c;结合之前的apk资源&#xff08;解压apk除dex以外…...

Docker 使用Dockerfile创建镜像

创建并且生成镜像 在当前目录下创建一个名为Dockerfile文件 vi Dockerfile填入下面配置 # 使用 CentOS 作为基础镜像 FROM centos:7# 设置工作目录 WORKDIR /app# 复制项目文件到容器中 COPY bin/ /app/bin/ COPY config/ /app/config/ COPY lib/ /app/lib/ COPY plugin/ /a…...

【Python运维】利用Python实现高效的持续集成与部署(CI/CD)流程

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 持续集成与部署(CI/CD)是现代软件开发中不可或缺的实践,通过自动化测试、构建和部署流程,显著提高了开发效率与运维质量。本文详细介绍…...

成功!QT 5.15.2编译mysql驱动

首选要说明&#xff0c;5.15与6.7编译驱动是完全不同的。搞错了永远编译不出来。 参考 主要是参考安装QT&#xff0c;安装mysql等。 编译成功&#xff01;QT/6.7.2/Creator编译Windows64 MySQL驱动(MSVC版)_mingw编译qt6.7-CSDN博客 复制mysql的include和lib到一个方便的目…...

安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装

一、项目创建 创建NDK项目有两种方式&#xff0c;一种从新创建整个项目&#xff0c;一个在创建好的项目添加NDK接口。 1.创建NDK项目 创建 一个Native C项目&#xff1a; 选择包名、API版本与算法交互的语言&#xff1a; 选择C版本&#xff1a; 创建完之后&#xff0c;可…...

第二届 Sui 游戏峰会将于 3 月 18 日在旧金山举行

3 月中旬&#xff0c;Sui 基金会和 Mysten Labs 将共同举办第二届 Sui 游戏峰会&#xff08;Sui Gaming Summit&#xff09;&#xff0c;这是一个专注于 Sui 游戏平台的 GDC 周边活动。此次峰会将与旧金山的年度游戏开发者大会&#xff08;GDC&#xff0c;Game Developers Conf…...

自动驾驶相关知识学习笔记

一、概要 因为想知道SIL、HIL是什么仿真工具&#xff0c;故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著&#xff1b;出版时间&#xff1a;2023年3月 二、图像的分类、分割与检测任务区别 如图所示&#xff0c;这些更高阶的…...

uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」

本文提供增强版table表格组件体验,打造跨端表格的新标杆. uv3-table&#xff1a;一款基于uniappvue3跨端自定义手机端增强版表格组件。支持固定表头/列、边框、斑马纹、单选/多选&#xff0c;自定义表头/表体插槽、左右固定列阴影高亮显示。支持编译兼容H5小程序端App端。 提供…...

新时期下k8s 网络插件calico 安装

1、k8s master节点初始化完毕以后一直处于notreadey状态&#xff0c;一直怀疑是安装有问题或者是初始化有问题&#xff08;当然&#xff0c;如果真有问题要先解决这些问题&#xff09;&#xff0c;经过不断探索才发现是网络插件没有安装导致的&#xff0c;根据建议安装calico插…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

大模型智能体核心技术:CoT与ReAct深度解析

**导读&#xff1a;**在当今AI技术快速发展的背景下&#xff0c;大模型的推理能力和可解释性成为业界关注的焦点。本文深入解析了两项核心技术&#xff1a;CoT&#xff08;思维链&#xff09;和ReAct&#xff08;推理与行动&#xff09;&#xff0c;这两种方法正在重新定义大模…...

Spring AI中使用ChatMemory实现会话记忆功能

文章目录 1、需求2、ChatMemory中消息的存储位置3、实现步骤1、引入依赖2、配置Spring AI3、配置chatmemory4、java层传递conversaionId 4、验证5、完整代码6、参考文档 1、需求 我们知道大型语言模型 &#xff08;LLM&#xff09; 是无状态的&#xff0c;这就意味着他们不会保…...