咳咳,好久没有写博了。。。

在工作中遇到了纯前端,将数据导出为excel文件。正文开始:

第一步 安装依赖:

npm i xlsx

第二步 写导出函数:

import XLSX from 'xlsx'

const exportJsonToExcel = (dataArr) => {
const now = new Date()
const wopts = { bookType: 'xlsx', bookSST: false, type: 'binary' };//这里的数据是用来定义导出的格式类型
const wb = { SheetNames: ['Sheet1'], Sheets: {}, Props: {} };
wb.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(dataArr);//通过json_to_sheet转成单页(Sheet)数据
saveAs(new Blob([s2ab(XLSX.write(wb, wopts))], { type: "application/octet-stream" }), `导出文件-${now.getFullYear()}${now.getMonth() + 1}${now.getDate()}.${wopts.bookType}`);
} // 导出excel
const saveAs = (obj, fileName) => {
var tmpa = document.createElement("a");
tmpa.download = fileName || "下载";
const href = URL.createObjectURL(obj); //绑定a标签
tmpa.href = href;
tmpa.click(); //模拟点击实现下载
setTimeout(function () { //延时释放
URL.revokeObjectURL(href); //用URL.revokeObjectURL()来释放这个object URL
}, 100);
} const s2ab = (s) => {
if (typeof ArrayBuffer !== 'undefined') {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
} else {
var buf = new Array(s.length);
for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
} export default exportJsonToExcel

第三步 调用exportJsonToExcel方法:

  // 处理下载按钮, 少于1000条,则前端下载
handleClickDownload = () => {
exportToExcel(data)
} // 其中传入给exportToExcel的数据格式如下:是一个对象的数组,一个对象是一行的数据,key是表头, value是数据
data = [{'联系电话':item.Tel,
'客户标签':item.CustomerLableValue,
'客户状态':item.StateValue,
'距上次跟进(天)':item.OutTrackDay,
'客户来源':item.SourceValue,
'业务员':item.SalesmanName,
'省份':item.ProvinceName,
'城市':item.CityName,
'区县':item.CountyName,
'学历':item.EducationName,
'性别':item.Gender == 0 ? '男':'女',
'政治面貌':item.PoliticalOutlookName,
'QQ':item.QQ,
'类型':item.Type==1?'个人客户':'企业客户',
'联系次数':item.ContactNum,
'微信':item.WeChat,
'错误信息': item.ErrorInfo
}]

小结:

第三步的调用非常简单,将想要导出的数据格式化一下,传给exportToExcel方法即可。想哪里调用都可以呦。

第二步,让我新学习了两个方法:URL.createObjectURL() 和 URL.revokeObjectURL() ;

objectURL = URL.createObjectURL(blob):静态方法创建一个字符串,包含blob的url。这个新的url表示指定的File对象或者Blob对象。

                                        每次调用这个方法时候,都会创建一个新的URL对象,即便使用的是相同的参数,因此,需要使用URL.revokeObjectURL() 来释放。

URL.revokeObjectURL(objectURL):   释放需要在使用后释放,如果在使用前释放,则objectURL就为undefined。 举栗子:

<!DOCTYPE html>
<html lang="en"> <head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<meta charset="UTF-8">
<title>test url</title>
</head> <body>
<p>test revoke before use</p>
<input type="file" id="test" />
<br />
<br />
<br />
<p>test use revoke use</p>
<input type="file" id="test3" />
<script>
$('#test').on('change', function (e) {
var newImg = document.createElement("img");
var url = URL.createObjectURL(e.target.files[0])
console.log(url); newImg.src = url;
URL.revokeObjectURL(url); // 这里释放了!没有图片
document.body.appendChild(newImg);
console.log(url);
}); $('#test3').on('change', function (e) {
var newImg = document.createElement("img");
var url = URL.createObjectURL(e.target.files[0]) newImg.src = url;
newImg.onload = function () {
URL.revokeObjectURL(url); // onload时候释放,没有问题,因为已经加载完毕!
document.body.appendChild(newImg);
}
});
</script>
</body> </html>
 

最新文章

  1. Titanium.UI.createAlertDialog
  2. Struts2返回json格式数据踩坑记录
  3. Infinite Scroll - jQuery &amp; WP 无限滚动插件
  4. 每日一博 | 用 Ionic2 创建 App 启动页滑动欢迎界面
  5. cygwin-使用介绍
  6. Centos 安装 MySql
  7. 如何用Android Studio打多包名APK
  8. WayPoint寻路
  9. 微软职位内部推荐-Enterprise Architect - BDE - BJ
  10. Filezilla 多目录的访问设置
  11. oraclesql日志
  12. 开涛spring3(6.5) - AOP 之 6.5 AspectJ切入点语法详解
  13. VR全景智慧城市—你的掌上步行街
  14. Java IO(2)阻塞式输入输出(BIO)的字节流与字符流
  15. iOS QQ分享图片无反应问题
  16. Linux Centos6.9下安装部署VNC的实操详述
  17. 2018-2019-2 《Java程序设计》第1周学习总结
  18. WPF实现分页控件
  19. java.net.BindException: Address already in use: JVM_Bind:80 异常的解决办法
  20. PHP开启mysqli扩展

热门文章

  1. FCC(ES6写法) Validate US Telephone Numbers
  2. AI应用开发实战
  3. nginx配置ssl证书实现https访问
  4. 教你 Debug 的正确姿势——记一次 CoreMotion 的 Crash
  5. VsCode 使用专用编程字体FiraCode
  6. Go变量逃逸分析
  7. [Swift]LeetCode675. 为高尔夫比赛砍树 | Cut Off Trees for Golf Event
  8. 通信统计接口字段填充内容shell脚本
  9. Java中构造方法、实例方法、类方法的区别
  10. 关于datagrid中数据条件颜色问题