前端JS实现Excel数据导出的几种方案及大数据量处理
本文汇总了前端实现Excel数据导出的几种常用方法,包括仅支持IE的ActiveXObject、基于Table的HTML导出以及CSV方式导出。针对数据量较大时上述方法失效的问题,重点介绍了toLargerCSV方案,该方案在IE10及Chrome浏览器中测试通过,可有效解决大量数据导出时的性能与兼容性问题。
前端数据导出方案概述
在前端开发中,将数据导出为Excel文件是一项常见需求。本文整理并汇总了目前几种主流的实现方式,供开发者参考选用。
基于ActiveXObject的导出方式
第一种方法是通过ActiveXObject调用“Excel.Application”对象。
该方案存在明显的局限性,仅能在Internet Explorer浏览器环境下运行。其优势在于可以参照VBA的方式控制Excel对象,即使不熟悉代码,也可通过录制宏来获取相关逻辑。然而,其缺点在于引用cell对象的速度较慢,当导出数据量超过上万行时,处理时间往往超过2分钟,性能较差。
Table与CSV导出方式及其局限
第二种方法是将Table表格数据以HTML文件的形式导出。
第三种方法是将数据以CSV(逗号分隔值)格式进行导出。
在实际测试中发现,当数据量较大时,上述第二种和第三种方法容易出现失效或性能瓶颈。因此,本文进一步整理了第四种方法,即toLargerCSV方案,以应对大数据量的导出需求。
经测试,第四种方法在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>
以上内容为本文的全部总结,希望能为读者的学习提供有益帮助,同时也感谢大家的支持。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
