几种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>
//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‘; } }
另外,由于生成的不是真正的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>
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();
}
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)); }
三、利用后台方法导出Excel,可以利用NPOI,Aspose,ExcelReport等多种方式
需要重新从数据库获取数据,然后绑定到Excel中,进行导出。
以上是关于几种Excel导出的方法的主要内容,如果未能解决你的问题,请参考以下文章