springboot实现 将execl文件上传后 字段对应的存入MySQL数据库

  • demo结构
  • 新建一个数据库
  • maven中一般的插件就不说了主要要加上这几个 来实现读excel
  • 利用mybatis-generator自动生成dao层和User实体类以及mapper映射文件
  • 再附上一个辅助的类
  • 进入正题 开始编写service层
  • service接口实现类的编写
  • 这里读取excel内容用到的一个工具类 ExcelUtil 编写如下
  • 最后编写controller
  • 现在来试一下效果
  • 利用Postman上传该excel 文件
  • 查看数据库内数据


demo结构

最近项目需要下载一个excel模板 填入数据后上传 将模板内数据读入mysql 所以写了个小demo来验证技术是否可行

springbootlist存储数据库 springboot表单存入数据库_springboot


这个demo就是简单的实现将excel字段转存mysql 没有其他业务需求

新建一个数据库

一张表

springbootlist存储数据库 springboot表单存入数据库_springbootlist存储数据库_02


uid为主键 自增 都为非空

maven中一般的插件就不说了主要要加上这几个 来实现读excel

其余的就mysql jdbc等常规的 就不贴出来了

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

        <!--上传下载的包-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

利用mybatis-generator自动生成dao层和User实体类以及mapper映射文件

如果不会用 请看之前的博客
链接:

贴上User

package com.excel.entity;

import java.io.Serializable;

public class User implements Serializable {
    private Integer uid;

    private String username;

    private String password;

    private static final long serialVersionUID = 1L;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    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();
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", uid=").append(uid);
        sb.append(", username=").append(username);
        sb.append(", password=").append(password);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }
}

再附上一个辅助的类

package com.excel.entity;

import lombok.Data;

/**
 * @author: zty
 * @date 2019/9/5 下午12:19
 * des:用于存放excel的相关信息
 */
@Data
public class ReadExcel {
    //总行数
    private int totalRows = 0;
    //总条数
    private int totalCells = 0;
    //错误信息收集
    private String errorMsg;
}

进入正题 开始编写service层

package com.excel.service;

import com.excel.entity.User;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author: zty
 * @date 2019/9/5 下午12:01
 * des:
 */
public interface UserService {

    /**
     * 插入
     */
    int insert(User user);

    /**
     * 读取excel文件
     */
    String readExcelFile(MultipartFile file);
}

service接口实现类的编写

package com.excel.service.Impl;

import com.excel.dao.UserMapper;
import com.excel.entity.User;
import com.excel.service.UserService;
import com.excel.util.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author: zty
 * @date 2019/9/5 下午12:06
 * des:
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public int insert(User user) {
        return userMapper.insert(user);
    }

    /**
     * 文件导入
     * @param file
     * @return
     */
    @Override
    public String readExcelFile(MultipartFile file) {
        String result = "";
        ExcelUtil excelUtil = new ExcelUtil();
        List<User> ilist = excelUtil.getExcelInfo(file);
        if(ilist != null && !ilist.isEmpty()){
            //不为空 加入数据库
            for(User user :ilist){
                userMapper.insert(user);
            }
            result = "上传成功";
        }else{
            result = "上传失败";
        }
        return result;
    }
}

这里读取excel内容用到的一个工具类 ExcelUtil 编写如下

package com.excel.util;

import com.excel.entity.ReadExcel;
import com.excel.entity.User;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: zty
 * @date 2019/9/5 下午12:12
 * des:
 */
