使用POI導入解析excel文件

?

?首先校驗

?

    /*** 校驗導入文件* @param file 上傳的文件* @return 校驗結果,成功返回包含成功狀態的AjaxResult,失敗返回包含錯誤信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.error("文件不能為空");}String filename = file.getOriginalFilename();if (filename == null || !(filename.endsWith(".xlsx") || filename.endsWith(".xls"))) {return AjaxResult.error("僅支持Excel文件");}return AjaxResult.success();}

?通過進行解析

    @Override@Transactional(rollbackFor = Exception.class)public AjaxResult importWnList(@RequestParam("file") MultipartFile file) {// 1. 校驗文件AjaxResult validateResult = validateImportFile(file);if (!validateResult.isSuccess()) {return validateResult;}try {// 2. 解析ExcelList<Wn> dataList = parseExcel(file);// 3. 處理業務邏輯Map<String, Object> importResult = saveListData(dataList);// 4. 構建返回消息return buildImportResult(importResult);} catch (Exception e) {return AjaxResult.error("導入失敗: " + e.getMessage());}}

?

    public List<Wn> parseExcel(MultipartFile file) throws IOException {List<Wn> list = new ArrayList<>();DataFormatter formatter = new DataFormatter();Workbook workbook = WorkbookFactory.create(file.getInputStream());Sheet sheet = workbook.getSheet("微腦列表");// 如果找不到指定名稱的工作表,則獲取第一個工作表if (sheet == null) {log.info("找不到名為'微腦列表'的工作表,將使用第一個工作表");sheet = workbook.getSheetAt(0);// 檢查第一個工作表是否存在if (sheet == null) {throw new IllegalArgumentException("Excel文件中不包含任何工作表");}}for (Row row : sheet) {if (row.getRowNum() == 0) continue; // 跳過表頭Wn wn = new Wn();wn.setWnNum(formatter.formatCellValue(row.getCell(0)));wn.setWnSn(formatter.formatCellValue(row.getCell(1)));wn.setWnType(formatter.formatCellValue(row.getCell(2)));wn.setAreaId(formatter.formatCellValue(row.getCell(3)));list.add(wn);}workbook.close();return list;}

最后保存邏輯

    public Map<String, Object> saveListData(List<Wn> dataList) {// 參數校驗if (CollectionUtils.isEmpty(dataList)) {return Collections.singletonMap("message", "數據列表不能為空");}HashSet<Long> TempidList = new HashSet<>();// 初始化統計結果int successCount = 0;int failCount = 0;List<String> failReasons = new ArrayList<>();dataList.forEach(wn -> {String wnType = wn.getWnType();WnTemplate wnTemplateA = new WnTemplate();wnTemplateA.setId(Long.valueOf(wnType));List<WnTemplate> wnTemplates = wnTemplateMapper.selectWnTemplateList(wnTemplateA);TempidList.add(wnTemplates.get(0).getId());});// 優化:先加載所有模板信息到Map,避免循環內重復查詢Map<Long, WnTemplate> templateMap = loadTemplateMapByType(TempidList);// 遍歷處理每條數據for (int i = 0; i < dataList.size(); i++) {Wn wn = dataList.get(i);try {// 1. 輸入參數基礎校驗validateWnData(wn);// 2. 唯一性校驗(示例校驗name和code組合唯一)if (selectWnByWnNum(wn.getWnNum()) != null) {throw new RuntimeException("微腦編號已存在"+wn.getWnNum());}// 3. 校驗:微腦模板是否存在(從預加載的Map中獲取)String wnType = wn.getWnType();WnTemplate wnTemplate = new WnTemplate();wnTemplate.setId(Long.valueOf(wnType));List<WnTemplate> wnTemplates = wnTemplateMapper.selectWnTemplateList(wnTemplate);WnTemplate wnTemplateB = templateMap.get(wnTemplates.get(0).getId());if (wnTemplateB == null) {throw new RuntimeException("該模板不存在:" + wn.getWnType());}wn.setWnType(wnTemplateB.getName());wn.setStatus("0");// 4. 插入數據insertWn(wn);if (StringUtils.isEmpty(wn.getQrCode())){String url=qrcode(wn.getId());wn.setQrCode(url);wnMapper.updateWn(wn);}for (WnTemplateSensors wnTemplateSensors : wnTemplateB.getSensorsList()) {Sensors sensors = new Sensors();sensors.setSensorType(wnTemplateSensors.getSensorType());sensors.setWnId(wn.getId());sensors.setCreateTime(DateUtils.getNowDate());sensors.setSensorNid(wnTemplateSensors.getSensorNid());sensorsMapper.insertSensors(sensors);}successCount++;} catch (Exception e) {failCount++;failReasons.add(failCount + ") 第" + (i + 2) + "行數據錯誤:" + e.getMessage());}}// 返回結構化結果Map<String, Object> result = new HashMap<>();result.put("successCount", successCount);result.put("failCount", failCount);result.put("failReasons", failReasons);return result;}

構建返回信息

    /*** 構建導入結果返回對象* @param importResult 導入結果Map,包含successCount、failCount和failReasons* @return 導入結果對象*/private AjaxResult buildImportResult(Map<String, Object> importResult) {// 從Map中提取結果數據Integer successCount = (Integer) importResult.getOrDefault("successCount", 0);Integer failCount = (Integer) importResult.getOrDefault("failCount", 0);List<String> failReasons = (List<String>) importResult.get("failReasons");// 構建返回消息String message;if(failCount.equals(0)){message = String.format("導入完成!成功 %d 條,失敗 %d 條。",successCount,failCount);return AjaxResult.success(message).put("successCount", importResult.get("successCount")).put("failCount", failCount);}else{message = String.format("導入完成!成功 %d 條,失敗 %d 條。\n失敗原因:\n%s",successCount,failCount,String.join("\n", failReasons));return AjaxResult.success(message).put("successCount", importResult.get("successCount")).put("failCount", importResult.get("failCount")).put("details", importResult.get("failReasons"));}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89320.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89320.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從0開始學習計算機視覺--Day06--反向傳播算法

盡管解析梯度可以讓我們省去巨大的計算量&#xff0c;但如果函數比較復雜&#xff0c;對這個損失函數進行微分計算會變得很困難。我們通常會用反向傳播技術來遞歸地調用鏈式法則來計算向量每一個方向上的梯度。具體來說&#xff0c;我們將整個計算過程的輸入與輸入具體化&#…

企業流程知識:《學習觀察:通過價值流圖創造價值、消除浪費》讀書筆記

《學習觀察&#xff1a;通過價值流圖創造價值、消除浪費》讀書筆記 作者&#xff1a;邁克魯斯&#xff08;Mike Rother&#xff09;&#xff0c;約翰舒克&#xff08;John Shook&#xff09; 出版時間&#xff1a;1999年 歷史地位&#xff1a;精益生產可視化工具的黃金標準&am…

Day02_C語言IO進程線程

01.思維導圖 02.將當前的時間寫入到time. txt的文件中&#xff0c;如果ctrlc退出之后&#xff0c;在再次執行支持斷點續寫 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止&#xff0c;再次執行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS與MP4格式的extradata差異詳解

在視頻處理中&#xff0c;extradata是存儲解碼器初始化參數的核心元數據&#xff0c;直接影響視頻能否正確解碼。本文深入解析TS和MP4格式中extradata的結構差異、存儲邏輯及FFmpeg處理方案。 &#x1f4cc; 一、extradata的核心作用 extradata是解碼必需的參數集合&#xff0…

【CV數據集介紹-40】Cityscapes 數據集:助力自動駕駛的語義分割神器

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(FAGLL03H Bug)

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(S4 1709) 財務反饋&#xff0c;月結后核對數據時發現FAGLL03H導出的研發費用與損益表中的研發費用不一致&#xff0c;如下圖所示&#xff1a; 對比FAGLL03H與損益表對應的明細&#xff0c;發現FAGLL03H與損益表數據存在倍數…

HTML inputmode 屬性詳解

inputmode 是一個 HTML 屬性&#xff0c;用于指定用戶在編輯元素或其內容時應使用的虛擬鍵盤布局類型。它主要影響移動設備和平板電腦的輸入體驗。 語法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…

軟考中級【網絡工程師】第6版教材 第1章 計算機網絡概述

考點分析&#xff1a; 本章重要程度&#xff1a;一般&#xff0c;為后續章節做鋪墊&#xff0c;有總體認識即可&#xff0c;選擇題1-2分高頻考點&#xff1a;OSI模型、TCP/IP模型、每個層次的功能、協議層次新教材變化&#xff1a;刪除網絡結構、刪除X.25、更新互聯網發展【基本…

Mysql事務與鎖

數據庫并發事務 數據庫一般都會并發執行多個事務&#xff0c;多個事務可能會并發的對相同的一批數據進行增刪改查操作&#xff0c;可能就會導致我們說的臟寫、臟讀、不可重復讀、幻讀這些問題。為了解決這些并發事務的問題&#xff0c;數據庫設計了事務隔離機制、鎖機制、MVCC多…

Bilibili多語言字幕翻譯擴展:基于上下文的實時翻譯方案設計

Bilibili多語言字幕翻譯擴展&#xff1a;基于上下文的實時翻譯方案設計 本文介紹了一個Chrome擴展的設計與實現&#xff0c;該擴展可以為Bilibili視頻提供實時多語言字幕翻譯功能。重點討論了字幕翻譯中的上下文問題及其解決方案。 該項目已經登陸Chrome Extension Store: http…

熱血三國野地名將列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名將信息表</title><style>tabl…

【記錄】Word|Word創建自動編號的多級列表標題樣式

文章目錄 前言創建方式第一種方法&#xff1a;從“定義多級列表”中直接綁定已有樣式第二種方法&#xff1a;通過已有段落創建樣式&#xff0c;再綁定補充說明 尾聲 前言 這世上荒唐的事情不少&#xff0c;但若說到吊詭&#xff0c;Word中的多級列表樣式設定&#xff0c;倒是能…

使用mavros啟動多機SITL仿真

使用mavros啟動多機SITL仿真 方式1&#xff1a;使用roslaunch一鍵啟動Step1&#xff1a;創建一個新的 ROS 包或放到現有包里Step2&#xff1a;編輯 multi_mavros.launchStep3&#xff1a;構建工作空間并 source 環境Step4&#xff1a;構建工作空間并 source 環境 方式2&#xf…

Flutter 網絡棧入門,Dio 與 Retrofit 全面指南

面向多年 iOS 開發者的零阻力上手 寫在前面 你在 iOS 項目中也許習慣了 URLSession、Alamofire 或 Moya。 換到 Flutter 后&#xff0c;等價的「組合拳」就是 Dio Retrofit。 本文將帶你一次吃透兩套庫的安裝、核心 API、進階技巧與最佳實踐。 1. Dio&#xff1a;Flutter 里的…

工作室考核源碼(帶后端)

題目內容可更改 下載地址:https://mcwlkj.lanzoub.com/iUF3z300tgfe 如圖所示

數字孿生技術為UI前端提供全面支持:實現產品的可視化配置與定制

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;數字孿生驅動產品定制的技術革命 在消費升級與工業 4.0 的雙重驅動下&a…

通往物理世界自主智能的二元實在論與羅塞塔協議

序章&#xff1a;AI的“兩種文化”之爭——我們是否在構建錯誤的“神”&#xff1f; 自誕生以來&#xff0c;人工智能領域始終存在著一場隱秘的“兩種文化”之爭。一方是符號主義與邏輯的信徒&#xff0c;他們追求可解釋、嚴謹的推理&#xff0c;相信智能的核心在于對世界規則…

探索 AI 系統提示與模型資源庫:`system-prompts-and-models-of-ai-tools`

在當今的人工智能領域,系統提示和工具模型的優化與應用對于提升 AI 助手的性能和響應質量至關重要。x1xhlol 開源的 system-prompts-and-models-of-ai-tools 倉庫為開發者們提供了一個豐富的資源集合,涵蓋了多種 AI 工具的系統提示、工具和模型。 倉庫概述 這個倉庫包含了超…

城市燈光夜景人像街拍攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程 “城市燈光夜景人像街拍攝影后期 Lr 調色”&#xff0c;主要是利用 Lightroom 軟件&#xff0c;對城市夜景中燈光下的人像街拍照片進行處理。通過調整色彩平衡、明暗對比和細節質感&#xff0c;強化夜景燈光的絢麗感&#xff0c;突出人像主體&#xff0c;同時協調人物…

JavaScript中的call、apply、bind:用法、實現與區別詳解(面試常見)

# JavaScript中的call、apply、bind&#xff1a;用法、實現與區別詳解## 核心概念 這三個方法都用于改變函數執行時的this指向&#xff0c;是JavaScript中函數上下文操作的核心API。## 1. 基本用法對比### call方法 javascript function.call(thisArg, arg1, arg2, ...)特點&am…