zoukankan      html  css  js  c++  java
  • JS实现纯前端将数据导出Excel两种方式亲测有效

    由于项目需要,需要在不调用后台接口的情况下,将json数据导出到excel表格,参考了好多资料以及很多大佬写的博客终于实现,兼容chrome没问题,其他还没有测试过,这边介绍两种实现方式,并附上代码和gif动图,博主不才还望轻喷,代码可直接copy运行

    方法一

    将table标签,包括tr、td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html,代码如下:

    <html>
    <meta charset="UTF-8">
    <head>
        <p style="font-size: 20px;color: red;">使用table标签方式将json导出xls文件</p>
        <button onclick='tableToExcel()'>导出</button>
    </head>
    <body>
        <script>  
        const tableToExcel = () => {
            // 要导出的json数据
            const jsonData = [
                {
                    name:'路人甲',
                    phone:'123456',
                    email:'123@123456.com'
                },
                {
                    name:'炮灰乙',
                    phone:'123456',
                    email:'123@123456.com'
                },
                {
                    name:'土匪丙',
                    phone:'123456',
                    email:'123@123456.com'
                },
                {
                    name:'流氓丁',
                    phone:'123456',
                    email:'123@123456.com'
                },
            ]
            // 列标题
            let str = '<tr><td>姓名</td><td>电话</td><td>邮箱</td></tr>';
            // 循环遍历,每行加入tr标签,每个单元格加td标签
            for(let i = 0 ; i < jsonData.length ; i++ ){
                str+='<tr>';
                for(const key in jsonData[i]){
                    // 增加	为了不让表格显示科学计数法或者其他格式
                    str+=`<td>${ jsonData[i][key] + '	'}</td>`;     
                }
                str+='</tr>';
            }
            // Worksheet名
            const worksheet = 'Sheet1'
            const uri = 'data:application/vnd.ms-excel;base64,';
     
            // 下载的表格模板数据
            const 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">
            <meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">
            <meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">
            <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
            <x:Name>${worksheet}</x:Name>
            <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
            </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
            </head><body><table>${str}</table></body></html>`;
            // 下载模板
            window.location.href = uri + base64(template);
        };
     
        // 输出base64编码
        const base64 = s => window.btoa(unescape(encodeURIComponent(s)));
        </script>
    </body>
    </html>

    方法二

    通过将json遍历进行字符串拼接,将字符串输出到csv文件,代码如下:

    <html>
    <head>
        <p style="font-size: 20px;color: red;">使用a标签方式将json导出csv文件</p>
        <button onclick='tableToExcel()'>导出</button>
    </head>
    <body>
        <script>
        const tableToExcel = () => {
            // 要导出的json数据
            const jsonData = [
                {
                    name:'路人甲',
                    phone:'123456789',
                    email:'000@123456.com'
                },
                {
                    name:'炮灰乙',
                    phone:'123456789',
                    email:'000@123456.com'
                },
                {
                    name:'土匪丙',
                    phone:'123456789',
                    email:'000@123456.com'
                },
                {
                    name:'流氓丁',
                    phone:'123456789',
                    email:'000@123456.com'
                },
            ];
            // 列标题,逗号隔开,每一个逗号就是隔开一个单元格
            let str = `姓名,电话,邮箱
    `;
            // 增加	为了不让表格显示科学计数法或者其他格式
            for(let i = 0 ; i < jsonData.length ; i++ ){
                for(const key in jsonData[i]){
                    str+=`${jsonData[i][key] + '	'},`;     
                }
                str+='
    ';
            }
            // encodeURIComponent解决中文乱码
            const uri = 'data:text/csv;charset=utf-8,ufeff' + encodeURIComponent(str);
            // 通过创建a标签实现
            const link = document.createElement("a");
            link.href = uri;
            // 对下载的文件命名
            link.download =  "json数据表.csv";
            link.click();
        }
        </script>
    </body>
    </html>

    封装成方法

    function exportExcel(JSONData, FileName, title, filter) {
        if (!JSONData) return;
        //转化json为object
        var arrData = typeof JSONData != "object" ? JSON.parse(JSONData) : JSONData;
        var excel = "<table>";
        //设置表头
        var row = "<tr>";
        if (title) { //使用标题项
          for (var i in title) {
              if (filter.indexOf(i) == -1) {
                  row += "<th align='center'>" + title[i] + "</th>";
              }
          }
        } else {//不使用标题项
          for (var i in arrData[0]) {
              if (filter.indexOf(i) == -1) {
                  row += "<th align='center'>" + i + "</th>";
              }
          }
        }
        excel += row + "</tr>";
        //设置数据
        for (var i = 0; i < arrData.length; i++) {
          var row = "<tr>";
          for (var index in arrData[i]) {
            if (filter.indexOf(index) == -1) {
                var value = arrData[i][index] == null ? "" : arrData[i][index];
                row += "<td align='center'>" + value + "</td>";
            }
          }
          excel += row + "</tr>";
        }
        excel += "</table>";
        var excelFile =
          "<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'>";
        excelFile +=
          '<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
        excelFile +=
          '<meta http-equiv="content-type" content="application/vnd.ms-excel';
        excelFile += '; charset=UTF-8">';
        excelFile += "<head>";
        excelFile += "<!--[if gte mso 9]>";
        excelFile += "<xml>";
        excelFile += "<x:ExcelWorkbook>";
        excelFile += "<x:ExcelWorksheets>";
        excelFile += "<x:ExcelWorksheet>";
        excelFile += "<x:Name>";
        excelFile += "{worksheet}";
        excelFile += "</x:Name>";
        excelFile += "<x:WorksheetOptions>";
        excelFile += "<x:DisplayGridlines/>";
        excelFile += "</x:WorksheetOptions>";
        excelFile += "</x:ExcelWorksheet>";
        excelFile += "</x:ExcelWorksheets>";
        excelFile += "</x:ExcelWorkbook>";
        excelFile += "</xml>";
        excelFile += "<![endif]-->";
        excelFile += "</head>";
        excelFile += "<body>";
        excelFile += excel;
        excelFile += "</body>";
        excelFile += "</html>";
        var uri =
          "data:application/vnd.ms-excel;charset=utf-8," +
          encodeURIComponent(excelFile);
        var link = document.createElement("a");
        link.href = uri;
        link.style = "visibility:hidden";
        link.download = FileName + ".xls";
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
  • 相关阅读:
    结构型模式のBridge桥梁模式
    创建型模式のBuilder建造者模式
    设计模式的一点思考
    创建型模式のAbstractFactory抽象工厂模式
    初试phoenix
    内网搭建git server
    nsq 学习(三)nsqlookupd
    nsq 学习(二)简单使用
    nsq 学习(一)源码安装nsq
    go学习实践-protobuf
  • 原文地址:https://www.cnblogs.com/xiejn/p/14298663.html
Copyright © 2011-2022 走看看