【Springboot+Vue】 Excel资料导入/上传(含前后端)

本案例为某后台管理系统信息导入模块,Excel格式是已知的(如,已知每列的数据类型,首行是表头)。

  • 前期准备:导入poi-x.x.x.jar等jar包,并添加到项目的lib中; 点此下载所需jar包
    相关阅读:IDEA如何添加库lib(java)

1.后台接口实现

主要工作:获取前端上传的文件流,进行解析;
处理流程:
1. 获取HSSFWorkbook对象,获取workbook表单的个数,进行遍历;
2. 对于每一个表单,先获取行数,进行遍历,第一行跳过;
3. 单元格的格式有多种,需在不同的switch分支中进行处理;(代码27-54行)
4. 最后讲遍历得到的员工数据集合返回。

public static Listexcel2Supplier(MultipartFile file) {
    List list =new ArrayList<>();
    Supplier supplier =null;
    try {
        //1. 创建一个 workbook 对象
        HSSFWorkbook workbook =new HSSFWorkbook(file.getInputStream());
        //2. 获取 workbook 中表单的数量
        int numberOfSheets = workbook.getNumberOfSheets();
        for (int i =0; i < numberOfSheets; i++) {
            //3. 获取表单
            HSSFSheet sheet = workbook.getSheetAt(i);
            //4. 获取表单中的行数
            int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
            for (int j =0; j < physicalNumberOfRows; j++) {
                //5. 跳过标题行
                if (j ==0) {
                        continue;//跳过标题行
                }
                //6. 获取行
                HSSFRow row = sheet.getRow(j);
                if (row ==null) {
                    continue;//防止数据中间有空行
                }
                //7. 获取列数
                int physicalNumberOfCells = row.getPhysicalNumberOfCells();
                supplier =new Supplier();
                for (int k =0; k < physicalNumberOfCells; k++) {
                    HSSFCell cell = row.getCell(k);
                    //按照每一列的不同类型 获取数据
                    switch (cell.getCellType()) {   
                        //如果是String类型
                        case STRING:    
                            String cellValue = cell.getStringCellValue();
                            switch (k) {//看它是第几列的内容
                                case 1:
                                    supplier.setSupplier_code(cellValue);
                                    break;
                                //省略其他的 case
                            }
                            break;
                        default: {
                            switch (k) {
                                //不同类型的获取函数不同:
                                //日期类型:getDateCellValue()
                                //数字类型:getNumericCellValue(),返回double值
                                case 18:
                                    supplier.setStatus((int) cell.getNumericCellValue());
                                    break;
                                //省略其他的 case
                            }
                        }
                        break;
                    }
                }
                list.add(supplier);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    //返回搜集好数据的List
    return list;
}

在数据导入接口中调用上述方法

  • 代码流程:获取数据集合,插入数据库,代码如下:
//上传Excel请求
@PostMapping("/ImportSup")
public void importSup(MultipartFile file){
    //获取数据集合
    List suppliers = ExceLIO.excel2Supplier(file);
    //插入数据库
    supplierService.addSuppliers(suppliers);
}

保存数据集合

  • 上述代码中调用的Service层函数addSuppliers() ,将数据集合插入数据库;
  • 实现方法:循环单条逐一插入,调用插入一条数据的函数addSup() ;
    //添加多条信息(Excel导入)
    public void addSuppliers(List suppliers) {
        Integer num = suppliers.size();
        for(Integer i=0 ; i

2.前端实现

  • 直接采用 Element 的文件上传控件,代码如下:


    
        导入
    

其中,accept为接收文件类型;action为上传接口;
data中定义 actionup : this.HOST + "/ImportSup" ,解决了跨域访问的问题。

相关回调函数如下:

    beforeUpload() {
        this.importDataBtnText = '正在导入';
        this.importDataBtnIcon = 'el-icon-loading';
        this.importDataDisabled = true;
      },
      onError(err, file, fileList) {
        this.importDataBtnText = '导入数据';
        this.importDataBtnIcon = 'el-icon-upload2';
        this.importDataDisabled = false;
      },
      onSuccess(response, file, fileList) {
        this.importDataBtnText = '导入数据';
        this.importDataBtnIcon = 'el-icon-upload2';
        this.importDataDisabled = false;
        this.initEmps();
      }

以上完整的实现了“Springboot+Vue后台管理系统”的Excel资料导入功能,这一过程中常遇到的BUG及解决方案请移步阅读:
Springboot上传文件报错:java.lang.NullPointerException
如果有其他问题,欢迎留言讨论~

你可能感兴趣的:(【Springboot+Vue】 Excel资料导入/上传(含前后端))