• H5页面使用前端js将json数据导出成Excel文件的3种方式


    最近频繁遇到需要将数据导出成Excel文件的需求,有电脑端的,也有手机端的,既然遇到了,就刚好整理一下

    第一种

    js-xlsx库,这是很强大的一个excel导入导出功能的js库,它的核心文件是xlsx.core.js,可以将json数据直接导出,网上关于它的介绍很多,这里我就不详细介绍,只放一段示例代码

    适用平台:仅限电脑端,手机端我也试过,手机浏览器能输出下载提示,但一点下载就报文件链接失效

    代码如下:

    第一步引入xlsx.core.js文件,再加上通用的打开下载对话框的函数,准备工作就算完成了

    <script type="text/javascript" src="js/xlsx.core.min.js"></script>
    <script type="text/javascript">
    /**
     * 通用的打开下载对话框方法,没有测试过具体兼容性
     * @param url 下载地址,也可以是一个blob对象,必选
     * @param saveName 保存文件名,可选
     */
    function openDownloadDialog(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);
    }
    // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
    function sheet2blob(sheet, sheetName) {
        sheetName = 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" });
        // 字符串转ArrayBuffer
        function s2ab(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;
        }
        return blob;
    }
    </script>

    第二步就可以开始直接调用导出功能

    <a style="float: right;" onclick="export()">导出下载</a>
    
    <script type="text/javascript">
    var exportDataSource = [{
                        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'
                    }, ]; //导出json数据源
    function export() {
                var excelItems = [];
                for (let i = 0; i < exportDataSource.length; i++) {
                    if (exportDataSource[i].COLOUR_ID == colorid) {
                        excelItems.push({
                            "姓名": exportDataSource[i].name,
                            "电话": exportDataSource[i].phone,
                            "邮箱": exportDataSource[i].email
                        }); //属性
                    }
                }
                var sheet = XLSX.utils.json_to_sheet(excelItems);
                openDownloadDialog(sheet2blob(sheet), 'exportdata.xlsx');
            }
    </script>

    第二种

    使用原生js将table标签,包括tr、td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html(原文链接:https://blog.csdn.net/hhzzcc_/java/article/details/80419396)

    适用平台:主要是电脑端,手机端虽然能导出下载,但因为是伪xls,真实的文件类型并不是xls,很容易被手机端浏览器识破,导致后缀名自动变成bin,文件也打不开

    代码如下:

    <html>
    <head>
      <p style="font-size: 20px;color: red;">使用table标签方式将json导出xls文件</p>
      <button onclick='tableToExcel()'>导出</button>
    </head>
    <body>
      <script>
                
        function 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(let item in jsonData[i]){
                //增加	为了不让表格显示科学计数法或者其他格式
                str+=`<td>${ jsonData[i][item] + '	'}</td>`;     
            }
            str+='</tr>';
          }
          //Worksheet名
          let worksheet = 'Sheet1'
          let uri = 'data:application/vnd.ms-excel;base64,';
     
          //下载的表格模板数据
          let 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><!--[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编码
        function base64 (s) { return window.btoa(unescape(encodeURIComponent(s))) }
    </script>
    </body>
    </html>

    第三种

    使用原生JS通过将json遍历进行字符串拼接,将字符串输出到csv文件(原文链接:https://blog.csdn.net/hhzzcc_/java/article/details/80419396)

    适用平台:电脑端和手机端都能正常导出下载

    代码如下:

    <html>
    <head>
      <p style="font-size: 20px;color: red;">使用a标签方式将json导出csv文件</p>
      <button onclick='tableToExcel()'>导出</button>
    </head>
    <body>
      <script>
                
        function 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(let item in jsonData[i]){
                str+=`${jsonData[i][item] + '	'},`;     
            }
            str+='
    ';
          }
          //encodeURIComponent解决中文乱码
          let uri = 'data:text/csv;charset=utf-8,ufeff' + encodeURIComponent(str);
          //通过创建a标签实现
          let link = document.createElement("a");
          link.href = uri;
          //对下载的文件命名
          link.download =  "json数据表.csv";
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
        }
     
    </script>
    </body>
    </html>

    这些方式也是我从网上其他博友那里找到的,我只是做个归纳总结,每种方式我标明了出处,有兴趣研究的朋友可以找原作者交流

  • 相关阅读:
    CF1070F Debate
    P3502 [POI2010]CHO-Hamsters
    CF1421A XORwice
    P2073 送花
    树链剖分边权转化为点权
    球——数学分析,模型构建
    数位dp的模版
    不要62
    智慧题——规律题
    CF551C GukiZ hates Boxes——模拟加二分
  • 原文地址:https://www.cnblogs.com/mooncher/p/13265438.html
Copyright © 2020-2023  润新知