使用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(); }
- 查詢數據庫的所有數據到一個集合useList中
- 設置輸出流
- 調用EasyExcel中的write方法就會返回一個excel表格
- 給實體類使用註解標註實體類每一個成員變量所對應的表頭(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!
推薦閱讀:
- SpringBoot整合EasyExcel進行大數據處理的方法詳解
- Java 中EasyExcel的使用方式
- Java+EasyExcel實現文件的導入導出
- SpringBoot集成EasyExcel的步驟
- SpringBoot整合EasyExcel的完整過程記錄