ソースを参照

批量导入Excel导入模板

cr 1 週間 前
コミット
24c082abce

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1909,7 +1909,7 @@ public class ExcelTabController extends BladeController {
             updateWrapper.set("tab_group_id", tabGroupId);
             wbsTreeContractService.update(updateWrapper);
         }
-        return R.data("成功");
+        return R.data(wbsTreeContract);
     }
 
 

+ 30 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -43,6 +43,7 @@ import org.springblade.manager.service.impl.ExcelTabServiceImpl;
 import org.springblade.manager.service.impl.NodeBaseInfoServiceImpl;
 import org.springblade.manager.service.impl.WbsTreeContractServiceImpl;
 import org.springblade.manager.util.DataStructureFormatUtils;
+import org.springblade.manager.utils.DuplicateSheetRecognizer;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.utils.RandomNumberHolder;
 import org.springblade.manager.vo.*;
@@ -703,14 +704,6 @@ public class WbsTreeContractController extends BladeController {
         if (wbsTreeContracts.isEmpty()) {
             return R.fail("该节点下没有找到对应的表单数据");
         }
-
-        // 处理表单名称(与下载时的sheet名处理逻辑一致,确保匹配)
-        Map<String, WbsTreeContract> nodeNameToContractMap = new HashMap<>();
-        for (WbsTreeContract contract : wbsTreeContracts) {
-            String processedNodeName = contract.getNodeName().replaceAll("[\\\\/:*?\"<>|]", "_");
-            nodeNameToContractMap.put(processedNodeName, contract);
-        }
-
         // 2. 加载上传的多sheet Excel文件
         com.spire.xls.Workbook mainWorkbook = new com.spire.xls.Workbook();
         try {
@@ -722,11 +715,39 @@ public class WbsTreeContractController extends BladeController {
 
         // 3. 遍历所有sheet,逐个处理
         int sheetCount = mainWorkbook.getWorksheets().getCount();
+        // 处理表单名称(与下载时的sheet名处理逻辑一致,确保匹配)
+        Map<String, WbsTreeContract> nodeNameToContractMap = new HashMap<>();
+        for (WbsTreeContract contract : wbsTreeContracts) {
+            String processedNodeName = contract.getNodeName().replaceAll("[\\\\/:*?\"<>|]", "_").trim();
+            nodeNameToContractMap.put(processedNodeName, contract);
+        }
+        if(wbsTreeContracts.size()<sheetCount){
+            for (int i = 0; i < sheetCount; i++) {
+                com.spire.xls.Worksheet sheet = mainWorkbook.getWorksheets().get(i);
+                String sheetName = sheet.getName();
+                String processedSheetName = sheetName.replaceAll("[\\\\/:*?\"<>|]", "_").trim(); // 处理sheet名特殊字符
+                // 1. 识别当前sheet是否为复制表
+                DuplicateSheetRecognizer.DuplicateSheetResult result =
+                        DuplicateSheetRecognizer.recognize(processedSheetName);
+                if (result.isDuplicate()) {
+                    String originalName = result.getOriginalName();
+                    if(nodeNameToContractMap.containsKey(originalName)){
+                        WbsTreeContract contract = nodeNameToContractMap.get(originalName);
+                        R r = excelTabController.copeBussTab(contract.getPKeyId());
+                        if(r.isSuccess()){
+                            WbsTreeContract data = (WbsTreeContract) r.getData();
+                            nodeNameToContractMap.put(data.getNodeName(), data);
+                            sheet.setName(data.getNodeName());
+                        }
+                    }
 
+                }
+            }
+        }
         for (int i = 0; i < sheetCount; i++) {
             com.spire.xls.Worksheet sheet = mainWorkbook.getWorksheets().get(i);
             String sheetName = sheet.getName();
-            String processedSheetName = sheetName.replaceAll("[\\\\/:*?\"<>|]", "_"); // 处理sheet名特殊字符
+            String processedSheetName = sheetName.replaceAll("[\\\\/:*?\"<>|]", "_").trim(); // 处理sheet名特殊字符
 
             // 匹配对应的表单
             WbsTreeContract matchedContract = nodeNameToContractMap.get(processedSheetName);

+ 59 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/DuplicateSheetRecognizer.java

@@ -0,0 +1,59 @@
+package org.springblade.manager.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 识别复制的sheet(格式:原表名(数字),数字≥2)
+ */
+public class DuplicateSheetRecognizer {
+
+    // 正则表达式:匹配"原表名(数字)",数字从2开始(支持多位数如2、10、100等)
+    // 分组1:原表名(去除末尾空格);分组2:复制序号(数字)
+    private static final Pattern DUPLICATE_SHEET_PATTERN = Pattern.compile(
+            "^(.*?)\\(\\s*([2-9]\\d*)\\s*\\)$"
+    );
+
+    /**
+     * 识别sheet是否为复制表
+     * @param sheetName 待识别的sheet名称
+     * @return 识别结果(包含是否为复制表、原表名、复制序号)
+     */
+    public static DuplicateSheetResult recognize(String sheetName) {
+        if (sheetName == null || sheetName.trim().isEmpty()) {
+            return new DuplicateSheetResult(false, null, null);
+        }
+
+        Matcher matcher = DUPLICATE_SHEET_PATTERN.matcher(sheetName.trim());
+        if (matcher.matches()) {
+            // 提取原表名(去除可能的末尾空格)
+            String originalName = matcher.group(1).trim();
+            // 提取复制序号(转换为数字)
+            Integer sequence = Integer.parseInt(matcher.group(2).trim());
+            return new DuplicateSheetResult(true, originalName, sequence);
+        } else {
+            // 非复制表
+            return new DuplicateSheetResult(false, null, null);
+        }
+    }
+
+    /**
+     * 识别结果封装类
+     */
+    public static class DuplicateSheetResult {
+        private boolean isDuplicate; // 是否为复制表
+        private String originalName; // 原表名(仅当isDuplicate为true时有效)
+        private Integer sequence;    // 复制序号(仅当isDuplicate为true时有效,≥2)
+
+        public DuplicateSheetResult(boolean isDuplicate, String originalName, Integer sequence) {
+            this.isDuplicate = isDuplicate;
+            this.originalName = originalName;
+            this.sequence = sequence;
+        }
+
+        // getter方法
+        public boolean isDuplicate() { return isDuplicate; }
+        public String getOriginalName() { return originalName; }
+        public Integer getSequence() { return sequence; }
+    }
+}