import XLSX from 'xlsx';
/**
* 单个sheet下载
* @param {object[]} json json
* @param {object} tableTitle excel表头名称
* @param {string} fileName 文件名称
* @param {object} wbConfig 扩展
* @param {object} woptsConfig 扩展
*/
function json2Excel(json,tableTitle,fileName,wbConfig={},woptsConfig={}) {
let wopts = {
bookType: 'xlsx',
bookSST: false,
type: 'binary'
};
let workBook = {
SheetNames: ['Sheet1'],
Sheets: {},
Props: {}
};
json = [tableTitle,...json];
workBook.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(json,{skipHeader:true}); // skipHeader 忽略原来的表头
//3、XLSX.write() 开始编写Excel表格
//4、changeData() 将数据处理成需要输出的格式
saveAs(new Blob([changeData(XLSX.write({...workBook,...wbConfig}, {...wopts,...woptsConfig}))], {type: 'application/octet-stream'}),fileName)
}
/**
* 多个sheet下载
* @param {object} data
* @param data.Sheet1.title {}
* @param data.Sheet1.data []
* @param {string} fileName 文件名称
* data格式
* {
'sheet1':{
title:{name:'名字',age:'年龄'},
json:[{name:'sd',age:1999}]
},
'sheet2':{
title:{name:'名字',age:'年龄'},
json:[{name:'z',age:195}]
},
}
*/
function json2ExcelMultiSheet(data,fileName){
let wopts = {
bookType: 'xlsx',
bookSST: false,
type: 'binary'
};
let workBook = {
SheetNames: [],
Sheets: {},
Props: {}
};
let keys = Object.keys(data);
keys.forEach(key=>{
let json = [data[key].title,...data[key].json];
workBook.SheetNames.push(key);
workBook.Sheets[key] = XLSX.utils.json_to_sheet(json,{skipHeader:true}); // skipHeader 忽略原来的表头
})
// XLSX.write() 开始编写Excel表格
//changeData() 将数据处理成需要输出的格式
saveAs(new Blob([changeData(XLSX.write(workBook, wopts))], {type: 'application/octet-stream'}),fileName)
}
function changeData(s) {
//如果存在ArrayBuffer对象(es6) 最好采用该对象
if (typeof ArrayBuffer !== 'undefined') {
//1、创建一个字节长度为s.length的内存区域
let buf = new ArrayBuffer(s.length);
//2、创建一个指向buf的Unit8视图,开始于字节0,直到缓冲区的末尾
let view = new Uint8Array(buf);
//3、返回指定位置的字符的Unicode编码
for (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
} else {
let buf = new Array(s.length);
for (let i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
}
function saveAs(obj, fileName) {//当然可以自定义简单的下载文件实现方式
let tmpa = document.createElement("a");
tmpa.download = fileName || "下载";
tmpa.href = URL.createObjectURL(obj); //绑定a标签
tmpa.click(); //模拟点击实现下载
setTimeout(function () { //延时释放
URL.revokeObjectURL(obj); //用URL.revokeObjectURL()来释放这个object URL
}, 100);
}
export {
json2Excel,
json2ExcelMultiSheet
}
使用xlsx-js插件将JSON转换为excel并导出
最新推荐文章于 2025-06-12 13:48:17 发布