js导出execl

背景

起初的需求是这样的,有一批报表(纯手工写的那种),需要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部分

Excel导出

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





  
  HTML table Export
  
  
  
  
  


  
    
    

这里注意要引入的文件,如果是导出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)