js实现数据导出为EXCEL(支持大量数据导出)


Posted in Javascript onMarch 31, 2020

数据导出为excel是前端比较常用的功能。笔者近期在网上收集汇总了几种常用的方法,供大家使用。

1、ActiveXObject(“Excel.Application”)

这种方法只能在IE下使用。
优点:参照VBA控制excel对象。(代码不会的可以录制宏)
缺点:引用cell对象太慢,上万行数据导出时间超过2分钟

2、以Table方式导出为html文件。

3、以CSV方式导出。

使用中发现如果数据较多,上述第2、3中方法会失效,因此又整理了第4种方法 toLargerCSV。

第4种方法在IE10、chrome测试通过

<html>
<head>
 <div>以Table格式导为xls文件
 <button onclick='TableToExcel()'>导出</button></div>
 <div>导出CSV文件
 <button onclick='toCSV()'>导出</button></div>
 <div>大量数据导出CSV
 <button onclick='toLargerCSV()'>导出</button></div>
</head>
<body>
 <script>   
 //以Table格式导为xls文件
  function TableToExcel(){
   //要导出的json数据
   var jsonData = [
    {
     name:'001',
     id:'621699190001011231'
    },
    {
     name:'002',
     id:'52069919000101547X'
    },
    {
     name:'003',
     id:'423699190103015469'
    },
    {
     name:'004',
     id:'341655190105011749'
    }
   ]
  //导出前要将json转成table格式
   //列标题
   var str = '<tr><td>name</td><td>id</td></tr>';
   //具体数值 遍历
   for(let i = 0;i < jsonData.length;i++){
    str += '<tr>';
    for(let item in jsonData[i]){
  var cellvalue = jsonData[i][item];
      //不让表格显示科学计数法或者其他格式 
  //方法1 tr里面加 style="mso-number-format:'\@';" 方法2 是改为 = 'XXXX'格式 
  //如果纯数字且超过15位
  /*var reg = /^[0-9]+.?[0-9]*$/;
  if ((cellvalue.length>15) && (reg.test(cellvalue))){
  //cellvalue = '="' + cellvalue + '"';
  }*/
  //此处用`取代',具体用法搜索模板字符串 ES6特性
      str+=`<td style="mso-number-format:'\@';">${cellvalue}</td>`; 
  // str+=`<td>${cellvalue}</td>`; 
    }
    str+='</tr>'; 
   }   
   var worksheet = '导出结果'
   var uri = 'data:application/vnd.ms-excel;base64,';
   //下载的表格模板数据
   var template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" 
   xmlns:x="urn:schemas-microsoft-com:office:excel" 
   xmlns="http://www.w3.org/TR/REC-html40">
   <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
    <x:Name>${worksheet}</x:Name>
    <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
    </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
    </head><body><table>${str}</table></body></html>`;
   //下载模板
  function base64 (s) { return window.btoa(unescape(encodeURIComponent(s)))}
   window.location.href = uri + base64(template);
  }
  
 
 function toCSV(){
 //要导出的json数据
   var jsonData = [
    {
     name:'001',
     id:'621699190001011231'
    },
    {
     name:'002',
     id:'52069919000101547X'
    },
    {
     name:'003',
     id:'423699190103015469'
    },
    {
     name:'004',
     id:'341655190105011749'
    }
   ]
  //导出前要将json转成table格式
   //列标题
   var str = 'name,id\n';
   //具体数值 遍历
   for(let i = 0 ; i < jsonData.length ; i++ ){
    for(let item in jsonData[i]){
  
      //增加\t为了不让表格显示科学计数法或者其他格式
  //此处用`取代',具体用法搜索模板字符串 ES6特性
      str+=`${jsonData[i][item] + '\t,'}`;   
    }
    str+='\n'; 
   }  
 let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
 var link = document.createElement("a");
 link.href = uri;
 link.download = "导出.csv";
 document.body.appendChild(link);
 link.click();
 document.body.removeChild(link);
 }
 //支持大批量数据导出,目前测试15万行 30列通过,导出时间约为6秒
 function toLargerCSV(){
 //CSV格式可以自己设定,适用MySQL导入或者excel打开。
 //由于Excel单元格对于数字只支持15位,且首位为0会舍弃 建议用 =“数值” 
 
 var str = '行号,内容,题目,标题\n';
 
 for(let i=0;i<100000;i++){
  str += i.toString()+',1234567890123456789\t,张三李四王五赵六,bbbb,\n'
 }
 var blob = new Blob([str], {type: "text/plain;charset=utf-8"});  
 //解决中文乱码问题
 blob = new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type}); 
 object_url = window.URL.createObjectURL(blob); 
 var link = document.createElement("a");
 link.href = object_url;
 link.download = "导出.csv";
 document.body.appendChild(link);
 link.click();
 document.body.removeChild(link);        
 }

</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 学习笔记一些小技巧
Mar 28 Javascript
JavaScript中String和StringBuffer的速度之争
Apr 01 Javascript
Angularjs material 实现搜索框功能
Mar 08 Javascript
Boostrap模态窗口的学习小结
Mar 28 Javascript
js表单验证实例讲解
Mar 31 Javascript
js实时获取窗口大小变化的实例代码
Nov 18 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
Jan 04 Javascript
AngularJS constant和value区别详解
Feb 28 Javascript
bootstrap手风琴折叠示例代码分享
May 22 Javascript
Vue组件选项props实例详解
Aug 18 Javascript
Vue监听滚动实现锚点定位(双向)示例
Nov 13 Javascript
JavaScript console的使用方法实例分析
Apr 28 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 #Javascript
Vue-router 报错NavigationDuplicated的解决方法
Mar 31 #Javascript
js实现整体缩放页面适配移动端
Mar 31 #Javascript
react国际化化插件react-i18n-auto使用详解
Mar 31 #Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
Mar 31 #Javascript
功能完善的小程序日历组件的实现
Mar 31 #Javascript
小程序双头slider选择器的实现示例
Mar 31 #Javascript
You might like
《心理测量者3》剧场版动画预告
2020/03/02 日漫
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
php5.3 废弃函数小结
2010/05/16 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
YII框架常用技巧总结
2019/04/27 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
python实现马耳可夫链算法实例分析
2015/05/20 Python
Python实现多属性排序的方法
2018/12/05 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
How TDD works
2012/09/30 面试题
人身意外保险授权委托书
2014/10/01 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
班主任先进事迹材料
2014/12/17 职场文书
疾病证明书
2015/06/19 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
导游词之凤凰古城
2019/10/22 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js