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 相关文章推荐
namespace.js Javascript的命名空间库
Oct 11 Javascript
用JavaScript仿PS里的羽化效果代码
Dec 20 Javascript
jquery scroll()区分横向纵向滚动条的方法
Apr 04 Javascript
jquery ajax双击div可直接修改div中的内容
Mar 04 Javascript
Boostrap模态窗口的学习小结
Mar 28 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
Oct 25 Javascript
详解vue-cli构建项目反向代理配置
Sep 07 Javascript
详细介绍RxJS在Angular中的应用
Sep 23 Javascript
js中arguments对象的深入理解
May 14 Javascript
JavaScript 接口原理与用法实例详解
May 12 Javascript
JavaScript图像放大镜效果实现方法详解
Jun 28 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
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
js实现微信聊天效果
2020/08/09 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
python 剪切移动文件的实现代码
2018/08/02 Python
python 字符串常用方法汇总详解
2019/09/16 Python
Python如何计算语句执行时间
2019/11/22 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
农村婚礼证婚词
2014/01/10 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
工程质检员岗位职责
2015/04/08 职场文书
施工安全保证书
2015/05/09 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript
Java线程的6种状态与生命周期
2022/05/11 Java/Android