SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出的方法詳解
前言
Hello~ ,前后端分離系列和大家見(jiàn)面了,秉著能夠?qū)W到知識(shí),學(xué)會(huì)知識(shí),學(xué)懂知識(shí)的理念去學(xué)習(xí),深入理解技術(shù)!
項(xiàng)目開(kāi)發(fā)過(guò)程中,很大的需求都有 導(dǎo)入導(dǎo)出功能,我們依照此功能,來(lái)實(shí)現(xiàn)并還原真實(shí)企業(yè)開(kāi)發(fā)中的實(shí)現(xiàn)思路
一、為什么做導(dǎo)入導(dǎo)出
為什么做導(dǎo)入導(dǎo)出
導(dǎo)入
在項(xiàng)目開(kāi)發(fā)過(guò)程中,總會(huì)有一些統(tǒng)一的操作,例如插入數(shù)據(jù),系統(tǒng)支持單個(gè)插入數(shù)據(jù)效率太慢了,為此,我們可以將數(shù)據(jù)寫(xiě)入Excel中,系統(tǒng)提供導(dǎo)入功能進(jìn)行批量添加數(shù)據(jù),實(shí)現(xiàn)了數(shù)據(jù)的統(tǒng)一覆蓋,快捷操作!
導(dǎo)出
導(dǎo)出功能,實(shí)現(xiàn)了我們的Excel表數(shù)據(jù)查看,輸出為Excel表格后,我們可以很方便快捷的查看數(shù)據(jù),以及隨時(shí)修改數(shù)據(jù),達(dá)到了可視化的效果!
總之,導(dǎo)入導(dǎo)出是為了方便系統(tǒng)的操作,提升用戶體驗(yàn)而開(kāi)發(fā)的一個(gè)功能,目前絕大項(xiàng)目中,均會(huì)有導(dǎo)入導(dǎo)出的身影存在,可見(jiàn)導(dǎo)入導(dǎo)出的重要性!
二、什么是 EasyPOI
EasyPoi功能如同名字easy,主打的功能就是容易,讓一個(gè)沒(méi)見(jiàn)接觸過(guò)poi的人員就可以方便的寫(xiě)出Excel導(dǎo)出,Excel模板導(dǎo)出,Excel導(dǎo)入,Word模板導(dǎo)出,通過(guò)簡(jiǎn)單的注解和模板語(yǔ)言(熟悉的表達(dá)式語(yǔ)法),完成以前復(fù)雜的寫(xiě)法。
EasyPOI 官方最新 文檔:http://easypoi.mydoc.io/
EasyPOI 主要功能
- 基于注解的導(dǎo)入導(dǎo)出,修改注解就可以修改Excel
- 支持常用的樣式自定義
- 基于map可以靈活定義的表頭字段
- 支持一對(duì)多的導(dǎo)出,導(dǎo)入
- 支持模板的導(dǎo)出,一些常見(jiàn)的標(biāo)簽,自定義標(biāo)簽
- 支持HTML/Excel轉(zhuǎn)換,如果模板還不能滿足用戶的變態(tài)需求,請(qǐng)用這個(gè)功能
- 支持word的導(dǎo)出,支持圖片,Excel
EasyPOI 的特點(diǎn)
- 設(shè)計(jì)精巧,使用簡(jiǎn)單
- 接口豐富,擴(kuò)展簡(jiǎn)
- 單默認(rèn)值多,write less do more
- spring mvc支持,web導(dǎo)出可以簡(jiǎn)單明了
總而言之:EasyPOI 一個(gè)字 Easy !
三、項(xiàng)目簡(jiǎn)介
項(xiàng)目需求
本項(xiàng)目要求使用 Spring Boot + Vue 完成前后端分離開(kāi)發(fā),具體需求如下:
- 組件庫(kù)采用 ElementUI、持久化層 MyBatis、數(shù)據(jù)庫(kù) 采用 MySQL8.0
- 完成用戶列表的 增加,多條件查詢、分頁(yè)
- 提供用戶列表的導(dǎo)入功能,要求導(dǎo)入成功后 持久化到數(shù)據(jù)庫(kù)
- 提供用戶列表的導(dǎo)出功能,要求前端可下載導(dǎo)出的Excel列表
- 具體導(dǎo)入導(dǎo)出 使用 EasyPOI實(shí)現(xiàn),完成開(kāi)發(fā)
- 整體編碼規(guī)范采用 Alibaba 開(kāi)發(fā)手冊(cè)規(guī)范
嚴(yán)格根據(jù)需求進(jìn)行功能開(kāi)發(fā)!
效果圖

開(kāi)發(fā)環(huán)境
項(xiàng)目結(jié)構(gòu)

