Excel模版下载文件导入

工作中经常遇到Excel模板下载,然后填好后再导入的情况,简单记录下,方便下次使用

Excel模版下载(返回Base64)

模板文件存放位置
在这里插入图片描述

import java.util.Base64;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource;/*** 下载模板* @return*/public Response<RespDownLoad> downloadTemplateFile() {RespDownLoad respDownLoad = new RespDownLoad();try{String fileName = "税费商户白名单导入模板.xlsx";ClassPathResource resource = new ClassPathResource("excelTemplate/template.xlsx");InputStream inputStream = resource.getInputStream();// 将流转为Base64respDownLoad.setFileData(Base64.getEncoder().encodeToString(IOUtils.toByteArray(inputStream)));respDownLoad.setFileName(fileName);return  Response.success(respDownLoad, "文件输出流生成成功");}catch (Exception e) {e.printStackTrace();}return  Response.fail("99999", "文件输出失败");}
@Data
public class RespDownLoad implements Serializable {private String fileData;private String fileName;
}

文件导入-传Base64

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;private static final String FILE_EXTENSION = "xls,xlsx";private static final String STR_POINT = ".";private static final String STR_SPLIT = ",";private static final int MAX_SIZE = 500;/*** 文件导入 传base64* @return*/public Response uploadFileByBase64(Request<UploadReq> request) throws IOException {UploadReq body = request.getBody();if (null == body.getFileData()) {log.error("上传文件为空");throw new BizException("99999","上传文件为空");}// 获取上传时的文件名称String fileName = body.getFileName();// 文件名称校验if (checkFileName(fileName)) {log.error("[baseUpload][文件名称不允许包含危险字符]");throw new BizException("99999","文件名称不允许包含危险字符");}//文件后缀校验checkFileNameExtension(fileName);//base64转fileMultipartFile file = convertBase64ToMultipartFile(body.getFileData(), fileName);try (InputStream inputStream = file.getInputStream()) {Workbook workbook = new XSSFWorkbook(inputStream);Sheet sheet = workbook.getSheetAt(0);List<BuppsTaxMercode> list = new ArrayList<>();// 使用 sheet.rowIterator() 并跳过第一行Row firstRow = sheet.getRow(0);if (firstRow == null) {log.error("第一行不存在,文件格式错误!");throw new BizException("99999", "第一行不存在,文件格式错误!");}// 从第二行开始迭代,存入listfor (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {Row row = sheet.getRow(rowIndex);if (row == null) {continue; // 避免空行}BuppsTaxMercode info = new BuppsTaxMercode();info.setMerchCode(convertCelType(row.getCell(0)));info.setMerchName(convertCelType(row.getCell(1)));info.setTenantId(convertCelType(row.getCell(2)));info.setStatus(convertCelType(row.getCell(3)));info.setCreateDatetime(DateUtil.getCurrentDateTime14());if(org.springframework.util.StringUtils.isEmpty(info.getMerchCode())){continue;}list.add(info);}// 批量插入数据库if (!CollectionUtils.isEmpty(list)) {if (list.size() > MAX_SIZE) {log.error("超出上传上限,请分批处理!");throw new BizException("99999", "超出上传上限,请分批处理!");}manager.saveBatch(list);} else {throw new BizException("99999", "请勿上传空文件!");}} catch (Exception e) {log.error("文件导入异常", e);throw new BizException("99999", "文件导入异常");}return Response.success();}/*** 匹配字符串中的../及< > " &等危险字符** @param fileName* @return*/private Boolean checkFileName(String fileName) {String regex = "[&<>\"'/]|(\\.\\./)";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(fileName);return matcher.find();}/*** 校验文件扩展名*/public void checkFileNameExtension(String fileName) {if (org.springframework.util.StringUtils.isEmpty(fileName) || fileName.lastIndexOf(STR_POINT) <= 0) {throw new BizException("99999","文件名不符合要求");}String fileExt = fileName.substring(fileName.lastIndexOf(STR_POINT) + 1);String[] extList = FILE_EXTENSION.split(STR_SPLIT);if (!Arrays.asList(extList).contains(fileExt.toLowerCase())) {throw new BizException("99999","不支持的文件后缀");}}public static String convertCelType(Cell cell) {switch (cell.getCellType()) {case NUMERIC:return String.valueOf((int) cell.getNumericCellValue());case STRING:return cell.getStringCellValue();default:return null;}}public static MultipartFile convertBase64ToMultipartFile(String base64String, String fileName) throws IOException {// Step 1: 解码Base64字符串byte[] decodedBytes = Base64.getDecoder().decode(base64String);// Step 2: 转换为InputStreamByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decodedBytes);// Step 3: 创建MultipartFileMultipartFile multipartFile = new MockMultipartFile(fileName, fileName, "application/vnd.ms-excel;charset=utf-8", byteArrayInputStream);return multipartFile;}
@Data
public class UploadReq implements Serializable {private String fileData;private String fileName;
}

文件导入-传MultipartFile

 /*** 文件导入,传MultipartFile* @return*/@RequestMapping("/uploadFileByStream")@ResponseBodypublic Response uploadFileByStream(@RequestParam MultipartFile file) {if (null == file) {log.error("上传文件为空");throw new BizException("99999","上传文件为空");}// 获取上传时的文件名称String fileName = file.getOriginalFilename();// 文件名称校验if (checkFileName(fileName)) {log.error("[baseUpload][文件名称不允许包含危险字符]");throw new BizException("99999","文件名称不允许包含危险字符");}//文件后缀校验checkFileNameExtension(fileName);try (InputStream inputStream = file.getInputStream()) {Workbook workbook = new XSSFWorkbook(inputStream);Sheet sheet = workbook.getSheetAt(0);List<BuppsTaxMercode> list = new ArrayList<>();// 使用 sheet.rowIterator() 并跳过第一行Row firstRow = sheet.getRow(0);if (firstRow == null) {log.error("第一行不存在,文件格式错误!");throw new BizException("99999", "第一行不存在,文件格式错误!");}// 从第二行开始迭代,存入listfor (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {Row row = sheet.getRow(rowIndex);if (row == null) {continue; // 避免空行}BuppsTaxMercode info = new BuppsTaxMercode();info.setMerchCode(convertCelType(row.getCell(0)));info.setMerchName(convertCelType(row.getCell(1)));info.setTenantId(convertCelType(row.getCell(2)));info.setStatus(convertCelType(row.getCell(3)));info.setCreateDatetime(DateUtil.getCurrentDateTime14());if(org.springframework.util.StringUtils.isEmpty(info.getMerchCode())){continue;}list.add(info);}// 批量插入数据库if (!CollectionUtils.isEmpty(list)) {if (list.size() > MAX_SIZE) {log.error("超出上传上限,请分批处理!");throw new BizException("99999", "超出上传上限,请分批处理!");}manager.saveBatch(list);} else {throw new BizException("99999", "请勿上传空文件!");}} catch (Exception e) {log.error("文件导入异常", e);throw new BizException("99999", "文件导入异常");}return Response.success();}

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

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

相关文章

SpringBoot 讯飞星火AI WebFlux流式接口返回 异步返回 对接AI大模型 人工智能接口返回

介绍 用于构建基于 WebFlux 的响应式 Web 应用程序。集成了 Spring WebFlux 模块&#xff0c;支持响应式编程模型&#xff0c;构建非阻塞、异步的 Web 应用。WebFlux 使用了非阻塞的异步模型&#xff0c;能够更好地处理高并发请求。适合需要实时数据推送的应用场景。 WebClie…

模拟Sch LVS Sch 方法

Step1&#xff1a;打开calibre 打开一个terminal&#xff0c;进到想要做lvs的路径&#xff1a; 在terminal 敲入calibre -gui&#xff0c;产生calibre 界面 点击nmLVS&#xff0c;产生calibre LVS界面 Step2&#xff1a;LVS 界面设置1 LVS rules file&#xff1a;加载lvs规…

注解的定义

一、理论说明 1. 注解的定义 Java 注解是从 JDK 5.0 开始引入的一种元数据机制&#xff0c;它可以为代码添加额外的信息&#xff0c;这些信息不影响程序的运行逻辑&#xff0c;但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口&#xff0c;所有注解…

面试实践AND面经热点题目总结

1、对于Rocketmq消息积压、丢失如何解决&#xff1f; 消息积压原因以及解决方案 &#x1f3af; 产生原因&#xff1a; 消费者处理能力弱&#xff0c;消费速度远低于生产速度&#xff1b; 网络不稳定&#xff0c;消费者拉取消息失败&#xff1b; 消费端异常&#xff08;如处理…

【KWDB 创作者计划】使用Docker实现KWDB数据库的快速部署与配置

【KWDB 创作者计划】使用Docker实现KWDB数据库的快速部署与配置 前言一、KWDB介绍1.1 KWDB简介1.2 主要特点1.3 典型应用场景 二、环境介绍2.1 部署环境要求2.2 本地环境规划2.3 部署模式 三、部署Docker环境3.1 安装相关工具3.2 配置Docker软件源3.3 更新软件源3.4 安装Docker…

JWT深度解析:现代Web身份验证的通行证-优雅草卓伊凡

# JWT深度解析&#xff1a;现代Web身份验证的通行证 ## 一、JWT的本质与构成 ### 1.1 JWT的定义解析 JWT&#xff08;JSON Web Token&#xff09;是一种**开放标准&#xff08;RFC 7519&#xff09;**&#xff0c;用于在各方之间安全地传输信息作为JSON对象。这种信息可以被…

前端缓存踩坑指南:如何优雅地解决浏览器缓存问题?

浏览器缓存&#xff0c;配置得当&#xff0c;它能让页面飞起来&#xff1b;配置错了&#xff0c;一次小小的上线&#xff0c;就能把你扔进线上 bug 的坑里。你可能遇到过这些情况&#xff1a; 部署上线了&#xff0c;结果用户还在加载旧的 JS&#xff1b;接口数据改了&#xf…

2022年8月,​韩先超对中移信息进行微服务架构原理(Docker+k8s+DevOps+Go等)培训

2022年8月&#xff0c;​韩先超对中移信息进行微服务架构原理&#xff08;Dockerk8sDevOpsGo等&#xff09;培训 2022年8月&#xff0c;在企业数字化转型和云原生架构加速演进的背景下&#xff0c; 中移信息技术有限公司特别邀请云原生与DevOps领域专家 韩先超老师&#xff0c…

ComfyUI 学习笔记,案例 6 :FLUX 模型文生图

背景 刚开始了解 Comfy UI 的时候&#xff0c;随便找了一个资料&#xff0c;对着这篇 《Flux在ComfyUI里的下载与安装》 进行操作的&#xff0c;下载了这里面的模型到本机。 玩了几天&#xff0c;大概对 ComfyUI 有了一点了解&#xff0c;知道了 Flux 这是一个模型&#xff0…

Docker + Watchtower 实现容器自动更新:高效运维的终极方案

文章目录 前言一、Watchtower 简介二、Watchtower 安装与基本使用1. 快速安装 Watchtower2. 监控特定容器 三、Watchtower 高级配置1. 设置检查间隔2. 配置更新策略3. 清理旧镜像4. 通知设置 四、生产环境最佳实践1. 使用标签控制更新2. 更新前执行健康检查3. 结合CI/CD流水线 …

从易发性分析到灾后规划,AI大模型如何颠覆传统地质灾害防治?

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下&#xff0c;地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害&#xff0c;还包括崩塌、泥石流…

第37次CCF第三题--模板展开--stringstream读取字符串

1 a hello 1 b world 2 c $a $b 1 d good $c 1 a hi 1 e good $c1 a hello 1 b world 2 c $a $b 3 c 1 a hi 3 c将会输出&#xff1a;10 和 7&#xff0c;对应的变量的值为&#xff1a; helloworld hiworld 需要注意的是&#xff0c;在使用间接赋值语句时&#xff0c;在变量的…

深度学习:智能车牌识别系统(python)

这是一个基于opencv的智能车牌识别系统,有GUI界面。程序能自动识别图片中的车牌号码,并支持中文和英文字符识别,支持选择本地图片文件,支持多种图片格式(jpg、jpeg、png、bmp、gif)。 下面,我将按模块功能对代码进行分段说明: 1. 导入模块部分 import tkinter as tk…

Missashe考研日记-day35

Missashe考研日记-day35 1 专业课408 学习时间&#xff1a;3h学习内容&#xff1a; 完结撒花&#xff01;&#xff01;今天把OS最后一节的内容学完了&#xff0c;操作系统也算是告一段落了&#xff0c;接下来是计网时间&#xff01;不过计网我是上学期才学过的&#xff0c;当…

【Bootstrap V4系列】学习入门教程之 组件-下拉菜单(Dropdowns)

Bootstrap V4系列 学习入门教程之 组件-下拉菜单&#xff08;Dropdowns&#xff09; 下拉菜单&#xff08;Dropdowns&#xff09;一、Overview 概述二、Accessibility 可访问性三、Examples3.1 Single button 单按钮3.2 Split button 分割按钮 四、Sizing 尺寸 下拉菜单&#x…

红外遥控与NEC编码协议详解

在我们日常生活中&#xff0c;电视遥控器、空调遥控器、风扇遥控器&#xff0c;几乎都离不开“红外遥控”这项技术。虽然我们每天都在用&#xff0c;但你知道里面是怎么通信的吗&#xff1f;本篇文章将带你了解红外遥控的工作原理&#xff0c;重点解析目前应用最广泛的红外编码…

深入剖析 I/O 复用之 select 机制

深入剖析 I/O 复用之 select 机制 在网络编程中&#xff0c;I/O 复用是一项关键技术&#xff0c;它允许程序同时监控多个文件描述符的状态变化&#xff0c;从而高效地处理多个 I/O 操作。select 作为 I/O 复用的经典实现方式&#xff0c;在众多网络应用中扮演着重要角色。本文…

【Linux系列】目录大小查看

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

《AI大模型应知应会100篇》第48篇:构建企业级大模型应用的架构设计

第48篇&#xff1a;构建企业级大模型应用的架构设计 摘要&#xff1a;本文将提供企业级大模型应用的端到端架构设计方案&#xff0c;从系统设计原则到技术栈选择&#xff0c;从高可用保障到安全合规&#xff0c;全面覆盖构建稳健、可扩展、安全的大模型应用所需的工程实践。适合…

人协同的自动化需求分析

多人协同的自动化需求分析是指通过技术工具和协作流程&#xff0c;让多个参与者&#xff08;如产品经理、开发人员、测试人员等&#xff09;在需求分析阶段高效协作&#xff0c;并借助自动化手段提升需求收集、整理、验证和管理的效率与质量。以下是其核心要点&#xff1a; 1. …