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 相关文章推荐
JQuery 遮罩层实现(mask)实现代码
Jan 09 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
Sep 12 Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
JavaScript仿静态分页实现方法
Aug 04 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
Feb 15 Javascript
JS实现1000以内被3或5整除的数字之和
Feb 18 Javascript
jQuery获取cookie值及删除cookie用法实例
Apr 15 Javascript
AngularJS 路由详解和简单实例
Jul 28 Javascript
js css自定义分页效果
Feb 24 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
Oct 27 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
Aug 19 Javascript
Node.js系列之连接DB的方法(3)
Aug 30 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
坏狼php学习 计数器实例代码
2008/06/15 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
jquery无缝图片轮播组件封装
2020/11/25 jQuery
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
公司总经理工作职责管理办法
2014/02/28 职场文书
餐厅筹备计划书
2014/04/25 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL