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的更多相关文章

  1. 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; ...

  2. js实现一键导出Excel

    演示地址:https://xibushijie.github.io/static/ExportToExcel.html <!DOCTYPE html> <html lang=&quo ...

  3. js导出table中的EXCEL总结

    导出EXCEL通常是用PHP做,可是项目中,有时候PHP后端project师返回的数据不是我们想要的,作为前端开发project师,把相应的数据编号转换为文字后,展示给用户.可是.需求要把数据同一时候 ...

  4. js导入excel&导出excel

    Excel导入 html代码 <button style={{ color: '#1890ff', fontSize: '14px', cursor: 'pointer' }} onClick= ...

  5. 导出带图片的Excel——OOXML文件分析

    需求: 普通js导出文件excel具有兼容性问题,通过js-xsl导出文件API未找到导出图片的方案,实例过少,因此针对07年后以.xlsx后缀的excel文件,通过修改后缀.zip参考文件模板来实现 ...

  6. Spring MVC 实现Excel的导入导出功能(1:Excel的导入)

    简介 这篇文章主要记录自己学习上传和导出Excel时的一些心得,企业办公系统的开发中,经常会收到这样的需求:批量录入数据.数据报表使用 Excel 打开,或者职能部门同事要打印 Excel 文件,而他 ...

  7. MVC导出Excel,提供下载Excel

    类1: using System.Collections.Generic;using System.Data;using System.Web.Mvc;using System.IO;using Sy ...

  8. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    * 说明:复制表(只复制结构,源表名:a 新表名:b)      select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...

  9. java 实现Excel压缩成Zip导出

    1 概述 在web项目中常见的一种场景就是将文件导出为Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目的友好交互性以及易用性,那么怎么才能优雅的解决这个问题呢?笔者今 ...

  10. SQL SERVER 和ACCESS、EXCEL的数据导入导出

    SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06]     来源:Linux公社  作者:Linux 熟 悉 ...

随机推荐

  1. 使用C代码实现读取文件中的hex字符串,转换为字节数组

    举例说明: ptp.txt文件中的内容为: 7a7ac0a8c80100000000003388f70002002c000004000000000000000000000000000000000000 ...

  2. 终于搞懂了!原来vue3中template使用ref无需.value是因为这个

    前言 众所周知,vue3的template中使用ref变量无需使用.value.还可以在事件处理器中进行赋值操作时,无需使用.value就可以直接修改ref变量的值,比如:<button @cl ...

  3. webpack配置图片处理

    # 安装 npm i -D url-loader html-loader file-loader # loader配置 module: { rules: [ // 图片处理 { test: /\.(p ...

  4. NSSCTF——crypto

    [鹤城杯 2021]easy_crypto [强网拟态 2021]拟态签到题 [SWPUCTF 2021 新生赛]crypto8[SWPUCTF 2021 新生赛]crypto7[SWPUCTF 20 ...

  5. 百度面试:如何用Redis实现限流?

    高并发系统有三大特征:限流.缓存和熔断,所以限流已经成为当下系统开发中必备的功能了.那么,什么是限流?如何实现限流?使用 Redis 能不能实现限流?接下来我们一起来看. 1.什么是限流? 限流是指在 ...

  6. 字节面试:MySQL自增ID用完会怎样?

    在一些中小型项目开发中,我们通常会使用自增 ID 来作为主键的生成策略,但随着时间的推移,数据库的信息也会越来越多,尤其是使用自增 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的情 ...

  7. Navicat Premium v16.0.6 绿色破解版

    这里版本:Navicat Premium v16.0.6.0 ,这个是绿色版,不需要安装,启动Navicat.exe即可用 破解工具:NavicatKeygenPatch(其它版本也能破解) 1.下载 ...

  8. 盘点 Spring Boot 解决跨域请求的几种办法

    熟悉 web 系统开发的同学,对下面这样的错误应该不会太陌生. 之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击 web 服务器盗取数据. 01.什么是跨域请 ...

  9. 更难、更好、更快、更强:LLM Leaderboard v2 现已发布

    摘要 评估和比较大语言模型 (LLMs) 是一项艰巨的任务.我们 RLHF 团队在一年前就意识到了这一点,当时他们试图复现和比较多个已发布模型的结果.这几乎是不可能完成的任务:论文或营销发布中的得分缺 ...

  10. Android系统启动:2-Init篇

    Android系统启动:Init篇 原文:http://gityuan.com/2016/02/05/android-init/ 概述 init进程是Linux系统中用户空间的第一个进程,进程号固定为 ...