|
|
@@ -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);
|