一、需求分析
1. 两个方式
导出excel有两个方式,前端导出 和 后端导出
前端导出excel:就用 vue+xlsx(npm 包)
后端导出excel:就用 vue+poi(maven 包)
2. 对比分析
前端导出excel 相对来说简单一点,xlsx是前端 npm 包,但是如果数据量大的话,会卡顿,处理时间慢;当数据量多的时候 使用后端导出会好一点
后端导出excel 相对来说麻烦一点,但是时间短、速度快;具体操作都放在后端,也节省了前端的操作。用户效果好。
二、方式1:vue+xlsx
1. 安装 xlsx
npm install xlsx file-saver --save
2. xlsx 两个方法比较
这个xlsx 方法一 和下面的xlsx 方法二 都是使用的 xlsx 模块的 方法,只是获取数据的方式和 导出excel的方式有点不一样。
相比之下,还是 xlsx 方法一 会好一点,可以自定义导出的字段。
3. xlsx 方法一
a. 按钮事件
<el-button size="small" type="primary" @click="exportselect()">导出选中</el-button> <el-button size="small" type="primary" @click="exportallexcel">导出全部</el-button>
其实 上面的 二方法 可以做成一个方法,但是为了明确好分析,我写成了二个方法。
b. js 方法:导出选中 exportselect()
exportselect() {
// 导出选中
this.$confirm("是否确认导出当前所有参赛人员数据?", "警告", {
confirmbuttontext: "确定",
cancelbuttontext: "取消",
type: "warning",
}).then((response) => {
// this.selectdata 是复选框的 数据列表
if (this.selectdata.length <= 0) {
this.$message.info('请选择数据!');
return false;
}
let tabledata = [
['序号', '赛区名称', '参赛人', '手机号', '收件地址', "邮箱", "录入时间", "状态"]//导出表头
] // 表格表头
this.selectdata.foreach((item, index) => {
let rowdata = []
//导出内容的字段
rowdata = [
index + 1,
item.matchareaname,
item.username,
item.userphone,
item.receiveaddress,
item.createtime,
item.dataflag === 0 ? '待审核': '审核通过',
]
tabledata.push(rowdata)
})
let worksheet = xlsx.utils.aoa_to_sheet(tabledata);
let booknew = xlsx.utils.book_new();
xlsx.utils.book_append_sheet(booknew, worksheet, '作品名称') // 工作簿名称
let name = '参赛人员选中' + this.timeformat() + '.xlsx'
xlsx.writefile(booknew, name) // 保存的文件名
})
},
timeformat() {
let time = new date();
let year = time.getfullyear();
let month = time.getmonth() + 1;
let date = time.getdate();
let hours = time.gethours();
let minutes = time.getminutes();
let seconds = time.getseconds();
return year + '-' + this.addzero(month) + '-' + this.addzero(date) + ' ' + this.addzero(hours) + ':' + this.addzero(minutes) + ':' + this.addzero(seconds);
},
addzero(num) {
return num < 10 ? '0' + num : num
},c. js 方法:导出全部 exportallexcel
// 导出 所有
exportallexcel() {
this.$confirm("是否确认导出全部参赛人员数据?", "警告", {
confirmbuttontext: "确定",
cancelbuttontext: "取消",
type: "warning",
}).then(response => {
// 获取用户列表
let arr = [];
let parameter = {
pageno: 1,
pagesize: 1000
}
getmatchuserinfolist(parameter).then(res => {
this.loading = false;
if (res.data.code != "1") {
this.$message({
type: 'info',
message: res.data.message
})
} else {
arr = res.data.data;
console.log('----------:', json.stringify(arr))
this.exportlist(arr);
}
}).catch(err => {
this.$message.warning("系统问题,请稍后重试!")
})
},
exportlist(arr){
let tabledata = [
['序号', '赛区名称', '参赛人', '手机号', '收件地址', "邮箱", "录入时间", "审核状态", "是否发送豆子"]//导出表头
] // 表格表头
arr.foreach((item, index) => {
let rowdata = []
//导出内容的字段
rowdata = [
index + 1,
item.matchareaname,
item.username,
item.userphone,
item.receiveaddress,
item.email,
item.createtime,
item.dataflag === 0 ? '待审核': '审核通过',
item.sendflag === 1 ? '否': '是',
]
tabledata.push(rowdata)
})
let worksheet = xlsx.utils.aoa_to_sheet(tabledata);
let booknew = xlsx.utils.book_new();
xlsx.utils.book_append_sheet(booknew, worksheet, '作品名称') // 工作簿名称
let name = '全部参赛人员' + this.timeformat() + '.xlsx'
xlsx.writefile(booknew, name) // 保存的文件名
},
4. xlsx 方法二
a. 按钮事件
<el-button size="small" type="primary" @click="exportexcel">导出当前页</el-button>
b. js 方法:导出当前页 exportexcel
这里是
// 导出当前页
exportexcel() {
this.$confirm("是否确认导出当前所有参赛人员数据?", "警告", {
confirmbuttontext: "确定",
cancelbuttontext: "取消",
type: "warning",
}).then((response) => {
const wb = xlsx.utils.table_to_book(
document.queryselector("#el-table")
);
const wbout = xlsx.write(wb, {
booktype: "xlsx",
booksst: true,
type: "array",
});
try {
filesaver.saveas(
new blob([wbout], {type: "application/octet-stream"}),
"参赛人员数据.xlsx"
);
} catch (e) {
if (typeof console !== "undefined") console.log(e, wbout);
}
});
},二、方式2:vue+poi
这个方式也就是后端生成excel,与前端没有多大的关系,后端写好的 excel就直接write到 response里面了。
先直接放上前端代码。
1. 前端代码
a、按钮事件
<el-button size="small" type="primary" @click="exportallexcel">导出全部</el-button>
b、网络请求封装
// 导出全部
export function exportexcelformatchuser(data) {
return fetch({
url: '/xfx/matchuser/web/exportexcelformatchuser',
method: 'post',
timeout: '120000',
responsetype: 'blob',
data
});
}
c、js方法:导出全部 exportallexcel
// 导出 所有
exportallexcel() {
this.$confirm("是否确认导出全部参赛人员数据?", "警告", {
confirmbuttontext: "确定",
cancelbuttontext: "取消",
type: "warning",
}).then(response => {
exportexcelformatchuser().then(response => {
const data = "参赛人员web.xlsx";
console.log('1111111111111111111111111', json.stringify(response))
let blob = new blob([response.data], {type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8"});
console.log('333333333333333333333333', json.stringify(blob))
// for ie
if (window.navigator && window.navigator.mssaveoropenblob) {
window.navigator.mssaveoropenblob(blob, data);
} else {
console.log('chrome go here ')
let downloadelement = document.createelement('a');
let href = window.url.createobjecturl(blob); // 创建下载的链接
downloadelement.href = href;
downloadelement.download = data; // 下载后文件名
document.body.appendchild(downloadelement);
downloadelement.click(); // 点击下载
document.body.removechild(downloadelement); // 下载完成移除元素
window.url.revokeobjecturl(href); // 释放掉blob对象
}
}).catch(err => {
console.log(err)
this.loading = false;
this.$message.warning("对不起,下载失败");
});
})
},2. 后端代码(important)
a、maven 依赖
<!-- poi -->
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi</artifactid>
<version>3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi-ooxml</artifactid>
<version>3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi-scratchpad</artifactid>
<version>3.14</version>
</dependency>
<!--这个不属于 poi ,就是一个工具类-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupid>org.apache.commons</groupid>
<artifactid>commons-lang3</artifactid>
<version>3.3.2</version>
</dependency>a、controller 控制器层
/**
* @return com.zheng.ucenter.common.constant.ucenterresult
* @author fengfanli
* @description //todo 导出全部
* @date 17:40 2021/5/17
* @param [param, request]
**/
@requestmapping(value = "/web/exportexcelformatchuser", method = requestmethod.post)
public ucenterresult exportexcelformatchuser(httpservletresponse response) {
try {
matchusermodel model = new matchusermodel();
model.setstart(0);
model.setpagesize(10000);
list<matchusermodel> allmatchusermodels = matchuserservice.getallmatchusermodels(model);
// 导出 代码
list<matchuserresp> result = new arraylist<>(allmatchusermodels.size());
for (matchusermodel matchusermodel : allmatchusermodels) {
matchuserresp resp = new matchuserresp();
beanutils.copyproperties(matchusermodel, resp);
resp.setcreatetime(datehander.datetostr1(matchusermodel.getcreatetime()));
result.add(resp);
}
if (result.size()!=0){
exportexcel exportexcel = new exportexcel("参赛人员", matchuserresp.class, 1);
exportexcel.setdatalist(result);
string filename = "match_user_" + datehander.datetostrd(new date()) + (new random().nextint(100 - 10) + 10) + ".xlsx";
exportexcel.write(response, filename);
}
return new ucenterresult(ucenterresultconstant.success);
} catch (exception e) {
logger.error("matchusercontroller exportexcelformatchuser error:", e);
}
return new ucenterresult(ucenterresultconstant.failed);
}
重点就是其中的五行:

b、pojo类matchuserresp类
这里使用到了自定义的 注解类
import java.io.serializable;
import java.util.date;
/**
* @classname matchuserresp
* @description todo
* @author admin
* @date 2021/5/14 15:36
* @version 1.0
*/
public class matchuserresp implements serializable {
@excelfield(title = "序号", align = 1, sort = 1)
private integer id;
private long matchmainid;
private long userid;
@excelfield(title = "是否发送豆子(2:发送,1:未发送)", align = 1, sort = 2)
private long sendflag;
@excelfield(title = "比赛名称", align = 1, sort = 3)
private string matchname;
@excelfield(title = "用户名", align = 1, sort = 4)
private string username;
@excelfield(title = "手机号", align = 1, sort = 5)
private string userphone;
private string userwxhead;
@excelfield(title = "收件地址", align = 1, sort = 6)
private string receiveaddress;
@excelfield(title = "邮箱", align = 1, sort = 7)
private string email;
private long matchareacodeid;
@excelfield(title = "赛区名称", align = 1, sort = 8)
private string matchareaname;
@excelfield(title = "备注", align = 1, sort = 9)
private string remark;
private integer createuserid;
private string createusername;
@excelfield(title = "创建时间", align = 1, sort = 10)
private string createtime;
private integer dataflag;
private integer useflag;
private string timestamp;
public long getsendflag() {
return sendflag;
}
public void setsendflag(long sendflag) {
this.sendflag = sendflag;
}
public long getuserid() {
return userid;
}
public void setuserid(long userid) {
this.userid = userid;
}
public integer getid() {
return id;
}
public void setid(integer id) {
this.id = id;
}
public long getmatchmainid() {
return matchmainid;
}
public void setmatchmainid(long matchmainid) {
this.matchmainid = matchmainid;
}
public string getmatchname() {
return matchname;
}
public void setmatchname(string matchname) {
this.matchname = matchname;
}
public string getusername() {
return username;
}
public void setusername(string username) {
this.username = username;
}
public string getuserphone() {
return userphone;
}
public void setuserphone(string userphone) {
this.userphone = userphone;
}
public string getuserwxhead() {
return userwxhead;
}
public void setuserwxhead(string userwxhead) {
this.userwxhead = userwxhead;
}
public string getreceiveaddress() {
return receiveaddress;
}
public void setreceiveaddress(string receiveaddress) {
this.receiveaddress = receiveaddress;
}
public string getemail() {
return email;
}
public void setemail(string email) {
this.email = email;
}
public long getmatchareacodeid() {
return matchareacodeid;
}
public void setmatchareacodeid(long matchareacodeid) {
this.matchareacodeid = matchareacodeid;
}
public string getmatchareaname() {
return matchareaname;
}
public void setmatchareaname(string matchareaname) {
this.matchareaname = matchareaname;
}
public string getremark() {
return remark;
}
public void setremark(string remark) {
this.remark = remark;
}
public integer getcreateuserid() {
return createuserid;
}
public void setcreateuserid(integer createuserid) {
this.createuserid = createuserid;
}
public string getcreateusername() {
return createusername;
}
public void setcreateusername(string createusername) {
this.createusername = createusername;
}
public string getcreatetime() {
return createtime;
}
public void setcreatetime(string createtime) {
this.createtime = createtime;
}
public integer getdataflag() {
return dataflag;
}
public void setdataflag(integer dataflag) {
this.dataflag = dataflag;
}
public integer getuseflag() {
return useflag;
}
public void setuseflag(integer useflag) {
this.useflag = useflag;
}
public string gettimestamp() {
return timestamp;
}
public void settimestamp(string timestamp) {
this.timestamp = timestamp;
}
}
c、其余的工具类

我都上传至github了,可以直接拿过来用。
总结
到此 后端导出excel结束了。
以上就是vue导出excel的两个常用方式介绍与对比的详细内容,更多关于vue导出excel的资料请关注代码网其它相关文章!
发表评论