js生成xlsx/xls格式模板文件并下载到本地

1,901 阅读1分钟

xlsxPackage.js

import XLSX from 'xlsx'
// 字符串转ArrayBuffer
const s2ab = function (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;
}
//导出excel相关函数
const sheet2blob = function (sheet, sheetName = 'sheet1') {//将文件转换为二进制文件
    var workbook = {
        SheetNames: [sheetName],
        Sheets: {}
    };
    workbook.Sheets[sheetName] = sheet;
    // 生成excel的配置项
    var wopts = {
        bookType: 'xlsx', // 要生成的文件类型
        bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        type: 'binary'
    };
    var wbout = XLSX.write(workbook, wopts);
    var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
    
    return blob;
}
const openDownloadXLSXDialog = function (url, saveName){//下载模板文件
    if(typeof url == 'object' && url instanceof Blob){
        url = URL.createObjectURL(url); // 创建blob地址
    }
    
    var aLink = document.createElement('a');
    aLink.href = url;
    aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
    var event;
    if(window.MouseEvent) event = new MouseEvent('click');
    else{
        event = document.createEvent('MouseEvents');
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    }
    aLink.dispatchEvent(event);
}

export default {
    XLSX,
    sheet2blob,
    openDownloadXLSXDialog
}

使用

import xlxsPackage from 'utils/xlxsPackage.js'

handleDownloadXLXSTemplate () {
    const array = [['问题', '回答']]
    const sheet = xlsxPackage.XLSX.utils.aoa_to_sheet(array)
    const blob = xlsxPackage.sheet2blob(sheet)
    xlsxPackage.openDownloadXLSXDialog(blob, 'XXX.xlsx');
}

文章参考js生成xlsx/xls格式文件并下载到本地