From 960de29bf77d8a6d0e091a28f9bdb2f517b9dd3e Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 9 Oct 2026 10:41:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Excel=E5=AF=BC=E5=85=A5=E8=A1=A8?= =?UTF-8?q?=E5=A4=B4=E5=AE=9A=E4=BD=8D=E6=94=B9=E4=B8=BA=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=89=AB=E6=8F=8F(=E5=AE=98=E6=96=B9=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=A0=87=E9=A2=98/=E8=AF=B4=E6=98=8E=E5=8D=A0=E5=89=8D?= =?UTF-8?q?=E4=B8=A4=E8=A1=8C=E5=AF=BC=E8=87=B4=E4=B8=80=E7=9B=B4=E5=AF=BC?= =?UTF-8?q?=E5=85=A50=E9=A2=98)=EF=BC=9B=E7=A9=BA=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=97=B6=E6=8A=A5Excel=E6=9C=AA=E8=AF=BB=E5=8F=96=E5=88=B0?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E8=80=8C=E9=9D=9E=E5=81=87=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PlatformQuestionBankService.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sztzjy/linkCommerce/service/PlatformQuestionBankService.java b/src/main/java/com/sztzjy/linkCommerce/service/PlatformQuestionBankService.java index 8b5e221..40ecfd9 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/PlatformQuestionBankService.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/PlatformQuestionBankService.java @@ -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 columns = new HashMap<>(); for (int i=0;i> result = new ArrayList<>(); - for (int r=1;r<=sheet.getLastRowNum();r++) { Row row=sheet.getRow(r); if (row==null) continue; Map 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> 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 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> 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导入失败,请检查模板"); } }