几种Excel导出的方法

Posted niuniu1985

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几种Excel导出的方法相关的知识,希望对你有一定的参考价值。

最近在项目中需要Excel导出,由于需要导出的内容多,且不是规整的表格,绑定值是个比较麻烦的事,考虑了几种方式

一、使用JS方法将html导出为Excel

原理就是获取需要导出到Excel的HTML代码,然后利用JS方法进行导出。此代码可以兼容IE8及主流浏览器,但是不支持多个Sheet页的导出,在IE8下也不能自定义Sheet页的名字。

技术分享图片
<li>
<button id="btnExport" class="btn btn-primary" onclick="javascript:HtmlExportToExcel(‘mainContent‘)">
                        导出
                    </button>
<a id="dlink" style="display: none;"></a>
                </li>    
View Code
技术分享图片
//jQuery HTML导出Excel文件(兼容IE及所有浏览器)
        function HtmlExportToExcel(tableid) {
            var filename = $(‘#divTitle‘).text();
            var sheetName = "已开展工作情况";
            if (getExplorer() == ‘ie‘ || getExplorer() == undefined) {
                HtmlExportToExcelForIE(tableid, filename,sheetName);
            }
            else {
                HtmlExportToExcelForEntire(tableid, filename,sheetName)
            }
        }

        //IE浏览器导出Excel
        function HtmlExportToExcelForIE(tableid, filename,sheetName) {
            try {
                var winname = window.open(‘‘, ‘_blank‘, ‘top=10000‘);
                var strHTML = $("#" + tableid).html();

                winname.document.open(‘application/vnd.ms-excel‘, ‘export excel‘);
                winname.document.writeln(strHTML);
                winname.document.execCommand(‘saveas‘, ‘‘, filename + ‘.xls‘);
                winname.close();

            } catch (e) {
                alert(e.description);
            }
        }

        //非IE浏览器导出Excel
        var HtmlExportToExcelForEntire = (function () {
            var uri = ‘data:application/vnd.ms-excel;base64,‘,
        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>{table}</table></body></html>‘,
        base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) },
        format = function (s, c) { return s.replace(/{(w+)}/g, function (m, p) { return c[p]; }) }
            return function (table, name,sheetName) {
                if (!table.nodeType) { table = $("#" + table); }
                var ctx = { worksheet: sheetName || ‘Worksheet‘, table: table.html() };
                document.getElementById("dlink").href = uri + base64(format(template, ctx));
                document.getElementById("dlink").download = name + ".xls";
                document.getElementById("dlink").click();
            }
        })()
        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‘;
            }
        }
View Code

另外,由于生成的不是真正的Excel文件,只是把HTML转换为Excel的文件,会出现如下提示,用户体验不好。

技术分享图片

二、利用后台方法将HTML导出为Excel

原理与第一种方法类似,也是将HTML代码导出为Excel,只是改用后台文件流方式,避免了浏览器兼容性问题。但是,跟第一种方法差不多,也不能支持多个Sheet页导出,不能自定义Sheet页的名称。

由于也是HTML导出为Excel文件,也会出现文件扩展名不一致的提示。

技术分享图片
<form id="form1" method="post">
        @Html.Hidden("EncodeHTML")
        @Html.Hidden("Title")
    </form>
-------------
<li>
                    <button id="btnExport" class="btn btn-primary" type="submit" onclick="ExportExcel()" >
                        导出
                    </button>
                </li>
View Code
技术分享图片
function ExportExcel() {
            var URL = ‘@Url.Action("GreenCarSummaryExport", "GreenCar", new { area = "GreenCar" })‘;
            var strHtml = encodeURI($("#mainContent").html());
            var title = $("#divTitle").text();

            $("#EncodeHTML").val(strHtml);
            $("#Title").val(title);
            window.form1.action = URL;
            window.form1.submit();
}
View Code
技术分享图片
public FileResult GreenCarSummaryExport(FormCollection collection)
        {
            string EncodeHTML = collection["EncodeHTML"];
            string Title = collection["Title"];
            //获取数据
            OnlineUser oUser = HttpContext.Session["LoginedUser"] as OnlineUser;
            string html = HttpUtility.UrlDecode(EncodeHTML);

            byte[] fileContents = System.Text.Encoding.GetEncoding("gb2312").GetBytes("<html><head><meta http-equiv=Content-Type content="text/html; charset=gb2312">" + html + "</body></html>");
            return File(fileContents, "application/vnd.ms-excel", string.Format("{0}.xls", Title));
}
View Code

三、利用后台方法导出Excel,可以利用NPOI,Aspose,ExcelReport等多种方式

需要重新从数据库获取数据,然后绑定到Excel中,进行导出。

 

以上是关于几种Excel导出的方法的主要内容,如果未能解决你的问题,请参考以下文章

C#导出EXCEL的几种方法

mysql导出excel文件的几种方法

web导出excel文件的几种方法

Mysql查询结果导出为Excel的几种方法

由DataSet导出生成excel的几种方法

MySQLLinux服务器将Mysql查询结果导出为Excel的几种方法