public class ExcelUtil {
    /**
     * 先创建一个实体类
     */
    ReadExcel readExcel = new ReadExcel();
    /**
     * 读取Excel文件,获取信息集合
     * @param mFile
     * @return
     */
    public List<User> getExcelInfo(MultipartFile mFile) {
        //获取文件名
        String fileName = mFile.getOriginalFilename();
        List<User> ilist = null;
        try {
            //验证文件名是否合格
            if(!validateExcel(fileName)){
                //不合格的话直接return
                return null;
            }
            //根据文件名判断是2003版本的还是2007版本的
            boolean isExcel2003 = true;
            if(isExcel2007(fileName)){
                isExcel2003 = false;
            }
            ilist= createExcel(mFile.getInputStream(), isExcel2003);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ilist;
    }
    /**
     * 判断是不是2003版本的excel
     * @param filePath
     * @return
     */
    public static boolean isExcel2003(String filePath){
        return filePath.matches("^.+\\.(?i)(xls)$");
    }
    /**
     * 判断是不是2007版本的excel
     * @param filePath
     * @return
     */
    public static boolean isExcel2007(String filePath){
        return filePath.matches("^.+\\.(?i)(xlsx)$");
    }
    /**
     * 判断是不是excel文件格式
     * @param filePath
     * @return
     */
    public boolean validateExcel(String filePath){
        if(filePath ==null||!(isExcel2003(filePath) || isExcel2007(filePath))){
            readExcel.setErrorMsg("文件名不是excel格式");
            return false;
        }
        return true;
    }
    /**
     * 读取excel里面的信息
     */
    public List<User> readExcelValue(Workbook wb){
        List<User> ilist=new ArrayList<>();
        //先得到一个sheet
        Sheet sheet = wb.getSheetAt(0);
        //得到excel里面的行数
        int totalRows = sheet.getPhysicalNumberOfRows();
        readExcel.setTotalRows(totalRows);
        //得到excel里面的列,前提是有行
        //大于1是因为我从第二行就是数据了,这个大家看情况而定
        if(totalRows >1 && sheet.getRow(0)!=null){
            int totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
            readExcel.setTotalCells(totalCells);
        }
        for (int r = 1 ; r < totalRows; r++){
            Row row = sheet.getRow(r);
            if(row == null){
                continue;//如果行为空的话直接中断
            }
            User user = new User();
            //循环xcel的列
            for(int c = 0; c<readExcel.getTotalCells() ; c++){
                Cell cell = row.getCell(c);
                if(cell != null){
                    //根据excel需要导入的列数来写
                    if(c == 0){
                        if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
                            //如果是纯数字,比如你写的是38,
                            //cell.getNumericCellValue()获得是38.0,
                            //通过截取字符串去掉.0获得25
                            String name = String.valueOf(cell.getNumericCellValue());
                            //截取如果length()-2为零了,就说明只有一位数,就直接截取0到1就行
                            user.setUsername(name.substring(0,name.length()-2>0?name.length()-2:1));
                        }else{
                            //如果不是纯数字可以直接获得名称
                            user.setUsername(cell.getStringCellValue());
                        }
                    }else if (c == 1){
                        if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
                            String firstDept = String.valueOf(cell.getNumericCellValue());
                            user.setPassword(firstDept.substring(0,firstDept.length()-2>0?firstDept.length()-2:1));
                        }else{
                            user.setPassword(cell.getStringCellValue());
                        }
                    }
                }
            }
            //最后将这些全部添加到ilist中
            ilist.add(user);
        }
        return ilist;
    }
    public List<User> createExcel(InputStream is , boolean isExcel2003){
        List<User> ilist = null;
        try {
            Workbook wb = null;
            if(isExcel2003){
                //如果是2003版本的就new一个2003的wb出来
                wb = new HSSFWorkbook(is);
            }else{
                //否则就new 一个2007版的出来
                wb = new XSSFWorkbook(is);

            }
            //再让wb去解析readExcelValue(Workbook wb)方法
            ilist = readExcelValue(wb);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ilist;
    }
}

注意判断excel版本

最后编写controller

package com.excel.controller;

import com.excel.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author: zty
 * @date 2019/9/5 下午1:08
 * des:
 */
@RestController
@RequestMapping(value = "/excel")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/upload")
    public String uploadExcel(@RequestParam(value = "file")MultipartFile file, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
        String result = userService.readExcelFile(file);
        return result;
    }
}

附上yml配置

springbootlist存储数据库 springboot表单存入数据库_spring_03


是基础的实现

现在来试一下效果

springbootlist存储数据库 springboot表单存入数据库_springboot_04


现在数据库里字段为空我们来编辑excel文件(注意第一排为提供的模板 需要根据该模板来填 第一排不读入数据库)

springbootlist存储数据库 springboot表单存入数据库_spring_05

利用Postman上传该excel 文件

post请求 利用form-data表单上传

springbootlist存储数据库 springboot表单存入数据库_User_06


回显示上传成功

springbootlist存储数据库 springboot表单存入数据库_List_07

查看数据库内数据

springbootlist存储数据库 springboot表单存入数据库_springboot_08


成功!