Excel导入预览与下载

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


Excel导入预览与下载

preview

  • Controller
 @PostMapping("preview")@ApiOperation("上传拒付预警预览")public Result<List<ResChargebackWarnPreview>> preview(@RequestParam(name = "file", required = false) MultipartFile file) {return Result.succ(chargebackWarnService.analysisUploadFile(file, true).getList());}
  • Service
@PostMapping("preview")
@ApiOperation("上传拒付预警预览")
public Result<List<ResChargebackWarnPreview>> preview(@RequestParam(name = "file", required = false) MultipartFile file) {// 上传拒付预警预览的API接口// 接收一个名为"file"的可选的MultipartFile类型的请求参数return Result.succ(chargebackWarnService.analysisUploadFile(file, true).getList());
}public ResChargebackWarnUpload analysisUploadFile(MultipartFile file, boolean isPreview) {// 解析上传的文件并进行拒付预警分析// 返回一个ResChargebackWarnUpload对象// 创建一个用于拼接错误信息的StringJoiner对象StringJoiner joiner = new StringJoiner("<br/>");// 创建一个ResChargebackWarnUpload对象ResChargebackWarnUpload res = new ResChargebackWarnUpload();// 创建一个空的TransactionChargebackWarn列表,用于存储拒付预警数据List<TransactionChargebackWarn> chargebackWarns = new ArrayList<>();// 创建用于存储预览成功和预览错误数据的列表List<ResChargebackWarnPreview> previewSuccess = new ArrayList<>();List<ResChargebackWarnPreview> previewError = new ArrayList<>();// 创建一个ChargebackWarnFile列表,用于存储解析后的文件数据List<ChargebackWarnFile> list;try {// 使用Lombok的@Cleanup注解自动关闭输入流@CleanupInputStream inputStream = file.getInputStream();// 获取上传文件的原始文件名,并转换为小写String filename = file.getOriginalFilename().toLowerCase();// 检查文件名是否包含"拒付"关键字,如果不包含则抛出异常if (!(filename.contains("拒付"))) {throw new ManageException("请传入正确的 拒付 文件上传模板");}// 解析上传的拒付预警文件,将其转换为ChargebackWarnFile对象列表list = analysisChargebackWarnFile(ChargebackWarnFile.class, inputStream);// 遍历ChargebackWarnFile对象列表for (ChargebackWarnFile bean : list) {ResChargebackWarnPreview preview;// 如果当前数据存在错误,则将错误信息添加到joiner中,并创建一个ResChargebackWarnPreview对象添加到previewError列表中if (bean.isError()) {joiner.add(bean.getIndex() + ": " + bean.getErrorMessage());preview = new ResChargebackWarnPreview(bean.getIndex(), bean.getErrorMessage());previewError.add(preview);} else {// 如果当前数据没有错误,则根据数据的不同情况进行处理,并创建一个TransactionChargebackWarn对象添加到chargebackWarns列表中// 同时创建一个ResChargebackWarnPreview对象添加到previewSuccess列表中// ...}}// 根据isPreview参数判断是否执行导入操作if (!isPreview) {// 如果不是预览操作,检查是否存在预览错误数据,如果存在则抛出异常if (!previewError.isEmpty()) {throw new ManageException("该文件内包含错误数据,不可进行导入");}// 执行导入操作,将chargebackWarns列表中的数据保存到数据库中// ...}} catch (IOException e) {e.printStackTrace();}// 设置ResChargebackWarnUpload对象的属性值res.setChargebackWarns(chargebackWarns);// 根据预览错误数据是否为空,设置ResChargebackWarnUpload对象的其他属性值if (!previewError.isEmpty()) {res.setList(previewError);res.setPreviewTotal(previewError.size());} else {res.setList(previewSuccess);res.setPreviewTotal(previewSuccess.size());}res.setMessage(joiner.toString());return res;
}public <T extends ChargebackWarnFile> List<ChargebackWarnFile> analysisChargebackWarnFile(Class<T> clazz, InputStream is) {// 解析拒付预警文件并转换为ChargebackWarnFile对象列表// 返回ChargebackWarnFile对象列表// 使用ExcelTools工具类将Excel文件转换为指定类型的对象列表List<T> list = ExcelTools.excelToList(clazz, is);// 创建一个ChargebackWarnFile列表,用于存储解析后的文件数据List<ChargebackWarnFile> files = new ArrayList<>();// 遍历ChargebackWarnFile对象列表for (int i = 0; i < list.size(); i++) {int index = i + 1;T bean = list.get(i);try {// 对当前数据进行各种验证和处理// ...// 将验证通过的数据封装为ChargebackWarnFile对象,并添加到files列表中// ...} catch (Exception e) {// 如果验证或处理过程中出现异常,则创建一个带有错误信息的ChargebackWarnFile对象,并添加到files列表中files.add(new ChargebackWarnFile(index, e.getMessage()));}}return files;
}

