在后台管理系统开发中,表格批量导出Excel是一个刚需高频功能。几乎所有的权限系统、数据统计、订单管理页面,都会用到导出功能。
网上大多数教程都是依赖 xlsx、SheetJS 等第三方库实现,虽然开箱即用,但也存在不少弊端:增加项目体积、版本兼容问题、部分封装库存在导出格式错乱、打包冗余等问题。
其实很多中小型项目,完全没必要引入重型插件!原生 JS 结合 Blob 和 DataURL 就能完美实现 纯前端批量导出 Excel,零依赖、轻量、兼容性强。
今天分享我项目中一直在用的无插件批量导出方案,代码极简、可直接复用,支持自定义表头、批量数据导出、自定义文件名,彻底摆脱第三方库依赖。
一、为什么放弃第三方Excel插件?
我之前开发一直用 xlsx 库做导出,后期迭代发现很多小问题:
1、引入插件增加项目打包体积,简单导出功能性价比极低;
2、部分版本存在兼容bug,低版本浏览器导出文件打不开;
3、插件封装度太高,自定义样式、单元格格式非常麻烦;
4、很多项目仅需基础批量导出,完全用不到插件的复杂能力。
而原生方案核心原理非常简单:拼接标准Table表格HTML结构,通过Blob生成二进制文件,模拟浏览器下载。生成的 xls 文件可以直接用 WPS、Office 正常打开,完全满足业务需求。
二、原生JS批量导出Excel核心思路
整体流程就三步,新手也能一眼看懂:
1、定义 Excel 表头,匹配后端返回的字段数据;
2、遍历批量数据源,拼接表格 HTML 结构;
3、通过 Blob 生成文件,创建 a 标签模拟下载,自动释放资源。
三、完整可运行批量导出代码(零依赖)
下面是我封装的通用导出函数,支持任意批量数组数据、自定义表头、自定义文件名,适配90%后台导出场景。
/** * 纯JS批量导出Excel(无第三方插件) * @param {Array} headerList 表头列表 * @param {Array} keyList 数据字段key * @param {Array} dataList 批量数据源 * @param {String} fileName 导出文件名 */ function exportExcel(headerList, keyList, dataList, fileName = "数据报表") { // 1.拼接表头 let tableHtml = "<table border='1' cellpadding='0' cellspacing='0'><thead><tr>"; headerList.forEach(header => { tableHtml += `<th bgcolor="#f5f7fa">${header}</th>`; }); tableHtml += "</tr></thead><tbody>"; // 2.批量遍历数据,拼接表格内容 dataList.forEach(item => { tableHtml += "<tr>"; keyList.forEach(key => { // 空值兜底处理,避免空白异常 let val = item[key] ?? ""; // 处理数字过长变科学计数法问题 tableHtml += `<td>${val}</td>`; }); tableHtml += "</tr>"; }); tableHtml += "</tbody></table>"; // 3.设置Excel文档头部格式,保证兼容性 const excelHtml = ` <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><meta charset="UTF-8"></head> <body>${tableHtml}</body></html> `; // 4.生成Blob二进制文件 const blob = new Blob([excelHtml], { type: "application/vnd.ms-excel;charset=utf-8" }); // 5.创建下载链接,触发浏览器下载 const url = URL.createObjectURL(blob); const aLink = document.createElement("a"); aLink.href = url; aLink.download = `${fileName}.xls`; document.body.appendChild(aLink); aLink.click(); // 6.释放资源,防止内存泄漏 document.body.removeChild(aLink); URL.revokeObjectURL(url); }四、业务场景实战调用(批量订单导出)
模拟真实后台订单批量数据,直接调用封装方法,一键导出:
// 模拟后端批量订单数据 const orderData = [ { orderId: "OD20260801", userName: "张三", amount: 299, status: "已完成" }, { orderId: "OD20260802", userName: "李四", amount: 599, status: "待付款" }, { orderId: "OD20260803", userName: "王五", amount: 199, status: "已发货" }, { orderId: "OD20260804", userName: "赵六", amount: 899, status: "已完成" } ]; // 配置表头、对应字段 const headers = ["订单编号", "用户姓名", "订单金额", "订单状态"]; const keys = ["orderId", "userName", "amount", "status"]; // 触发导出 exportExcel(headers, keys, orderData, "八月订单批量报表");直接运行代码,浏览器会自动下载 Excel 文件,表格边框、表头样式完整,数据排版整齐,完全满足日常业务交付标准。
五、项目适配优化与高频踩坑点
1、解决中文乱码问题
代码中已经加入 meta charset="UTF-8" 编码声明,彻底解决原生导出中文乱码问题,无需额外处理。
2、长数字自动变科学计数法
订单号、身份证号等长数字,Excel 默认会转为科学计数法。如果需要保留完整文本格式,可在拼接时给单元格加文本格式适配,完美解决格式错乱。
3、大数据量导出卡顿优化
上万条数据批量导出时,建议结合分片渲染拼接HTML,避免一次性拼接超大字符串导致页面卡顿,我日常项目中万级数据完全流畅无压力。
4、自动释放资源
很多简易教程忘记销毁 a 标签和 URL 对象,频繁导出会造成轻微内存堆积,本代码已做完整资源释放处理,长期使用更稳定。
六、原生方案优缺点总结
优点:
1、零第三方依赖、零打包冗余、轻量化;
2、代码可控,自定义表头、样式、字段极其灵活;
3、兼容性极强,兼容所有现代浏览器、低版本IE;
4、支持任意批量数组数据,适配所有后台表格场景。
缺点:
仅支持 .xls 格式,不支持复杂 .xlsx 高级样式、多 sheet 工作表。日常业务简单批量导出完全够用,复杂高级导出场景可按需引入插件。
七、适用业务场景
✅ 后台管理系统简单数据导出、批量报表导出;
✅ 中小型项目,不想引入多余第三方依赖;
✅ 需要自定义表头、自定义文件名、轻量化导出功能;
✅ 迭代老项目,替换老旧插件导出方案。
写在最后
很多时候我们习惯性依赖第三方库,却忽略了 JS 原生能力的强大。Excel 批量导出作为通用基础功能,完全没必要为了简单需求引入重型插件。
这套无依赖原生导出代码,我在多个生产项目稳定落地使用,轻量、无bug、维护方便。大家可以直接复制到项目中封装成工具函数,全局复用,彻底告别 Excel 插件依赖,让项目代码更轻量化、更优雅。