问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SpringBoot解析前端上传的Excel文件并导入数据库

创作时间:
作者:
@小白创作中心

SpringBoot解析前端上传的Excel文件并导入数据库

引用
CSDN
1.
https://blog.csdn.net/haduwi/article/details/111292886

一、准备工作

在开始解析Excel文件之前,需要在项目的pom.xml文件中添加Apache POI的相关依赖,以便能够解析Excel文件。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.1</version>
</dependency>

此外,还需要准备一份Excel模板和相应的SQL数据库表。

二、优化点

为了提高代码的复用性和灵活性,将ExcelUtil工具类定义为泛型类。这样,ExcelUtil就可以解析任何Excel文件,并将其封装到相应的实体类中,最后将数据插入数据库。这种设计使得一个解析工具可以多次复用。

三、代码实现

1. Controller层

在Controller层,通过@PostMapping注解处理文件上传请求。使用MultipartFile接收上传的文件,并调用Service层的方法进行解析和导入数据库。

@PostMapping("/uploadExcel")
public Msg uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
    String fileName = file.getOriginalFilename(); // 获取文件名
    InputStream is = null;
    try {
        is = file.getInputStream();
        List<Map> studentList = studentService.getListByExcel(is, fileName); // 获取解析后的List集合
        Boolean result = studentService.batchImportStuInfo(studentList); // 把数据插入数据库
        if (result) {
            return Msg.success().add("info", "文件上传成功!");
        } else {
            return Msg.failure().add("info", "文件上传失败!");
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        is.close();
    }
    return Msg.failure().add("info", "文件错误!");
}

2. Service层

在Service层,定义了两个主要方法:getListByExcel用于解析Excel文件,batchImportStuInfo用于批量导入数据到数据库。

public List<Map> getListByExcel(InputStream is, String fileName) throws IOException {
    try {
        List<Map> studentList = new ExcelUtil<>(new Student()).AnalysisExcel(is, fileName);
        return studentList;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return new ArrayList<>();
}

public Boolean batchImportStuInfo(List<Map> list) {
    Integer flag = studentMapper.batchImportStuInfo(list);
    if (flag > 0) {
        return true;
    } else return false;
}

3. Mapper层

Mapper层定义了一个接口,用于批量导入学生信息。

@Repository
@Mapper
public interface StudentMapper {
    // 批量导入学生信息
    Integer batchImportStuInfo(List<Map> studentList);
}

4. ExcelUtil工具类

ExcelUtil工具类是整个实现的核心,它使用泛型来解析Excel文件并将其封装到指定的实体类中。

public class ExcelUtil<T> {
    private T t;

    public ExcelUtil(T t) {
        this.t = t;
    }

    public List<Map> AnalysisExcel(InputStream is, String fileName) throws IOException {
        List<Map> list = new ArrayList<>();
        Workbook workbook = createWorkbookByExcelType(is, fileName); // 创建工作簿
        Sheet sheet = workbook.getSheetAt(0);
        Row row = null;
        int maxRowNum = sheet.getLastRowNum();
        row = sheet.getRow(0);
        int maxColNum = row.getLastCellNum();
        List<String> arrayList = new ArrayList<>();
        Field[] declaredFields = t.getClass().getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            String name = declaredFields[i].getName();
            arrayList.add(name);
        }
        for (int i = 0; i <= maxRowNum; i++) {
            Map<String, String> map = new HashMap<>();
            row = sheet.getRow(i);
            if (row != null) {
                for (int j = 0; j < maxColNum; j++) {
                    String cellData = (String) getCellFormatValue(row.getCell(j));
                    map.put(arrayList.get(j), cellData);
                }
                list.add(map);
            }
        }
        return list;
    }

    public static Workbook createWorkbookByExcelType(InputStream inputStream, String fileName) {
        Workbook wb = null;
        if (fileName == null) {
            return null;
        }
        String extString = fileName.substring(fileName.lastIndexOf("."));
        InputStream is = null;
        try {
            is = inputStream;
            if (".xls".equals(extString)) {
                return wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(extString)) {
                return wb = new XSSFWorkbook(is);
            } else {
                return wb = null;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return wb;
    }

    public static Object getCellFormatValue(Cell cell) {
        Object cellValue = null;
        if (cell != null) {
            switch (cell.getCellType()) {
                case NUMERIC:
                    cellValue = String.valueOf(cell.getNumericCellValue());
                    break;
                case FORMULA:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        cellValue = cell.getDateCellValue();
                    } else {
                        cellValue = String.valueOf(cell.getNumericCellValue());
                    }
                    break;
                case STRING:
                    cellValue = cell.getRichStringCellValue().getString();
                    break;
                default:
                    cellValue = "";
            }
        } else {
            cellValue = "";
        }
        return cellValue;
    }
}

5. Mapper.xml映射文件

在Mapper.xml文件中,定义了批量插入数据的SQL语句。

<insert id="batchImportStuInfo" parameterType="java.util.List">
    insert into student values
    <foreach item="item" collection="list" separator=",">
        (
        #{item.id},
        #{item.stuName},
        #{item.sex},
        #{item.cardId},
        #{item.stuId},
        #{item.political},
        #{item.major},
        #{item.classGrade},
        #{item.tel},
        #{item.stuStatus}
        #{item.city}
        )
    </foreach>
</insert>

6. application.yml配置文件

在application.yml文件中,配置了文件上传的大小限制。

spring:
  servlet:
    multipart:
      max-file-size: 1000MB
      max-request-size: 1000MB

四、代码分析

MultipartFile是Spring框架下的一个类,主要用于处理文件上传功能。它允许以表单的形式上传文件,是Spring项目中处理文件上传的常用方式。

五、效果展示

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号