0

如何使用 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 名称

4

0 回答 0