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 相关文章推荐
jquery 打开窗口返回值实现代码
Mar 04 Javascript
JavaScript对象链式操作代码(jquery)
Jul 04 Javascript
JS操作Cookie写入和读取实例代码
Oct 20 Javascript
javascript动态创建及删除元素的方法
Dec 22 Javascript
JQuery节点元素属性操作方法
Jun 11 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
Aug 20 Javascript
BootStrap 超链接变按钮的实现方法
Sep 25 Javascript
js获取文件里面的所有文件名(实例)
Oct 17 Javascript
微信web端后退强制刷新功能的实现代码
Mar 04 Javascript
JavaScript ES6 Class类实现原理详解
May 08 Javascript
JavaScript中arguments的使用方法详解
Dec 20 Javascript
如何优化vue打包文件过大
Apr 13 Vue.js
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垃圾代码优化操作代码
2010/08/05 PHP
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
python判断设备是否联网的方法
2018/06/29 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
python递归法解决棋盘分割问题
2019/07/17 Python
Hotels.com南非:酒店预订
2017/11/02 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
大学旷课检讨书
2014/01/28 职场文书
法制宣传教育方案
2014/05/09 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
师德师风自查总结
2014/10/14 职场文书
个人事迹材料范文
2014/12/29 职场文书
前台文员岗位职责
2015/02/04 职场文书
个人廉洁自律总结
2015/03/06 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
Python操作CSV格式文件的方法大全
2021/07/15 Python
HttpClient实现表单提交上传文件
2022/08/14 Java/Android