【导出Excel】 JS的Excel导出库 Export2Excel
Export2Excel库默认放在ElementUI-Admin项目的src/vendor包中
不是通过package.json安装的依赖
这里直接贴库的源码:
/* eslint-disable */
require('script-loader!file-saver');
import XLSX from 'xlsx' function generateArray(table) {
var out = [];
var rows = table.querySelectorAll('tr');
var ranges = [];
for (var R = 0; R < rows.length; ++R) {
var outRow = [];
var row = rows[R];
var columns = row.querySelectorAll('td');
for (var C = 0; C < columns.length; ++C) {
var cell = columns[C];
var colspan = cell.getAttribute('colspan');
var rowspan = cell.getAttribute('rowspan');
var cellValue = cell.innerText;
if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; //Skip ranges
ranges.forEach(function (range) {
if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
}
}); //Handle Row Span
if (rowspan || colspan) {
rowspan = rowspan || 1;
colspan = colspan || 1;
ranges.push({
s: {
r: R,
c: outRow.length
},
e: {
r: R + rowspan - 1,
c: outRow.length + colspan - 1
}
});
}; //Handle Value
outRow.push(cellValue !== "" ? cellValue : null); //Handle Colspan
if (colspan)
for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
}
out.push(outRow);
}
return [out, ranges];
}; function datenum(v, date1904) {
if (date1904) v += 1462;
var epoch = Date.parse(v);
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
} function sheet_from_array_of_arrays(data, opts) {
var ws = {};
var range = {
s: {
c: 10000000,
r: 10000000
},
e: {
c: 0,
r: 0
}
};
for (var R = 0; R != data.length; ++R) {
for (var C = 0; C != data[R].length; ++C) {
if (range.s.r > R) range.s.r = R;
if (range.s.c > C) range.s.c = C;
if (range.e.r < R) range.e.r = R;
if (range.e.c < C) range.e.c = C;
var cell = {
v: data[R][C]
};
if (cell.v == null) continue;
var cell_ref = XLSX.utils.encode_cell({
c: C,
r: R
}); if (typeof cell.v === 'number') cell.t = 'n';
else if (typeof cell.v === 'boolean') cell.t = 'b';
else if (cell.v instanceof Date) {
cell.t = 'n';
cell.z = XLSX.SSF._table[14];
cell.v = datenum(cell.v);
} else cell.t = 's'; ws[cell_ref] = cell;
}
}
if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
return ws;
} function Workbook() {
if (!(this instanceof Workbook)) return new Workbook();
this.SheetNames = [];
this.Sheets = {};
} function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
} export function export_table_to_excel(id) {
var theTable = document.getElementById(id);
var oo = generateArray(theTable);
var ranges = oo[1]; /* original data */
var data = oo[0];
var ws_name = "SheetJS"; var wb = new Workbook(),
ws = sheet_from_array_of_arrays(data); /* add ranges to worksheet */
// ws['!cols'] = ['apple', 'banan'];
ws['!merges'] = ranges; /* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws; var wbout = XLSX.write(wb, {
bookType: 'xlsx',
bookSST: false,
type: 'binary'
}); saveAs(new Blob([s2ab(wbout)], {
type: "application/octet-stream"
}), "test.xlsx")
} export function export_json_to_excel({
multiHeader = [],
header,
data,
filename,
merges = [],
autoWidth = true,
bookType= 'xlsx'
} = {}) {
/* original data */
filename = filename || 'excel-list'
data = [...data]
data.unshift(header); for (let i = multiHeader.length-1; i > -1; i--) {
data.unshift(multiHeader[i])
} var ws_name = "SheetJS";
var wb = new Workbook(),
ws = sheet_from_array_of_arrays(data); if (merges.length > 0) {
if (!ws['!merges']) ws['!merges'] = [];
merges.forEach(item => {
ws['!merges'].push(XLSX.utils.decode_range(item))
})
} if (autoWidth) {
/*设置worksheet每列的最大宽度*/
const colWidth = data.map(row => row.map(val => {
/*先判断是否为null/undefined*/
if (val == null) {
return {
'wch': 10
};
}
/*再判断是否为中文*/
else if (val.toString().charCodeAt(0) > 255) {
return {
'wch': val.toString().length * 2
};
} else {
return {
'wch': val.toString().length
};
}
}))
/*以第一行为初始值*/
let result = colWidth[0];
for (let i = 1; i < colWidth.length; i++) {
for (let j = 0; j < colWidth[i].length; j++) {
if (result[j]['wch'] < colWidth[i][j]['wch']) {
result[j]['wch'] = colWidth[i][j]['wch'];
}
}
}
ws['!cols'] = result;
} /* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws; var wbout = XLSX.write(wb, {
bookType: bookType,
bookSST: false,
type: 'binary'
});
saveAs(new Blob([s2ab(wbout)], {
type: "application/octet-stream"
}), `${filename}.${bookType}`);
}
主要使用的API是这两个方法:
// 1、提供一个table表格的dom的id属性的元素值,生成excel数据并导出
export_table_to_excel() // 2、提供JS数据来生成Excel文件
export_json_to_excel()
1、在使用的组件中引入导出库
import { export_json_to_excel } from '@/vendor/Export2Excel'
2、通用的做法是后台提供一个导出数据的接口
返回一个List数据,元素是对象,这里不赘述后台接口的开发
import { getVitalLimitConfigExportData } from '@/api/smrz/setting'
JSON数据格式:
{
"code": 200,
"data": [
{
"areaName": "连江县",
"cityName": "福州市",
"createDate": "2022-07-26 09:20:46",
"id": 6,
"liveScore": 233,
"placeArea": "350122",
"placeCity": "350100",
"placeCode": "3501228412",
"placeName": "天运网吧",
"updateDate": "2022-07-26 09:22:06",
"videoScore": 444
},
{
"areaName": "吉州区",
"cityName": "吉安市",
"createDate": "2021-08-11 10:26:39",
"id": 5,
"liveScore": 0.06,
"placeArea": "362401",
"placeCity": "362400",
"placeCode": "3624018888",
"placeName": "电竞酒店扣点账号",
"updateDate": "2021-08-11 14:47:38",
"videoScore": 0.06
},
{
"areaName": "玉山县",
"cityName": "上饶市",
"createDate": "2021-08-11 10:25:00",
"id": 4,
"liveScore": 0.06,
"placeArea": "362323",
"placeCity": "362300",
"placeCode": "3623230555",
"placeName": "万象测试",
"updateDate": "2021-08-11 10:25:00",
"videoScore": 0.06
},
{
"areaName": "玉山县",
"cityName": "上饶市",
"createDate": "2021-08-11 10:21:24",
"id": 2,
"liveScore": 0.06,
"placeArea": "362323",
"placeCity": "362300",
"placeCode": "3623230236",
"placeName": "网盾236",
"updateDate": "2021-08-11 10:21:24",
"videoScore": 0.06
},
{
"areaName": "信州区",
"cityName": "上饶市",
"createDate": "2021-08-11 09:50:26",
"id": 1,
"liveScore": 0.06,
"placeArea": "362301",
"placeCity": "362300",
"placeCode": "3623230235",
"placeName": "网盾235",
"updateDate": "2021-09-03 09:17:22",
"videoScore": 0.06
}
],
"message": "操作成功!",
"status": "success"
}
3、编写导出方法:
页面编写触发组件,声明绑定的执行方法
<el-button
icon="el-icon-upload2"
@click="exportExcel"
>导出Excel</el-button>
方法实现:
export_json_to_excel的参数有3个必要参数
- sheet页标题头
- sheet页标题头的key
- 格式化后的js数据
标题头 + 标题头的key
excelHeader: [
'场所名称',
'场所编号',
'所属区域',
'图片活体阀值',
'视频活体阀值',
'创建时间',
'更新时间'
],
excelHeaderKey: [
'placeName',
'placeCode',
'areaName',
'liveScore',
'videoScore',
'createDate',
'updateDate'
]
formatJson的作用是把【接口数据】按照【标题头的key】赋值
在这里可以翻译字段,处理特殊字段,或者自定义匹配
v是当前遍历的接口List的对象,j是标题头key的值,也就是字段名
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => {
// console.log(v, j)
if (j === 'areaName') return v['cityName'] + v['areaName']
else return v[j]
}))
}
这里列举以前在外包写的比较复杂的处理:

下面是最后的实现写法
async exportExcel() {
const { data: res } = await getVitalLimitConfigExportData(this.param)
const fileName = spawnExcelFileName('百度云活体阈值配置表')
const data = this.formatJson(this.excelHeaderKey, res)
export_json_to_excel({
header: this.excelHeader,
data: data,
filename: fileName
})
},
最后导出结果:

【导出Excel】 JS的Excel导出库 Export2Excel的更多相关文章
- html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式
先上代码 <script type="text/javascript" language="javascript"> var idTmr; ...
- js实现一键导出Excel
演示地址:https://xibushijie.github.io/static/ExportToExcel.html <!DOCTYPE html> <html lang=&quo ...
- js导出table中的EXCEL总结
导出EXCEL通常是用PHP做,可是项目中,有时候PHP后端project师返回的数据不是我们想要的,作为前端开发project师,把相应的数据编号转换为文字后,展示给用户.可是.需求要把数据同一时候 ...
- js导入excel&导出excel
Excel导入 html代码 <button style={{ color: '#1890ff', fontSize: '14px', cursor: 'pointer' }} onClick= ...
- 导出带图片的Excel——OOXML文件分析
需求: 普通js导出文件excel具有兼容性问题,通过js-xsl导出文件API未找到导出图片的方案,实例过少,因此针对07年后以.xlsx后缀的excel文件,通过修改后缀.zip参考文件模板来实现 ...
- Spring MVC 实现Excel的导入导出功能(1:Excel的导入)
简介 这篇文章主要记录自己学习上传和导出Excel时的一些心得,企业办公系统的开发中,经常会收到这样的需求:批量录入数据.数据报表使用 Excel 打开,或者职能部门同事要打印 Excel 文件,而他 ...
- MVC导出Excel,提供下载Excel
类1: using System.Collections.Generic;using System.Data;using System.Web.Mvc;using System.IO;using Sy ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...
- java 实现Excel压缩成Zip导出
1 概述 在web项目中常见的一种场景就是将文件导出为Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目的友好交互性以及易用性,那么怎么才能优雅的解决这个问题呢?笔者今 ...
- SQL SERVER 和ACCESS、EXCEL的数据导入导出
SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06] 来源:Linux公社 作者:Linux 熟 悉 ...
随机推荐
- itest work 开源接口测试&敏捷测试管理平台 9.5.0 GA_u3,优化及修复关键 BUG
(一)itest work 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...
- http1.1 的默认长连接 Connection: keep-alive 与 TCP KeepAlive 之间区别
HTTP 长连接,也称为 HTTP 持久连接(HTTP Persistent Connection)或 HTTP 连接重用,是一种在 HTTP 协议中实现的机制. 在传统的 HTTP 通信中,每个 H ...
- 分布式定理--CAP定理
cap定理指的是,在一个分布式系统中,只能满足cap中的两项. C consistency 一致性 A availability 可用性 P partition tolerance 分区可容错性 -- ...
- 地址栏hash模式以?问号分割也可以分割的
可以看到href里面hash没有? 但是还是以?分割了 就很不明白 但是我就indexof判断有没有? 再进行下一步逻辑 这里记录一下坑
- poj1163 the triangle 题解
Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a progr ...
- spring之NamedParameterJdbcTemplate返回自增列值
以前使用JdbcTemplate来获取自增列的值,现在发现NamedParameterJdbcTemplate也可以,而且后者大部分情况下,其实更加方便. 这种方便主要是在于代码维护方面:我们更加习惯 ...
- 使用getevent在Android中调试输入子系统
# Android getevent用法详解 背景 在调试安卓设备按键,想使用hexdump,但是发现没有找到,反而找到了这个更好用的工具. 以下是我的调试片段 # getevent -l /dev/ ...
- USB OTG有关协议
想了解USB OTG的工作原理,需要知道三个协议: ADP:Attach Detection Protocol HNP:Host Negotiation Protocol SRP:Session Re ...
- 解析QAnything启动命令过程
一.启动命令过程日志 启动命令bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat.输入日志如下所示: root@MM ...
- CF1864C 题解
\(x = 2^k\) 是好做的,每次以 \(2^{k-1}\) 为因数即可. 对于其他情况,考虑每次让 \(x\) 减去其二进制下最低位的 \(1\) 直至变成 \(2^k\). 这种策略下显然每个 ...