前端实现导出功能

主要是利用XML文件和Excel文件之间可以互相转换,因此可以将XML数据从web服务中导出到Excel中

下面是实现代码和注释(因为一般导出都是导出table的数据,所以直接整table):

function tableToExcel(titleList = [], dataSource = [], fileName = "") {
    // titleList:要导出的标题
    // dataSource:处理的数据,源数据
    // fileName:导出文件默认名
    // 这样做是为了在很多数据的时候 导出自己想要的数据
    let newDataSource = []
    for (let i = 0; i < dataSource.length; i++) {
        let tep = {};
        titleList.forEach(({ key }) => { //key是colums中的每个key(name..age...)
            tep[key] = dataSource[i][key] // 只取出titleList中对应的数据,就是需要的数据
        })
        newDataSource.push(tep)
    }
    let str = '<tr>'; // 需要导出的数据
    for (let i = 0; i < titleList.length; i++) {
        str += `<td>${titleList[i].title + '\t'}</td>`; // 进行字符串拼接, 拼接出表头
    }
    str += '</tr>';
    str += '<tr>'; // 下面是table的内容拼接
    for (let i = 0; i < newDataSource.length; i++) {
        for (let item in newDataSource[i]) {
            let news = newDataSource[i][item] || newDataSource[i][item] === 0 ? newDataSource[i][item] : "";
            //style="mso-number-format:\'@\'" => 代表在excel中的科学计数
            //\t制表符 tab到下一行
            str += `<td style="mso-number-format:\'@\'">${news + '\t'}</td>`;
        }
        str += '</tr>';
    }
    // 这是一种数据URL编码格式,在这个编码格式下,数据以base64加密的方法嵌入到URI中,用于表示Excel格式的文件数据
    // 具体的说:`data:application/vnd.ms-excel`部分表示这是一种excel格式的文件
    // 而`base64`部分则表示数据被编码成Base64字符串
    // 整个数据URI中的数据部分是经过base64编码后的数据
    var uri = 'data:application/vnd.ms-excel;base64,';

    // 导出的模板
    var template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:x="urn:schemas-microsoft-com:office:excel" 
    xmlns="http://www.w3.org/TR/REC-html40">
    <head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
      <!-- 导出文件的名称fileName -->
      <x:Name>${fileName}</x:Name>
      <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
      </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
      <!-- 导出文件的内容str -->
      </head><body><table>${str}</table></body></html>`;

    // `btoa`是将二进制字符串编码为`base64编码`的`ASCLL`字符串
    // `encodeURIComponent`通过将特定字符的每个实例替换成代表字符的`UTF-8`编码的一个、两个、三个或四个转义序列来编码`URI`,并且比`encodeURI`能编码更多
    // `decodeURI`能解码由`encodeURI`创建或其他流程得到的统一资源标识符
    var base64 = function (s) { return window.btoa(decodeURI(encodeURIComponent(s))) }
    var link = document.createElement("a");
    link.href = uri + base64(template); // 设置链接
    link.download = fileName ? fileName + ".xls" : "数据.xls";//当前下载的excel名称
    document.body.appendChild(link);
    link.innerHTML = "点击下载"
    console.log(unescape(encodeURIComponent(template)))
    link.click();
    document.body.removeChild(link);
}
posted @ 2023-06-06 09:41  卿六  阅读(220)  评论(0编辑  收藏  举报