当前位置:网站首页>基于el-table的树形表格及js-xlsx实现下载excel功能(二)
基于el-table的树形表格及js-xlsx实现下载excel功能(二)
2022-07-23 05:39:00 【一条大河全靠浪】
这篇主要是利用xlsx下载表格,网上参考的资料挺多的
一、安装xlsx
我用到的也就前三个
就最简单的使用来说:
aoa_to_sheet 就是把一个数组arr塞到一个sheet页中,arr类似于这种结构
arr = [
['姓名', '年龄', '性别'],
['张三', '18', '男'],
['李四', '23', '女'],
]
json_to_sheet 的json数据长下面这样, 它会自动将键值变成表头,注意键值不能重复
arr = [
{
'姓名': '张三', '年龄': '18', '性别': '男'},
{
'姓名': '李四', '年龄': '23', '性别': '女'}
]
table_to_sheet 的最简单,你页面就显示了这么个表格,直接获取dom,再将这个dom作为参数就行了 。
最终下载的excel都是下面这样
二、下载的表出现科学计数法
当数据较长,超过了10位时, excel打开显示的是科学计数。 主要原因是单元格将其看做数值处理,网上有解决办法是给td加 style="mso-number-format:'\@';", 但似乎没有用,看xlsx文档,发现将raw设置为true, 即将其看做字符串处理
raw: If true, every cell will hold raw strings
// raw为true的作用是把数字当成string
var sheet = XLSX.utils.table_to_sheet(objE.childNodes[0], {
raw: true })
三、代码
设置excel样式
xlsx 目前更改的样式有限,只能设置列宽,合并单元格等,更复杂的样式修改可以看看xlsx-style
setExcelStyle() {
const obj = {
}
const colsNum = this.cmpColumns.length
// 动态添加列宽
for(let i = 0; i < colsNum; i++){
obj['!cols'].push({
wch: 15 })
}
/** 合并单元格 - 合并第一列的一二行 obj['!merges'] = [{ s: { // 开始 c: 0, r: 0, // 0 行 }, e: { // 结束 c: 0, r: 1, // 1行 }, }] */
return obj
},
写成工具函数
/* * 工具函数 * @FilePath: assets\js\excel.js */
import XLSX from 'xlsx'
function s2ab(s) {
if (typeof ArrayBuffer !== 'undefined') {
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
} else {
var buf = new Array(s.length);
for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
}
function type2Excel({
data, style, type = "json", header = [], skipHeader = false}) {
//1、XLSX.utils.json_to_sheet(data) 接收一个对象数组并返回一个基于对象关键字自动生成的“标题”的工作表,默认的列顺序由使用Object.keys的字段的第一次出现确定
//2、将数据放入对象workBook的Sheets中等待输出
let sheet = null
switch (type) {
case 'json':
sheet = Object.assign(XLSX.utils.json_to_sheet(data, {
header, skipHeader}), style)
break
case 'aoa':
sheet = Object.assign(XLSX.utils.aoa_to_sheet(data), style)
break
case 'dom':
sheet = Object.assign(XLSX.utils.table_to_sheet(data, {
raw: true }), style)
break
default:
break
}
return sheet
}
/** * @description: 传入一个数组,数组对象内容为 sheetName, data, style, type = "json", header = {}, skipHeader = true * @param {*} sheets * @return {*} */
function genExcel(sheets){
var wopts = {
bookType: 'xlsx',
bookSST: false,
type: 'binary'
};
var workBook = {
SheetNames: [],
Sheets: {
},
Props: {
}
};
for(let sheet of sheets){
const name = sheet.sheetName
workBook.SheetNames.push(name)
workBook.Sheets[name] = type2Excel(sheet)
}
//3、XLSX.write() 开始编写Excel表格 , s2ab() 将数据处理成需要输出的格式
const blob = new Blob([s2ab(XLSX.write(workBook, wopts))], {
type: 'application/octet-stream'
})
return blob
}
export {
s2ab,
type2Excel,
genExcel
}
模拟a标签,点击下载函数
/* * @Description: post方式的接口,或者前端下载使用 * @FilePath: assets\js\PostDLFile.js */
export default function postDLFile(data, name) {
let blob = data
let reader = new FileReader()
reader.readAsDataURL(blob)
reader.onload = (e) => {
let a = document.createElement('a')
a.download = `${
name}.xlsx`
a.href = e.target.result
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
}
}
下载使用
downloadOrg(){
// 这个函数就是你自己处理数据的函数,数据长啥样调啥样的接口
const data = this.genJsonForExcel()
const style = this.setExcelStyle()
const sheets = [{
sheetName:'机构数据', data, style, 'json'}]
postDLFile(genExcel(sheets), '下载的excel名字')
},
边栏推荐
- js高阶函数
- Differences and basic operations of shell/sh/bash
- 第一篇博客
- JS event loop
- js的call、apply、bind
- TypeScript 高级类型
- 2. Analysis of the return value of the startup function
- JS higher order function
- [C language] what is a function? Classification and emphasis of functions (help you quickly classify and remember functions)
- 【C语言】什么是函数?函数的分类和侧重(帮你快速分类和记忆函数)
猜你喜欢

从零开始的pytorch小白使用指北

Large factory interview machine learning algorithm (0): Feature Engineering | data preprocessing

DWI图像 从DICOM Tag识别 b value 的方法

Web server failed to start. Port 8080 was already in use.

Error when PLSQL creates Oracle Database: when using database control to configure the database, it is required to configure the listener in the current Oracle home directory. You must run netca to co

Install enterprise pycharm and Anaconda

Common errors in C language debugging -- brief answer

大厂面试机器学习算法(0):特征工程 | 数据预处理

用getchar清理缓冲区(强烈推荐,C语言易错典型)

Markdown common syntax records
随机推荐
When v-show is used with display:flex in the uni app applet, v-show does not take effect!
Request data acquisition and response
js中类数组对象以及类数组转换的方法(ES6, ES5)
Analysis of flask source code (I) request entry
$attrs中的对象没有变化,但触发了watch监听?
分页、过滤
[untitled]
PyGame realizes the airplane war game
大厂面试机器学习算法(5)推荐系统算法
C语言中的流氓goto语句
RPC与thrift入门
transform: translate(-50%, -50%)边框问题
Transform: translate (-50%, -50%) border problem
Differences and basic operations of shell/sh/bash
JS event loop
Getting started with RPC and thrift
Anti shake and throttling of JS
Matrix vector derivation in machine learning
[Doris]配置和基本使用contens系统(有时间继续补充内容)
[flink]flink on yarn之flink-conf最简单配置