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

🍳作者:天海奈奈

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

👉🏻点击开始刷题之旅

目录

 

前言

成果展示

了解Excel表格基本属性

表设计

引入依赖 

工具类

Controller

entity

Mapper

UserService

测试

总结


 

前言

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

成果展示

2ace001edb2a4c7796a833e695aa75d4.gif

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

了解Excel表格基本属性

workbook :一整个表格文件  

一个文件中有多个sheet

row 是 行

cell是一个单元格

46fe129d1e874e0ba68f190589aad174.png

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

表设计

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

bacfa4d49dc04d03814300e39d0fa666.png

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

引入依赖 

<!--        表格处理-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
        </dependency>

工具类

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

  <select id="selectByName" parameterType="java.lang.String" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"></include>
    from xatu_mall_user
    where username = #{username,jdbcType=VARCHAR}
  </select>

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

UserService

Imp

 @Override
    public void addUserList(File destFile) throws IOException {
        List<User> 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<User> readUsersFromExcel(File excelFile) throws IOException {
        ArrayList<User> listUser =new ArrayList<>();
        FileInputStream fileInputStream = new FileInputStream(excelFile);

        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
        XSSFSheet firstSheet = xssfWorkbook.getSheetAt(0);
        Iterator<Row> iterator = firstSheet.iterator();
        while(iterator.hasNext()){
            org.apache.poi.ss.usermodel.Row nextRow = iterator.next();
            Iterator<Cell> 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 并且

 ae7509e803c14f72a7ec0f5ad75f486b.png

选择的是Body 和form-data 

 51f991c6b73049aaae93adefe2a856c9.png

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

总结

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

 

  • 41
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天海奈奈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值