纯前端导出Excel需要两个依赖,xlsx和file-saver
话不多说,上代码:
import XLSX from "xlsx";//必要依赖
import FileSaver from "file-saver";//必要依赖
import {Message} from "antd"
import _ from "lodash"
import moment from "moment"
class ExportExcel extends Component{
constructor(){
super()
this.state={
exportData:[{//模拟的JSON数据
id:1,
key1:"value1",
key2:"value2",
key3:"value3",
key4:"value4",
key5:"value5",
key6:"value6",
}]
}
}
componentWillMount(){
}
//三个参数,title是生成的Excel文件名,headers是文件的头部,values为具体的json数据
exportList=(title, headers, values)=>{
try {
//如果value的json字段的key值和想要的headers值不一致时,可做如下更改
//将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
const keyMap = {id:"headerId",key1:"header1",key2:"header2",key3:"header3",key4:"header4",key5:"header5",key6:"header6"}
const data = _.chain(values)
.map(i => {
let ne = _.cloneDeep(i);
const rzt = {
..._.pick(ne, headers),
};
//改变key值为要求的excel的title值,但是edge不兼容,ca
// const newRzt = Object.fromEntries(Object.entries(rzt).map(([k, v]) => [keyMap[k]||k, v]))
const newRzt= Object.keys(rzt).reduce((newData, key) => {//上面的方法不兼容,所以用了这个方法处理headers
let newKey = keyMap[key] || key
newData[newKey] = rzt[key]
return newData
}, {})
return newRzt;
})
.value();
if (_.isEmpty(values)) {
console.log("没数据")
return;
}
const workbook = XLSX.utils.book_new();//创建一个新的工作簿对象
let ws = XLSX.utils.json_to_sheet(data);//将json对象数组转化成工作表
ws["!cols"]=[//设置每一列的宽度
{wch:30},
{wch:50},
{wch:20},
{wch:20},
{wch:20},
{wch:20},
{wch:50}
]
XLSX.utils.book_append_sheet(workbook, ws, "sheet1");//把sheet添加到workbook里,第三个参数是sheet名
const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} ${moment().format("YYYYMMDDHHmmss")}.xlsx`);//保存文件
} catch (e) {
console.log(e, e.stack);
}
};
render(){
<div>
<button onClick={this.exportList.bind(this,"exportList",["id","key1","key2","key3","key4","key5","key6"],this.state.exportData)}>export</button>
</div>
)
}
}
export default ExportExcel
如果对您有一丝帮助的话,赏个赞可好~
总体思路如下:
- 创建一个新的工作簿对象
- 将json对象转化成工作表
- 将工作表(sheet)添加到工作簿(workbook)里
- XLSX.write(workbook,opts)写入文件
- 利用file-saver保存文件
本文详细介绍如何使用xlsx和file-saver两个依赖在纯前端环境下实现JSON数据导出至Excel的功能,包括数据处理、样式设置及文件保存的全过程。
673

被折叠的 条评论
为什么被折叠?



