javascript导出csv文件(excel)的方法示例


Posted in Javascript onAugust 25, 2019

这里贴出JavaScript导出csv文件(excel)的代码。

/**
 * 导出excel
 * @param {Object} title  标题列key-val
 * @param {Object} data   值列key-val
 * @param {Object} fileName  文件名称
 */
function JSONToExcelConvertor(title, data, fileName) {
 var CSV = '';
 var row = "";

 for (var i = 0; i < title.length; i++) {
  if(title[i].title){
   row += title[i].title + ',';
  }
 }
 row = row.slice(0, -1);
 CSV += row + '\r\n';

 for (var i = 0; i < data.length; i++) {
  var row = "";
  for (var j = 0; j < title.length; j++) {
   if(title[j].title){
    row += '"' + (data[i][title[j].field] ? data[i][title[j].field] : "") + '"\t,';
   }
  }
  row.slice(0, row.length - 1);
  CSV += row + '\r\n';
 }

 if (CSV == '') {
  alert("Invalid data");
  return;
 }

 var fileName = fileName;
 var uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURI(CSV);
 var link = document.createElement("a");
 link.href = uri;

 link.style = "visibility:hidden";
 link.download = fileName + ".csv";
 document.body.appendChild(link);
 link.click();
 document.body.removeChild(link);
}

上面的写法,如果excel中的数据太多,就会导致无法导出的结果,原因是浏览器对URL的长度有限制,因此要使用Blob对象和window.URL.createObjectURL()方法做一下改造。

window.URL.createObjectURL()方法可以直接生成blob:开头的链接,该链接产生于浏览器端,不会占用服务器资源。

/**
 * 导出excel
 * @param {Object} title  标题列key-val
 * @param {Object} data   值列key-val
 * @param {Object} fileName  文件名称
 */
function JSONToExcelConvertor(title, data, fileName) {
 var CSV = '';
 var row = "";

 for (var i = 0; i < title.length; i++) {
  if(title[i].title){
   row += title[i].title + ',';
  }
 }
 row = row.slice(0, -1);
 CSV += row + '\r\n';

 for (var i = 0; i < data.length; i++) {
  var row = "";
  for (var j = 0; j < title.length; j++) {
   if(title[j].title){
    row += '"' + (data[i][title[j].field] ? data[i][title[j].field] : "") + '"\t,';
   }
  }
  row.slice(0, row.length - 1);
  CSV += row + '\r\n';
 }

 if (CSV == '') {
  alert("Invalid data");
  return;
 }

 var fileName = fileName;
 var uri = new Blob(['\ufeff' + CSV], {type:"text/csv"});
 var link = document.createElement("a");
 link.href = URL.createObjectURL(uri);

 link.style = "visibility:hidden";
 link.download = fileName + ".csv";
 document.body.appendChild(link);
 link.click();
 document.body.removeChild(link);
}

然而,虽然window.URL.createObjectURL()方法在IE10、 IE11以及Microsoft Edge中能生成的blob:链接,但是却不能把它加到一个<a>节点上,也不能直接在浏览器地址栏打开访问,否则会得到【SCRIPT5:拒绝访问。】错误。甚至,IE9根本不支持调用window.URL.createObjectURL()方法创建Blob URLs。

Microsoft Internet Explorer / Microsoft Edge和高大上的Google Chrome / Mozilla Firefox对于window.URL.createObjectURL()方法创建Blob链接最直观的区别在于得到的blob:链接形式不一样,分别在微软浏览器和标准浏览器中运行new Blob()代码,会得到两种Blob链接形式,第一种为chrome和firefox生成的带有当前域名的标准blob:链接形式,第二种为Microsoft IE和Microsoft Edge生成的不带域名的blob:链接。那么我们就可以通过window.URL.createObjectURL(new Blob()) . indexOf(location.host) < 0表达式来检测是否是IE或早期生成Object URL不带域名的Edge,如果表达式返回true则是IE或Edge旧版本。

事实上,Blob URL不被支持是出于IE浏览器对安全性的考虑(IE浏览器真安全啊,牛逼),然后它自己提供了一套API用来创建或下载Blob文件:msSaveOrOpenBlob。

/**
 * 导出excel
 * @param {Object} title  标题列key-val
 * @param {Object} data   值列key-val
 * @param {Object} fileName  文件名称
 */
function JSONToExcelConvertor(title, data, fileName) {
 var CSV = '';
 var row = "";

 for (var i = 0; i < title.length; i++) {
  if(title[i].title){
   row += title[i].title + ',';
  }
 }
 row = row.slice(0, -1);
 CSV += row + '\r\n';

 for (var i = 0; i < data.length; i++) {
  var row = "";
  for (var j = 0; j < title.length; j++) {
   if(title[j].title){
    row += '"' + (data[i][title[j].field] ? data[i][title[j].field] : "") + '"\t,';
   }
  }
  row.slice(0, row.length - 1);
  CSV += row + '\r\n';
 }

 if (CSV == '') {
  alert("Invalid data");
  return;
 }

 var fileName = fileName;
 var uri = new Blob(['\ufeff' + CSV], {type:"text/csv"});

 if (window.navigator && window.navigator.msSaveOrOpenBlob) { // for IE
  window.navigator.msSaveOrOpenBlob(CSV, fileName + ".csv");
 } else { // for Non-IE(chrome、firefox etc.)
  var link = document.createElement("a");
  link.href = URL.createObjectURL(uri);

  link.style = "visibility:hidden";
  link.download = fileName + ".csv";
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
 }
}

因此就得出上面最终的代码。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
提高 DHTML 页面性能
Dec 25 Javascript
List Installed Software Features
Jun 11 Javascript
两个select多选模式的选项相互移动(示例代码)
Jan 11 Javascript
JQuery实现超链接鼠标提示效果的方法
Jun 10 Javascript
浅谈javascript基础之客户端事件驱动
Jun 10 Javascript
js实现不提示直接关闭网页窗口
Mar 30 Javascript
微信小程序支付及退款流程详解
Nov 30 Javascript
vue组件之间数据传递的方法实例分析
Feb 12 Javascript
JavaScript实现留言板案例
Mar 17 Javascript
Vue如何基于es6导入外部js文件
May 15 Javascript
vue各种事件监听实例(小结)
Jun 24 Javascript
在HTML5 localStorage中存储对象的示例代码
Apr 21 Javascript
JavaScript在web自动化测试中的作用示例详解
Aug 25 #Javascript
angularjs自定义过滤器demo示例
Aug 24 #Javascript
Jquery实现获取子元素的方法分析
Aug 24 #jQuery
微信小程序class封装http代码实例
Aug 24 #Javascript
微信小程序前端promise封装代码实例
Aug 24 #Javascript
node获取客户端ip功能简单示例
Aug 24 #Javascript
js针对图片加载失败的处理方法分析
Aug 24 #Javascript
You might like
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
python实现串口通信的示例代码
2020/02/10 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
Eclipse面试题
2014/03/22 面试题
.net面试题
2015/12/22 面试题
高二历史教学反思
2014/01/25 职场文书
同学会主持词
2014/03/18 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
党员剖析材料范文
2014/09/30 职场文书
国际贸易实训总结
2015/08/03 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
React列表栏及购物车组件使用详解
2021/06/28 Javascript