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.pswp.cn/web/78996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78996.shtml
英文地址,請注明出處:http://en.pswp.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. …