使用SpringBoot+EasyExcel+Vue實現excel表格的導入和導出詳解

一、導入和導出

導入:通過解析excel表格中的數據,然後將數據放到一個集合中,接著通過對持久層操作,將數據插入到數據庫中,再加載一下頁面,從而實現瞭數據的導入

導出:導出也是直接對數據庫進行操作,獲取數據庫中所有的數據,將其存儲在一個集中,接著使用查詢出來的的數據生成一個excel表格

其中導入和導出的功能實現都是基於EasyExcel實現的

EasyExcel是阿裡巴巴開源的一個基於Java的簡單、省內存的讀寫Excel的開源項目

EasyExcel官方文檔:https://www.yuque.com/easyexcel/doc/easyexcel

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.0-beta2</version>
        </dependency>

二、導出數據為excel實現過程

    @GetMapping("/down")
    public Result down(HttpServletResponse response) throws IOException {
        List<User> userList = userMapper.selectList(null);
        System.out.println(userList);
        //返回輸出流_excel格式
        response.setContentType("application/octet-stream");
        String fileName = URLEncoder.encode("用戶信息表", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), User.class).autoCloseStream(Boolean.FALSE).sheet("用戶信息表").doWrite(userList);
        // ExcelUtil.writerExcel(response, userList);
        return Result.success();
    }
  1. 查詢數據庫的所有數據到一個集合useList中
  2. 設置輸出流
  3. 調用EasyExcel中的write方法就會返回一個excel表格
  4. 給實體類使用註解標註實體類每一個成員變量所對應的表頭(value為表頭名稱,index為表頭位置)
package com.kang.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@TableName("user")
@NoArgsConstructor
@EqualsAndHashCode
public class User {
    /**
     * id自增
     */
    @TableId(type = IdType.AUTO)
    @ExcelProperty(value = "ID", index = 0)
    private Integer id;
    @ExcelProperty(value = "用戶名", index = 1)
    private String username;
    @ExcelProperty(value = "密碼", index = 2)
    private String password;
    /**
     * 數據庫中的nick_name會自動轉換為駝峰
     */
    @ExcelProperty(value = "昵稱", index = 3)
    private String nickName;
    @ExcelProperty(value = "年齡", index = 4)
    private Integer age;
    @ExcelProperty(value = "性別", index = 5)
    private String sex;
    @ExcelProperty(value = "住址", index = 6)
    private String address;
}

當瀏覽器訪問這個前端控制器的映射地址的時候,就會自動下載這樣的一個excel文件

因此,在前端隻需要給按鈕添加一個點擊事件,當點擊這個按鈕的時候,就訪問前端控制器,從而實現導出功能

download(){
      window.location.href='http://localhost:9090/excel/down';
      this.$message.success("導出成功");
    },

三、將excel中的數據導入到數據庫中

導出功能需要用的一個文件上傳的組件,這裡用的是vue3組件庫中element-plus提供的el-upload組件

      <el-upload
          class="upload-demo"
          multiple=""
          method="post"
          action="api/excel/updown"
          style="margin-left: 10px"
          accept=".xlsx,.xls"
          :show-file-list="false"
          :on-success="success"
          name="files"
      >
        <el-button type="primary">導入</el-button>
      </el-upload>

當前比較重要的一個屬性就是action,這裡action所對應的是前端控制器的映射地址,也就是說選擇文件會傳送到地址對應的前端控制器,前端控制就可以獲取這個文件

    @PostMapping("/updown")
    public Result  upload(@RequestParam("files") MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), User.class, new DataListener(userMapper)).sheet().doRead();
        return Result.success();
    }

然後通過EasyExcel的read方法實現對excel的讀取功能

在read方法中需要提供一個監視器

public class DataListener extends AnalysisEventListener<User> {
    /**
     * 每隔5條存儲數據庫,實際使用中可以100條,然後清理list ,方便內存回收
     */
    private static final int BATCH_COUNT = 100;
    private UserMapper userMapper;
    public DataListener(UserMapper userMapper){
        this.userMapper = userMapper;
    }
    List<User> list = new ArrayList<User>();
    //讀取數據會執行這方法
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        System.out.println(JSON.toJSONString(user));
        list.add(user);
        System.out.println(list);
        if (list.size() >= BATCH_COUNT){
            list.clear();
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        System.out.println("所有數據解析完成");
    }
    private void saveData(){
        System.out.println(this.userMapper);
        System.out.println("{" + list.size() + "}條數據,開始存儲數據庫" );
        for (User user : list) {
            userMapper.insert(user);
        }
        System.out.println("存儲數據庫成功");
    }
}

註意:這個數據監聽器不可以被springboot所代理,需要人工new出來,因此裡面寫瞭一個構造方法,用dao層作為參數創建,在new的時候將這個dao層的相對於的類作為構造參數,從而使得監聽器可以完成對持久層的操作

到此這篇關於使用SpringBoot+EasyExcel+Vue實現excel表格的導入和導出詳解的文章就介紹到這瞭,更多相關Springboot excel導入導出數據內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: