js根据数据(json格式的数据)和列名(英文名)列别名(中文名)导出Excel(多个sheet)

js根据数据(json格式的数据)和列名(英文名)列别名(中文名)导出Excel(多个sheet)



/**
 * 使用数据和列明列别名,导出excel(包含多个sheet)
 * @param tableDataList 数据集合
 * @param columnsAliasList   数据列表头字段
 * @param columnsList   数据列字段
 * @param wsnames       sheet的名字数组
 * @param wbname        工作簿名字
 */
function tablesToExcels3(tableDataList, columnsAliasList, columnsList, wsnames, wbname) {

    var uri = 'data:application/vnd.ms-excel;base64,'
        ,
        tmplWorkbookXML = '<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'
            + '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Author>Axel Richter</Author><Created>{created}</Created></DocumentProperties>'
            + '<Styles>'
            + '<Style ss:ID="Currency"><NumberFormat ss:Format="Currency"></NumberFormat></Style>'
            + '<Style ss:ID="Date"><NumberFormat ss:Format="Medium Date"></NumberFormat></Style>'
            + '</Styles>'
            + '{worksheets}</Workbook>'
        , tmplWorksheetXML = '<Worksheet ss:Name="{nameWS}"><Table>{rows}</Table></Worksheet>'
        , tmplCellXML = '<Cell{attributeStyleID}{attributeFormula}><Data ss:Type="{nameType}">{data}</Data></Cell>'
        , base64 = function (s) {
            return window.btoa(unescape(encodeURIComponent(s)))
        }
        , format = function (s, c) {
            return s.replace(/{(\w+)}/g, function (m, p) {
                return c[p];
            })
        }

    var ctx = "";
    var workbookXML = "";
    var worksheetsXML = "";
    var rowsXML = "";

    for (let i = 0; i < columnsList.length; i++) {

        // 添加表头
        rowsXML += '<Row>';
        for (let j = 0; j < columnsAliasList[i].length; j++) {
            ctx = {
                attributeStyleID: ' ss:StyleID="Currency"',
                nameType: 'String',
                data: columnsAliasList[i][j],
                attributeFormula: ''
            };
            rowsXML += format(tmplCellXML, ctx);
        }
        rowsXML += '</Row>'

        let columns = columnsList[i];
        for (let k = 0; k < tableDataList[i].length; k++) {
            rowsXML += '<Row>';
            for (let j = 0; j < columns.length; j++) {
                ctx = {
                    attributeStyleID: ' ss:StyleID=""',
                    nameType: 'String',
                    data: tableDataList[i][k][columns[j]],
                    attributeFormula: ''
                };
                rowsXML += format(tmplCellXML, ctx);
            }
            rowsXML += '</Row>'
        }

        ctx = {rows: rowsXML, nameWS: wsnames[i] || 'Sheet' + i};
        worksheetsXML += format(tmplWorksheetXML, ctx);
        rowsXML = "";

    }

    ctx = {created: (new Date()).getTime(), worksheets: worksheetsXML};
    workbookXML = format(tmplWorkbookXML, ctx);

    var link = document.createElement("A");
    link.href = uri + base64(workbookXML);
    link.download = wbname || 'Workbook.xls';
    link.target = '_blank';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起去彩虹海吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值