?
?首先校驗
?
/*** 校驗導入文件* @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"));}}