如何使用 Excel 上传将多条记录插入数据库?
在处理项目时,我需要上传一个 Excel 文件,假设每张纸的记录数高达 50000 条。但是在上传 Excel 文件时,需要进行某些验证,如果任何记录失败,则需要在页面上的 Excel 相应行显示错误消息,并且不需要保存任何记录在数据库表里面。
验证可以是任何意义上的,例如:
- 所有员工的年龄必须 >= 18 且 <= 60
- 年龄列不应包含非数字值
- 某些列是强制性的,如果 Excel 的该列中未填写该值,则应将错误通知用户。像 Employee 的名字不应该为空。
- 检查日期值是否为 DD/MM/YYYY 等格式
上传此 Excel 文件时,如果成功满足前面的验证,则需要根据特定批次 id 将数据保存在数据库中,该批次 id 基本上是一个唯一编号,用于标识该特定批次中插入的记录以及它们何时全部插入。此外,需要特别注意我们提供给用户用于数据输入目的的 Excel 列标题。假设 Excel 中有 10 列,如果用户更改 Excel 列标题的顺序,或者如果他们删除某些列或更改列名称,则还需要对上传的文件执行此验证。
为了执行此验证,我们使用了一个ExcelStructure
表格,该表格将存储 Excel 字段/列及其各自的大小、类型、参数,以及这些字段/列是否是必需的。下面是ExcelStructure
表的结构。请记住,我们正在使用具有代码优先方法的实体框架。但仅出于演示/查看目的,我们的 SQL 表将具有以下查询。
如果我在spring boot中上传excel,请有人帮忙,excel中的列名与数据库列名匹配,然后在spring boot中保存数据库中的值
public static List<Hday> excelToDatabase(InputStream inputStream) {
try {
//Workbook workbook = new XSSFWorkbook(inputStream);
Workbook workbook =WorkbookFactory.create(inputStream);
System.out.println("workbook : " + workbook);
Sheet sheet = workbook.getSheetAt(0);
System.out.println("sheet : " + sheet);
Iterator<Row> rows = sheet.iterator();
List<Hday> hdayList = new ArrayList<Hday>();
int rowNumber = 0;
while (rows.hasNext()) {
Row currentRow = rows.next();
// skip header
if (rowNumber == 0) {
rowNumber++;
continue;
}
Iterator<Cell> cellsInRow = currentRow.iterator();
Hday refhd = new Hday();
int idx = 0;
while (cellsInRow.hasNext()) {
Cell cells = cellsInRow.next();
switch (idx) {
case 0:
if (cells .getCellType() == CellType.STRING) {
String inId = cells .getStringCellValue();
refhd.Id(Long.parseLong(inId));
} else {
refhd.setinId((long) cells .getNumericCellValue());
}
break;
case 1:
if (cells .getCellType() == CellType.NUMERIC) {
long week = (long) cells .getNumericCellValue();
refhd.setWeek(Long.toString(week));
} else {
refhd.setWeek(cells .getStringCellValue());
}
break;
case 2:
if (cells .getCellType() == CellType.STRING) {
String temphdDate = cells .getStringCellValue();
Date hdayDate;
try {
hdayDate = new SimpleDateFormat("dd/MM/yyyy").parse(temphdDate);
} catch (ParseException e) {
throw new BadRequestException(e.toString());
}
refhd.setHolidayDate(hdayDate);
} else {
refhd.setHolidayDate(cells .getDateCellValue());
}
break;
case 3:
if (cells .getCellType() == CellType.STRING) {
refhd.setHolidayName(cells .getStringCellValue());
} else {
throw new BadRequestException("Cell Value Is Not a String");
}
break;
default:
break;
}
idx++;
}
hdayList.add(refhd);
}
workbook.close();
return hdayList;
} catch (IOException e) {
throw new RuntimeException("fail to parse Excel file: " + e.getMessage());
}
}
无论我用作 Excel 列名 -> 相同的代码顺序
或者,我使用了错误的订单列名称,但该值会正确,但数据库会存储错误的订单,这就是问题所在
Excel
id week date HolidayName
1 1st week 5/10/2021
相同的订单保存到数据库
这是数据库中案例的输出
id week date HolidayName
1 1stweek 5/10/2021 null
再次我的输入
id date
1 6/10/2021
我收到类似单元格值不是字符串的错误
所以我想要数据库中的输出
id week date HolidayName
1 null 6/10/2021 null
我想要与 excel col 名称匹配的内容匹配数据库 col 名称