JS前端--数据导出为EXCEL(支持大量数据导出)

数据导出为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>
  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
要利用exceljs前端数据导出Excel,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了exceljs和file-saver这两个依赖库。你可以使用npm命令进行安装,如下所示: ``` npm install exceljs npm install file-saver ``` 2. 在你的前端代码中引入ExcelJS和saveAs: ``` import ExcelJS from 'exceljs'; import saveAs from 'file-saver'; ``` 3. 创建一个Excel对象,并定义导出Excel的方法。你可以参考下面的代码示例: ``` const exportExcel = () => { const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Sheet 1'); // 添加表头 const headerRow = worksheet.addRow(header); // 设置自定义表头 headerRow.eachCell((cell, index) => { cell.value = customHeader\[index - 1\]; }); // 添加数据 tableData.forEach((data) => { const row = worksheet.addRow(Object.values(data)); }); // 合并单元格 mergeList.forEach((merge) => { worksheet.mergeCells(merge.startRow, merge.startColumn, merge.endRow, merge.endColumn); }); // 导出Excel文件 workbook.xlsx.writeBuffer().then((buffer) => { const blob = new Blob(\[buffer\], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); saveAs(blob, '表格文件名称.xlsx'); }); }; ``` 4. 在你的页面中调用exportExcel方法来触发导出操作。你可以在按钮的点击事件中调用该方法,如下所示: ``` <button @click="exportExcel">导出</button> ``` 通过以上步骤,你就可以利用exceljs前端数据导出Excel文件了。请注意,你需要根据你的具体需求来调整代码中的变量和参数,以适应你的数据结构和导出需求。 #### 引用[.reference_title] - *1* *3* [使用ExcelJS实现excel前端导出功能(Vue3+TS)](https://blog.csdn.net/weixin_50543490/article/details/131207514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [纯前端导出带样式的excelexceljs](https://blog.csdn.net/shangshuxian1999/article/details/129087172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值