目錄介紹:
common: 公共類(lèi)層,主要放置共有的類(lèi),提高開(kāi)發(fā)效率,減少不必要的重復(fù)性開(kāi)發(fā)
config:配置中心層,主要放置 全局的配置信息等
dto:前端頁(yè)面展示對(duì)象,傳輸對(duì)象層
entity:實(shí)體類(lèi)層,與數(shù)據(jù)庫(kù)一 一對(duì)應(yīng)
其它為MVC三層架構(gòu)層。
核心Pom 依賴(lài)
<!-- Easy POI-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.2.0</version>
</dependency>
重新加載Maven 依賴(lài)即可。
四、實(shí)戰(zhàn)開(kāi)發(fā) 核心源碼
需求分析
項(xiàng)目已經(jīng)搭建完畢,接下來(lái)進(jìn)入開(kāi)發(fā),主要的就是導(dǎo)入導(dǎo)出具體功能的實(shí)現(xiàn)
思路:
導(dǎo)入功能,首先新建Excel對(duì)應(yīng)實(shí)體類(lèi),映射具體列,controller層編寫(xiě)具體映射文件類(lèi), 調(diào)用內(nèi)置方法完成讀取 Excel文件并映射為具體類(lèi)集合,再將該集合轉(zhuǎn)為DTO,批量存入數(shù)據(jù)庫(kù),完成導(dǎo)入操作
導(dǎo)出功能,controller層編寫(xiě)方法并聲明reponse響應(yīng)類(lèi),調(diào)用內(nèi)置方法完成文件的讀取并存入 對(duì)應(yīng)集合,瀏覽器即可得到響應(yīng)消息,完成下載文件。(瀏覽器訪問(wèn)通過(guò) window.open 或者Nginx轉(zhuǎn)發(fā) 實(shí)現(xiàn)下載功能)
直接上代碼!
前端頁(yè)面
導(dǎo)入具體實(shí)現(xiàn)
<template>
<div class="el-form-item__label">
<el-upload
class="upload-demo"
:action="importUrl"
:on-success="uploadSuccess"
accept=".xlsx"
:show-file-list="false"
multiple
:limit="3"
:on-exceed="handleExceed"
>
<el-button type="success" plain icon="el-icon-download" size="small">導(dǎo)入</el-button>
</el-upload>
</div>
</template>
data() {
return {
importUrl: this.settings.apiUrl+'/sys/user/import_excel',
};
},
導(dǎo)出具體實(shí)現(xiàn)
<template>
<div class="el-form-item__label">
<el-button type="warning" size="small" plain icon="el-icon-upload2" @click="exportExcel">導(dǎo)出</el-button>
</div>
</template>
methods: {
exportExcel() {
window.open(this.settings.apiUrl + "/sys/user/export_excel")
}
}
前端代碼完成編寫(xiě),全部源碼 請(qǐng)看文末,源碼地址
后端核心實(shí)現(xiàn)
實(shí)體類(lèi) SysUserExcel
package com.chen.excel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import java.util.Date;
/**
* Excel 類(lèi),主要用于映射excel表
* @author whc
*/
@Data
public class SysUserExcel {
@Excel(name = "序號(hào)", orderNum = "0", format = "isAddIndex")
private Integer index = 1;
@Excel(name = "用戶賬號(hào)")
private String username;
@Excel(name = "真實(shí)姓名")
private String realName;
@Excel(name = "性別", replace = {"男_1", "女_2"})
private Integer gender;
@Excel(name = "電子郵箱", width = 25)
private String email;
@Excel(name = "手機(jī)號(hào)碼")
private String mobile;
@Excel(name = "創(chuàng)建時(shí)間", format = "yyyy-MM-dd", width = 15)
private Date createTime;
}
導(dǎo)入功能具體實(shí)現(xiàn)
導(dǎo)入功能 contorller 層
@PostMapping("import_excel")
public ResultBean<Integer> import_excel(MultipartFile file) {
ResultBean<Integer> res = sysUserService.importExcel(file);
return res;
}
導(dǎo)入功能 service 層
@Override
public ResultBean<Integer> importExcel(MultipartFile file) {
ImportParams importParams = new ImportParams();
//標(biāo)題行設(shè)置為1行,默認(rèn)是0,可以不設(shè)置;依實(shí)際情況設(shè)置。
importParams.setTitleRows(1);
// 表頭設(shè)置為1行
importParams.setHeadRows(1);
try {
//讀取excel
List<SysUserExcel> sysUserExcelList = ExcelImportUtil.importExcel(file.getInputStream(), SysUserExcel.class, importParams);
batchInsert(sysUserExcelList);
return ResultBean.create(0, "success");
} catch (Exception e) {
log.error("導(dǎo)入 Excel 異常! e ==> {}", e);
return ResultBean.create(10, "導(dǎo)入excel 異常!"+e.getMessage());
}
}
public void batchInsert(List<SysUserExcel> param) throws Exception{
//轉(zhuǎn)換為dto集合
List<SysUserDTO> sysUserDTOList = BeanUtil.copyToList(param, SysUserDTO.class);
//轉(zhuǎn)換集合
List<SysUserDTO> userDTOList = new ArrayList<>();
for (SysUserDTO sysUserDTO : sysUserDTOList) {
if (!StringUtils.isEmpty(sysUserDTO.getUsername())) {
sysUserDTO.setPassword("123");
userDTOList.add(sysUserDTO);
}
}
//批量插入數(shù)據(jù)庫(kù)
sysUserMapper.batchInsert(userDTOList);
}導(dǎo)入功能 mapper層
Integer batchInsert(@Param("list") List<SysUserDTO> param);
導(dǎo)入功能 mapper 對(duì)應(yīng) xml,批量插入操作,采用forEach 循環(huán)完成
<insert id="batchInsert">
insert sys_user (username, password, real_name, gender, email, mobile, create_time)
values
<foreach collection="list" index="index" item="item" separator=",">
(#{item.username}, #{item.password}, #{item.realName}, #{item.gender}, #{item.email}, #{item.mobile}, now())
</foreach>
</insert>
導(dǎo)出功能實(shí)現(xiàn)
導(dǎo)出 controller層
@GetMapping("export_excel")
public void export_excel(Map<String, Object> param, HttpServletResponse response) {
sysUserService.exportExcel(param, response);
}
導(dǎo)出 service 層
@Override
public void exportExcel(Map<String, Object> param, HttpServletResponse response) {
try {
List<SysUserDTO> res = sysUserMapper.list(null);
List<SysUserExcel> sysUserExcelList = BeanUtil.copyToList(res, SysUserExcel.class);
//設(shè)置信息頭,告訴瀏覽器內(nèi)容為excel類(lèi)型
response.setHeader("content-Type", "application/vnd.ms-excel");
//設(shè)置下載名稱(chēng)
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用戶列表.xls", StandardCharsets.UTF_8.name()));
//字節(jié)流輸出
ServletOutputStream out = response.getOutputStream();
//設(shè)置excel參數(shù)
ExportParams params = new ExportParams();
//設(shè)置sheet名名稱(chēng)
params.setSheetName("用戶列表");
//設(shè)置標(biāo)題
params.setTitle("用戶信息表");
Workbook workbook = ExcelExportUtil.exportExcel(params, SysUserExcel.class, sysUserExcelList);
workbook.write(out);
} catch (Exception e) {
log.error("導(dǎo)出失??! e ==> {}", e);
}
}
五、項(xiàng)目源碼
GitHub: GitHub 開(kāi)源地址
GitCode: GitCode 開(kāi)源地址
小結(jié)
以上就是【Bug 終結(jié)者】對(duì) 【前后端分離系列】 Spring Boot + Vue 實(shí)現(xiàn) EasyPOI 導(dǎo)入導(dǎo)出 的簡(jiǎn)單介紹,導(dǎo)入導(dǎo)出是我們?cè)陧?xiàng)目中比較常用的功能,同時(shí),前后端分離項(xiàng)目的開(kāi)發(fā)提高了我們對(duì)技術(shù)的更深入的理解,懂得了前端和后端是如何完成的交互,以及數(shù)據(jù)的渲染等,總之,導(dǎo)入導(dǎo)出很重要,該項(xiàng)目也涉及到了批量刪除等實(shí)戰(zhàn)開(kāi)發(fā)中比較常用的功能
到此這篇關(guān)于SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出的方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot EasyPOI導(dǎo)入導(dǎo)出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
談?wù)凷pring 注入properties文件總結(jié)
本篇談?wù)凷pring 注入properties文件總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
SpringCloud Feign遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解
Feign是Netflix公司開(kāi)發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開(kāi)發(fā)非?;A(chǔ)的組件,在使用的過(guò)程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似2022-11-11
Spring MVC整合Shiro權(quán)限控制的方法
這篇文章主要介紹了Spring MVC整合Shiro權(quán)限控制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)示例分享
泛型是Java SE5.0的重要特性,使用泛型編程可以使代碼獲得最大的重用。由于在使用泛型時(shí)要指明泛型的具體類(lèi)型,這樣就避免了類(lèi)型轉(zhuǎn)換。本實(shí)例將使用泛型來(lái)實(shí)現(xiàn)一個(gè)棧結(jié)構(gòu),并對(duì)其進(jìn)行測(cè)試2014-03-03

