jinshihui 1 неделя назад
Родитель
Сommit
a98b12f1b8

+ 30 - 11
nightFragrance-massage/src/main/java/com/ylx/massage/utils/ExcelUtils.java

@@ -22,6 +22,7 @@ import java.util.List;
  * <p>
  * 提供Excel文件的读取和解析功能,支持敏感词数据的导入。
  * 支持.xls和.xlsx两种格式的Excel文件。
+ * 支持处理合并单元格的情况。
  * </p>
  *
  * @author ylx
@@ -49,6 +50,7 @@ public class ExcelUtils {
      * - 第一行:表头(会被跳过)
      * - 列顺序:敏感词 | 分类 | 等级 | 状态 | 备注
      * - 第二行起:数据行
+     * - 支持分类列使用合并单元格
      * </p>
      *
      * @param file 上传的Excel文件
@@ -92,6 +94,9 @@ public class ExcelUtils {
 
             log.info("开始解析Excel文件,总行数:{}", sheet.getLastRowNum());
 
+            // 用于记录上一行的分类,处理合并单元格的情况
+            String lastCategory = null;
+
             // 遍历所有行(从第二行开始,跳过表头)
             for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                 Row row = sheet.getRow(i);
@@ -102,9 +107,11 @@ public class ExcelUtils {
                 }
 
                 try {
-                    // 解析当前行数据
-                    SensitiveWord word = parseRow(row);
+                    // 解析当前行数据,传入上一行的分类用于处理合并单元格
+                    SensitiveWord word = parseRow(row, lastCategory);
                     if (word != null) {
+                        // 更新lastCategory为当前行的分类,供下一行使用
+                        lastCategory = word.getCategory();
                         wordList.add(word);
                     }
                 } catch (Exception e) {
@@ -141,12 +148,14 @@ public class ExcelUtils {
      * 解析Excel行数据
      * <p>
      * 将Excel的一行数据转换为SensitiveWord对象。
+     * 处理合并单元格:当分类列为空时,使用上一行的分类值。
      * </p>
      *
      * @param row Excel行对象
+     * @param lastCategory 上一行的分类值,用于处理合并单元格
      * @return SensitiveWord 敏感词对象,如果该行数据无效则返回null
      */
-    private static SensitiveWord parseRow(Row row) {
+    private static SensitiveWord parseRow(Row row, String lastCategory) {
         SensitiveWord word = new SensitiveWord();
 
         try {
@@ -159,18 +168,27 @@ public class ExcelUtils {
             word.setWord(wordText.trim());
 
             // 2. 读取分类(必填)
+            // 处理合并单元格:如果当前行分类为空,使用上一行的分类
             String category = getCellValueAsString(row.getCell(COL_CATEGORY));
             if (StrUtil.isBlank(category)) {
-                log.debug("第 {} 行:分类为空,使用默认分类", row.getRowNum() + 1);
-                word.setCategory(SensitiveWordCategoryEnum.OTHER.getDesc());
-            } else {
-                // 验证分类是否有效
-                if (!isValidCategory(category.trim())) {
-                    log.warn("第 {} 行:分类 '{}' 无效,使用默认分类", row.getRowNum() + 1, category);
-                    word.setCategory(SensitiveWordCategoryEnum.OTHER.getDesc());
+                if (StrUtil.isNotBlank(lastCategory)) {
+                    // 使用上一行的分类(处理合并单元格的情况)
+                    log.debug("第 {} 行:分类列为空,使用上一行的分类:{}", row.getRowNum() + 1, lastCategory);
+                    category = lastCategory;
                 } else {
-                    word.setCategory(category.trim());
+                    log.debug("第 {} 行:分类为空,使用默认分类", row.getRowNum() + 1);
+                    category = SensitiveWordCategoryEnum.OTHER.getDesc();
                 }
+            } else {
+                category = category.trim();
+            }
+
+            // 验证分类是否有效
+            if (!isValidCategory(category)) {
+                log.warn("第 {} 行:分类 '{}' 无效,使用默认分类", row.getRowNum() + 1, category);
+                word.setCategory(SensitiveWordCategoryEnum.OTHER.getDesc());
+            } else {
+                word.setCategory(category);
             }
 
             // 3. 读取等级(可选,默认为1)
@@ -216,6 +234,7 @@ public class ExcelUtils {
             if (StrUtil.isNotBlank(remark)) {
                 word.setRemark(remark.trim());
             }
+
             return word;
         } catch (Exception e) {
             log.error("解析第 {} 行数据时发生错误", row.getRowNum() + 1, e);