美文网首页
js导出execl

js导出execl

作者: 随风遣入夜 | 来源:发表于2017-12-15 20:40 被阅读164次

    背景

    起初的需求是这样的,有一批报表(纯手工写的那种),需要execl导出的功能,之前的导出,都是用poi写的,由服务器端完成生成文件的责任,再交由浏览器端下载,这样做的好处是服务器端的语言大多是强类型的语言,在对于导出的文件的控制上更为精细,面向所有浏览器,存在的缺点是,报表本身的生成就会消耗服务器资源,特别是功底差的同学,这点尤为突出,接下来再生成一次文件 基本就是重复一次上面的动作,对于服务器压力更甚。

    因此,我就去寻找浏览器端的execl导出方案,服务端数据集发送一次到浏览器端,浏览器端抓取table直接导出。

    正文

    申明下我的方案是猜想,但是大多数代码部分是在网上找的,所以先展示第一种解决方案的代码,再进行评述

    
    varuri='data:application/vnd.ms-excel;base64,',
    
    template='{worksheet}{table}',
    
    base64=function(s){returnwindow.btoa(unescape(encodeURIComponent(s))) },
    
    format=function(s,c){
    
    returns.replace(/{(\w+)}/g,
    
    function(m,p){returnc[p]; }) }
    
    returnfunction(table,name){
    
    if(!table.nodeType)table=document.getElementById(table)
    
    varctx={worksheet:name||'Worksheet', table:table.innerHTML}
    
    window.location.href=uri+base64(format(template,ctx))
    
    }
    
    })()
    function  getExplorer() {
        var explorer = window.navigator.userAgent ;
        //ie
        if (explorer.indexOf("MSIE") >= 0) {
            return 'ie';
        }
        //firefox
        else if (explorer.indexOf("Firefox") >= 0) {
            return 'Firefox';
        }
        //Chrome
        else if(explorer.indexOf("Chrome") >= 0){
            return 'Chrome';
        }
        //Opera
        else if(explorer.indexOf("Opera") >= 0){
            return 'Opera';
        }
        //Safari
        else if(explorer.indexOf("Safari") >= 0){
            return 'Safari';
        }
    }
    function tableToExcel(tableid) {//整个表格拷贝到EXCEL中
        if(getExplorer()=='ie')
        {
            var curTbl = document.getElementById(tableid);
            var oXL = new ActiveXObject("Excel.Application");
    
            //创建AX对象excel
            var oWB = oXL.Workbooks.Add();
            //获取workbook对象
            var xlsheet = oWB.Worksheets(1);
            //激活当前sheet
            var sel = document.body.createTextRange();
            sel.moveToElementText(curTbl);
            //把表格中的内容移到TextRange中
            sel.select;
            //全选TextRange中内容
            sel.execCommand("Copy");
            //复制TextRange中内容
            xlsheet.Paste();
            //粘贴到活动的EXCEL中
            oXL.Visible = true;
            //设置excel可见属性
    
            try {
                var fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls");
            } catch (e) {
                print("Nested catch caught " + e);
            } finally {
                oWB.SaveAs(fname);
    
                oWB.Close(savechanges = false);
                //xls.visible = false;
                oXL.Quit();
                oXL = null;
                //结束excel进程,退出完成
                //window.setInterval("Cleanup();",1);
                idTmr = window.setInterval("Cleanup();", 1);
    
            }
    
        }
        else
        {
            tableToExcel('ta')
        }
    }
    

    html部分

    <buttontype="button" onclick="tableToExcel('表格id','导出文件的sheet名')">Excel导出</button>
    

    以上这种方式的原来帖子,百度一搜一大把,我也是用过一段时间突然在今天发现,这种方式的导出有个严重的问题存在,就是不能导出超过200条以上的table,但是速度奇快,但是分浏览器的。
    下面介绍,今天我刚发现的一种,来自github的一个作者,这种方式可以弥补上面的条数限制的问题,同时作者为我们提供了PDF、CVS、DOC、SQL、XLS、XLSX等等格式的导出,有深入需求的可以去观摩源码
    https://github.com/hhurz/tableExport.jquery.plugin
    下面贴代码

    <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="UTF-8">
      <title>HTML table Export</title>
      <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
      <!-- <script type="text/javascript" src="../libs/js-xlsx/xlsx.core.min.js"></script> -->
      <script type="text/javascript" src="../libs/FileSaver/FileSaver.min.js"></script>
      <script type="text/javascript" src="../tableExport.js"></script>
      <script type="text/javascript">
        $(document).ready(function() {
          var Table = document.getElementById ( 'container' );
          var T = [];
          var r = 0;
          var c = 1;
          var rmax = 5555;
          var cmax = 26;
          T.push('<table id="grid">');
          T.push('<thead>');
          T.push('<tr>');
          T.push('<th>col #</th>');
          while (++c <= cmax+1)
            T.push('<td>col ' + c + '</td>');
          T.push('</tr>');
          T.push('</thead>');
          T.push('<tbody>');
          while (r++ < rmax) {
            c = 0;
            T.push('<tr>');
            T.push('<td>' + r + '</td>');
            while (c++ < cmax)
              T.push('<td>' + getRandomInt(100,10000) + '</td>');
            T.push('</tr>');
          }
          T.push('</tbody>');
          T.push('</table>');
          Table.innerHTML = T.join ("");
          $('#export').click(function() {
    //2003版
            $('#grid').tableExport({type:'excel',fileName:'文件名', excelstyles:['border-bottom', 'border-top', 'border-left', 'border-right']});
    //2007版
            // $('#grid').tableExport({type:'xlsx', excelstyles:['border-bottom', 'border-top', 'border-left', 'border-right']});
          });
        });
        function getRandomInt(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
    </script>
    
    </head>
      <body>
        <button id="export">Export to Excel</button>
        <div id="container">
        </div>
      </body>
    </html>
    

    这里注意要引入的文件,如果是导出2003版本的execl文件,直接复制上面代码中的js文件进项目即可,
    如果需要2007版本的放开代码中的注释,屏蔽掉2003版本的导出语句
    源码提供了很多很多的设置参数,这个真的很方便,我贴一部分代码,一看便知

    $.fn.extend({
        tableExport: function (options) {
          var defaults = {
            consoleLog:        false,//是否在控制台输出
            csvEnclosure:      '"',
            csvSeparator:      ',',
            csvUseBOM:         true,
            displayTableName:  false,
            escape:            false,
            excelFileFormat:   'xlshtml',     // xmlss = XML Spreadsheet 2003 file format (XMLSS), xlshtml = Excel 2000 html format
            excelRTL:          false,         // true = Set Excel option 'DisplayRightToLeft'
            excelstyles:       [],            // e.g. ['border-bottom', 'border-top', 'border-left', 'border-right']
            exportHiddenCells: false,         // true = speed up export of large tables with hidden cells (hidden cells will be exported !)
            fileName:          'tableExport',//导出的execl文件名
            htmlContent:       false,
            ignoreColumn:      [],
            ignoreRow:         [],
            jsonScope:         'all',  
    

    最后建议多阅读源码,感谢源码的提供者。

    相关文章

      网友评论

          本文标题:js导出execl

          本文链接:https://www.haomeiwen.com/subject/jdzdwxtx.html