1.xlsx简介
- 通俗的说,xlsx这个插件可以把html中的table元素或者json数据转换成表格后进行导出
- 也可以解析表格文件,将其转换成json格式的数据
- 引入插件:只做参考,推荐上官方文档下载最新版官方文档
<script src="https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"></script>
2.基本概念
一个excel文件就是一个book,一个book中又包含一个或多个sheet,以下方法均由XLSX.utils对象调用
常用方法 |
参数 |
说明 |
book_new |
- |
创建一个空的book |
table_to_book |
table元素(dom) |
将table元素转换成 book |
table_to_sheet |
table元素(dom) |
将table元素转换成 sheet |
json_to_sheet |
json数据(数组) |
将json数据转换成 sheet |
book_append_sheet |
参数1:book对象,参数2:sheet对象,参数3:sheet名称 |
将sheet添加到book中 |
writeFile |
参数1:book对象,参数2:导出的文件名称 |
导出表格文件 |
3.JSON转表格
var print_data = [
{'id':1,'name':'张三','age':20},
{'id':2,'name':'李四','age':25},
{'id':3,'name':'王五','age':30}
]
var print_data2 = [
[1,'张三',20],
[2,'李四',25],
[3,'王五',30]
]
exportEvent () {
const new_sheet = XLSX.utils.json_to_sheet(print_data)
new_sheet['!cols'] = [
{ wch: 10 },
{ wch: 30 },
{ wch: 25 }
]
const new_book = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(new_book, new_sheet, '人员名单')
XLSX.writeFile(new_book, '人员名单.xlsx')
}
- 表头标题替换:实际使用过程中,表格列标题可能需要的是中文标题,而是不下标或者是英文,可以通过特定方法,将json数据的key进行转换后在执行导出
replaceKeyForTableData(tableData = [],mapData = {}){
var result = []
tableData.forEach(row=>{
var new_row = {}
Object.keys(row).forEach(key=>{
var new_key = mapData[key]? mapData[key]:key
new_row[new_key] = row[key]
})
result.push(new_row)
})
return result
}
var mapData = {
id: "序号",
name:"姓名",
age:"年龄"
}
var print_data = replaceKeyForTableData(print_data,mapData)
4.HTML-table转表格
var table_dom = document.querySelector('table')
const new_book = XLSX.utils.table_to_book(table_dom)
XLSX.writeFile(new_book, '数据导出.xlsx')
- 导出插件生成的表格:插件生成的表格因为兼容一些功能,最终渲染的时候其实是2个table元素,为了能将表格完整的导出(thead+body),需要手动拼接dom
exportEvent () {
var print_table_dom = document.createElement('table')
var print_table_dom_thead = this.$refs.p_table.$el.querySelector('.vxe-table--header-wrapper > .vxe-table--header thead').cloneNode(true)
var print_table_body = this.$refs.p_table.$el.querySelector('.vxe-table--body-wrapper > .vxe-table--body tbody').cloneNode(true)
print_table_dom.appendChild(print_table_dom_thead)
print_table_dom.appendChild(print_table_body)
const new_sheet = XLSX.utils.table_to_book(print_table_dom)
XLSX.writeFile(new_sheet, '数据导出.xlsx')
},
- 数字格式的问题:excel时,以0开头的数据,其开头0被忽略,如001234导出到excel后变为了1234,只需要将dom转换为book的时候,传入第二个参数即可
const new_book = XLSX.utils.table_to_book(table_dom,{raw:true})
5.jsonToxlsx封装
- 用于导出表格数据(json),在xlsl.js基础上封装了列宽自适应,表头标题替换功能,代码已上传至gitee,地址
- 表格数据格式
var tableData = [
{id: 1, name:"张三",age:20},{id:2, name:"李四",age:20},{id:3, name:"王五",age:20}
]
var tHeadMap = {
id: "序号", name: "姓名", age: "年龄"
}
jsonToxlsx(tableData, tHeadMap)
6.xlsxTojson封装
- 文件读取:借助文件域+H5的FileReader对文件进行读取
- 一次转码:使用XLSX对FileReader读取到的数据转换成bookData
- 二次转码:再借助XLSX的方法将上个步骤的数据转换成csvData
- 三次转码:自行将csvData转换为json数据,已针对常见的表格结构做了转换规则,代码已上传至gitee,地址
- 引入插件
<script src="./xlsx.full.min.js"></script>
<script src="./xlsxTojson.js"></script>
- 参数说明:xlsxTojson(file, options)
参数 |
说明 |
file |
使用文件域选择的文件 |
options.Thead |
是否带表头,默认否 |
options.TheadConfig |
自定义表头配置 |
var fileNode = document.querySelector("#file")
fileNode.addEventListener('change',function(){
var file = fileNode.files[0]
xlsxTojson(file)
})
xlsxTojson(file, {
Thead: true,
})
xlsxTojson(file, {
Thead: true,
TheadConfig: {
id: "序号",
name: "姓名",
age: "年龄"
},
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了