[Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地

作者:天海奈奈

眼过千遍不如手锤一遍:推荐一款模拟面试,斩获大厂 o f f e r ,程序员的必备刷题平台 − − 牛客网 

点击开始刷题之旅

目录

前言

成果展示

了解Excel表格基本属性

表设计

引入依赖 

工具类

Controller

entity

Mapper

UserService

测试

总结


前言

  当我们给数据库中的表中添加数据时一般都是进入图形化界面进行手动添加,或者进直接导入现成的sql文件,但是有的时候我们会需要去导入大量的数据,这个时候我们不论是使用写好的接口还是去图形化界面添加都是十分费时费力的,这个时候使用Excel读取表格数据并进行导入就十分有必要了。本篇更着重于单个功能的开发,不会从头构建一个项目。

成果展示

[Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地_第1张图片

 只是为了证明功能正常运行所以并没有加太多

了解Excel表格基本属性

workbook :一整个表格文件  

一个文件中有多个sheet

row 是 行

cell是一个单元格

[Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地_第2张图片

 这是打开了一个表跟文件,可以看出是可以有多个Sheet的,知道这几点也就够用了

表设计

这里使用的是我之前的用户表。

[Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地_第3张图片

字段比较多我们只取关注2~4 也就是用户名,密码,个性签名.id是自增的我们导入数据也不会去有用户id这一项。这三个都是varchar类型,一会儿传入时转成String类型就行,如果是int的话我们需要先转成Double再使用intValue即可。

引入依赖 


        
            org.apache.poi
            poi
            3.16
        
        
            org.apache.poi
            poi-ooxml
            3.16
        

工具类

public class ExcelUtil {
    public static  Object getCellValue(Cell cell){
        switch (cell.getCellTypeEnum()){
            //字符串
            case STRING:
                return cell.getStringCellValue();
            //布尔
            case BOOLEAN:
                return cell.getBooleanCellValue();
            //数值
            case NUMERIC:
                return cell.getNumericCellValue();
        }
        return null;
    }
}

Controller

 @PostMapping("/send/upload")
    @ResponseBody
    public ApiRestResponse uploadUser(@RequestParam("file")MultipartFile multipartFile) throws IOException {
                //获取文件名
                String fileName = multipartFile.getOriginalFilename();
                String fixName = fileName.substring(fileName.lastIndexOf("."));
                //生成唯一UUID
                UUID uuid = UUID.randomUUID();
                String newFileName = uuid.toString() + fixName;
                //创建文件
                File file = new File(Constant.FILE_UPLOAD_DIR);
                File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);
                if(!file.exists()){
                    if(!file.mkdir()){
                        throw new XatuMallException(0000000,"文件创建失败");
                    }
                }
                try {
                    multipartFile.transferTo(destFile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                userService.addUserList(destFile);
                return ApiRestResponse.success();
    }

这里注意,我们这个文件地址是需要配置的,并不是写一个路径就行。Springboot图片上传_天海奈奈的博客-CSDN博客_springboot 图片上传

配置方法这里有说,但是要记得还要在appli那个配置文件里加一行 

file.upload.dir=D:/pictures/ 每个人不一样,但是这与你contant类里的地址是绑定的

entity

public class User {
    private Integer id;

    private String username;

    private String password;

    private String personalizedSignature;

    private Integer role;

    private Date createTime;

    private Date updateTime;

    private String emailAddress;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public String getPersonalizedSignature() {
        return personalizedSignature;
    }

    public void setPersonalizedSignature(String personalizedSignature) {
        this.personalizedSignature = personalizedSignature == null ? null : personalizedSignature.trim();
    }

    public Integer getRole() {
        return role;
    }

    public void setRole(Integer role) {
        this.role = role;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress == null ? null : emailAddress.trim();
    }
}


Mapper

public interface UserMapper {
  

    User selectByName(String username);


}

 xml

  

理解原理就好,不要去纠结表名。

UserService

Imp

 @Override
    public void addUserList(File destFile) throws IOException {
        List users = readUsersFromExcel(destFile);
        for (int i = 0; i < users.size(); i++){
            User user = users.get(i);
            User userOld = userMapper.selectByName(user.getUsername());
            if(userOld != null){
                System.out.println("重名");
            }
            int count = userMapper.insertSelective(user);
            if(count == 0){
                System.out.println("添加失败");
            }
        }

    }
    private List readUsersFromExcel(File excelFile) throws IOException {
        ArrayList listUser =new ArrayList<>();
        FileInputStream fileInputStream = new FileInputStream(excelFile);

        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
        XSSFSheet firstSheet = xssfWorkbook.getSheetAt(0);
        Iterator iterator = firstSheet.iterator();
        while(iterator.hasNext()){
            org.apache.poi.ss.usermodel.Row nextRow = iterator.next();
            Iterator cellIterator = nextRow.cellIterator();
            User aUser = new User();

            while(cellIterator.hasNext()){
                Cell nextCell = cellIterator.next();
                int columnIndex = nextCell.getColumnIndex();
                switch (columnIndex){
                    case 0:
                        aUser.setUsername((String) ExcelUtil.getCellValue(nextCell));
                        break;
                    case 1:
                        aUser.setPassword((String) ExcelUtil.getCellValue(nextCell));
                        break;
                    case 2:
                        aUser.setPersonalizedSignature((String) ExcelUtil.getCellValue(nextCell));
                        break;


                }
            }
            listUser.add(aUser);
        }
        xssfWorkbook.close();
        fileInputStream.close();
        return listUser;

    }

重名那里偷懒了,按理说应该抛出异常的。

   void addUserList(File destFile) throws IOException;

测试

打开postman  这里需要注意的地方是我们是postMapping 并且

 [Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地_第4张图片

选择的是Body 和form-data 

 [Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地_第5张图片

后面就能去选择我么要读取的表格文件了,但是我们读取的是xlsx xls是不能读的,你改后缀也是不行的,要建立时就是xlsx。

总结

  这个技术也是很实用的技术,让我们可以很便捷的快速从表格中读取数据并将数据上传。文件保存到本地可以去看放的链接,实际上与上传图片是一样的。

你可能感兴趣的:(Spring,boot,spring,boot,java,后端)