fix: Excel导入表头定位改为自动扫描(官方模板标题/说明占前两行导致一直导入0题);空结果时报Excel未读取到题目而非假成功

fix/exam-question-access-material-excel-delete-draft
chenyuan 6 days ago
parent d2831d3af9
commit 960de29bf7

@ -130,11 +130,19 @@ public class PlatformQuestionBankService {
String name = StringUtils.defaultString(file.getOriginalFilename()).toLowerCase(Locale.ROOT);
if (name.endsWith(".docx")) return importWord(user, file, taskKey);
try (Workbook workbook = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = workbook.getSheetAt(0); DataFormatter formatter = new DataFormatter(); Row header = sheet.getRow(0);
Sheet sheet = workbook.getSheetAt(0); DataFormatter formatter = new DataFormatter();
Row header = null; int headerIndex = -1;
for (int i = 0; i <= Math.min(sheet.getLastRowNum(), 9); i++) {
Row candidate = sheet.getRow(i); if (candidate == null) continue;
boolean hasType = false, hasStem = false;
for (int c = 0; c < candidate.getLastCellNum(); c++) { String v = formatter.formatCellValue(candidate.getCell(c)).trim(); if ("题型".equals(v)) hasType = true; if ("题干".equals(v)) hasStem = true; }
if (hasType && hasStem) { header = candidate; headerIndex = i; break; }
}
if (header == null) throw new IllegalArgumentException("Excel缺少表头");
Map<String, Integer> columns = new HashMap<>(); for (int i=0;i<header.getLastCellNum();i++) columns.put(formatter.formatCellValue(header.getCell(i)).trim(), i);
List<Map<String,Object>> result = new ArrayList<>();
for (int r=1;r<=sheet.getLastRowNum();r++) { Row row=sheet.getRow(r); if (row==null) continue; Map<String,Object> q=new LinkedHashMap<>(); q.put("taskKey",taskKey); q.put("type", excelType(value(row, columns.get("题型"), formatter))); q.put("stem", value(row, columns.get("题干"), formatter)); q.put("answer", value(row, columns.get("正确答案"), formatter)); q.put("analysis", value(row, columns.get("答案解析"), formatter)); List<Map<String,Object>> options=new ArrayList<>(); for(char c='A';c<='H';c++){String v=value(row,columns.get("选项"+c),formatter); if(StringUtils.isNotBlank(v)) options.add(map("label",String.valueOf(c),"content",v));} q.put("options",options); if(StringUtils.isBlank(text(q.get("stem")))) continue; result.add(save(user,null,q)); }
for (int r=headerIndex+1;r<=sheet.getLastRowNum();r++) { Row row=sheet.getRow(r); if (row==null) continue; Map<String,Object> q=new LinkedHashMap<>(); q.put("taskKey",taskKey); q.put("type", excelType(value(row, columns.get("题型"), formatter))); q.put("stem", value(row, columns.get("题干"), formatter)); q.put("answer", value(row, columns.get("正确答案"), formatter)); q.put("analysis", value(row, columns.get("答案解析"), formatter)); List<Map<String,Object>> options=new ArrayList<>(); for(char c='A';c<='H';c++){String v=value(row,columns.get("选项"+c),formatter); if(StringUtils.isNotBlank(v)) options.add(map("label",String.valueOf(c),"content",v));} q.put("options",options); if(StringUtils.isBlank(text(q.get("stem")))) continue; result.add(save(user,null,q)); }
if (result.isEmpty()) throw new IllegalArgumentException("Excel未读取到题目");
return result;
} catch (IllegalArgumentException e) { throw e; } catch (Exception e) { throw new IllegalArgumentException("Excel导入失败,请检查模板"); }
}

Loading…
Cancel
Save