download

  • Controller
 @GetMapping("download")@ApiOperation("拒付预警列表下载")public void download(@Validated ChargebackWarnQuery query) {try {ExcelTools.download(httpServletResponse, ChargebackWarnDownload.class, chargebackWarnService.listChargebackWarnDownload(query), "ChargebackWarns");} catch (IOException e) {throw new RuntimeException(e);}}
  • Service
   public List<ChargebackWarnDownload> listChargebackWarnDownload(ChargebackWarnQuery query) {List<TransactionChargebackWarn> list = transactionChargebackWarnRepo.list(MSearchTools.createQueryWrapper(TransactionChargebackWarn.class, query));return list.stream().map(ChargebackWarnDownload::orderOf).collect(Collectors.toList());}

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

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

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

相关文章

Linux系统编程(四)进程

一、进程的产生&#xff08;fork&#xff09; fork(2) 系统调用会复制调用进程来创建一个子进程&#xff0c;在父进程中 fork 返回子进程的 pid&#xff0c;在子进程中返回 0。 #include <sys/types.h> #include <unistd.h>pid_t fork(void); fork 后子进程不继…

【MySQL】高度为2和3时B+树能够存储的记录数量的计算过程

文章目录 题目答案高度为2时的B树高度为3时的B树总结 GPT4 对话过程 题目 InnoDB主键索引的Btree在高度分别为 2 和 3 时&#xff0c;可以存储多少条记录&#xff1f; 答案 高度为2时的B树 计算过程&#xff1a; 使用公式 ( n 8 ( n 1 ) 6 16 1024 ) (n \times 8 …

一文搞懂“什么是双亲委派”

文章目录 双亲委派介绍类加载器介绍类加载流程验证自定义类加载器为什么要设计这种机制 提前声明&#xff1a;以下介绍都是基于jdk9之前版本的双亲委派机制&#xff0c;jdk9及之后版本双亲委派会有变化&#xff0c;不在本篇介绍。 双亲委派介绍 双亲委派机制&#xff08;Pare…

[Vue warn]: Duplicate keys detected: ‘1‘. This may cause an update error.

[Vue warn]: Duplicate keys detected: ‘1‘. This may cause an update error.——> Vue报错&#xff0c;key关键字不唯一&#xff1a; 解决办法&#xff1a;修改一下重复的id值&#xff01;&#xff01;&#xff01;

并发CPU伪共享及优化

目录 伪共享 解决 伪共享 缓存系统中是以缓存行&#xff08;cache line&#xff09;为单位存储的。缓存行是2的整数幂个连续字节&#xff0c;一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时&#xff0c;如果这些变量共享同一个缓存行&am…

459. Repeated Substring Pattern( 重复的子字符串)

问题描述 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 问题分析 如果一个字符串s能够由其子字符串重复多次构成&#xff0c;那么这个子字符串的长度 l l l一定是字符串s长度 L L L的因子&#xff0c;即 L / l z ( z ∈ 整数 ) L/lz …

【Linux学习】线程池

目录 23.线程池 23.1 什么是线程池 23.2 为什么需要线程池 23.3 线程池的应用场景 23.4 实现一个简单的线程池 23.4.1 RAII风格信号锁 23.4.2 线程的封装 23.4.3 日志打印 22.4.4 定义队列中存放Task类任务 23.4.5 线程池的实现(懒汉模式) 为什么线程池中需要有互斥锁和条件变…

云备份项目:在云端保护您的数据【二、开发】

☘️过度的信息对一个过着充实生活的人来说&#xff0c;是一种不必要的负担☘️ 文章目录 前言工具类实现文件实用工具类代码实现 Json实用工具类代码实现 服务端单例配置类系统配置信息单例配置类 数据管理类数据信息数据管理 热点管理类业务处理类 客户端数据管理类文件备份类…

Pytest测试技巧之Fixture:模块化管理测试数据

在 Pytest 测试中&#xff0c;有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture&#xff0c;特别是如何利用 Fixture 实现测试数据的模块化管理&#xff0c;以提高测试用例的清晰度和可复用性。 什么是Fixture&#xff1f; 在 Pytest 中&a…

第13章 网络 Page734 “I/O对象”的链式传递 单独的火箭发射函数,没有用对的智能指针

上一篇博文中&#xff0c;我们使用单独的火箭发射函数&#xff0c;结果什么结果也没有得到&#xff0c;原因是launch_rocket()函数结束时&#xff0c;其内的局部对象counter生命周期也结束了 那么可以将counter改为指针吗&#xff1f;在堆中分配&#xff0c;这样当函数退出时&…

B2科目二考试项目笔记

B2科目二考试项目笔记 1 桩考1.1 右起点倒库1.2 移库&#xff08;左→右&#xff09;1.3 驶向左起点1.4 左起点倒库1.5 驶向右起点 2 侧方停车考试阶段&#xff08;从路边开始&#xff09;&#xff1a; 3 直角转弯4 坡道定点停车和起步5 单边桥6 通过限速限宽门7 曲线行驶8 连续…

第21讲关于我们页面实现

关于我们页面实现 关于锋哥页面author.vue 我们这里用一个vip宣传页面&#xff0c;套一个web-view <template><web-view src"http://www.java1234.com/vip.html"></web-view> </template><script> </script><style> <…