Echarts 数据视图 生成Excel的方法
程序员文章站
2022-03-14 08:45:48
一、生成Excel,两大方向:1后台生成Excel 查询数据库,使用NOPI生产Excel。2前台js生成Excel三种方式1)jquery.table2excel.js --采用,优势:兼容IE和Chrome。 2)handsontable 0.32.0 问题:不兼容IE。3)手写js有兼容性问题 ......
一、生成Excel,两大方向:
1后台生成Excel
查询数据库,使用NOPI生产Excel。
2前台js生成Excel三种方式
1)jquery.table2excel.js
--采用,优势:兼容IE和Chrome。
2)handsontable 0.32.0
问题:不兼容IE。
3)手写js有兼容性问题。
问题:浏览器兼容型问题等。
考虑到这里只需要将Echarts的数据视图生成Excel,采用最简单有效的方式:jquery.table2excel.js。
二、方案
1、 jquery.table2excel.js 和Echarts数据视图结合的取巧方案
第一步:应用js脚本,先jquery脚本后table2excel脚本。
<script src="~/Scripts/jquery-1.10.2.js"></script> <script src="~/Scripts/table2excel/jquery.table2excel.js"></script>
第二步:重写dataView-contentToOption方法,注意不能设为只读。
toolbox: { right: '20px', feature: { dataView: { show: true, title: '数据视图', //readOnly: true, //设置只读,会隐藏刷新按钮。 lang: ['数据视图', '关闭', '导出Excel'], contentToOption: function (opts) { $("#tableExcel_Day").table2excel({ exclude: ".noExl", //过滤位置的 css 类名 filename: productSelectName + '每日价格走势图' + ".xls", //文件名称 name: "Excel Document Name.xls", exclude_img: true, exclude_links: true, exclude_inputs: true }); }, optionToContent: function (opt) { // console.log(opt); var axisData = opt.xAxis[0].data; //坐标数据 var series = opt.series; //折线图数据 var tdHeads = '<td style="padding: 0 10px">时间</td>'; //表头第一列 var tdBodys = ''; //表数据 //组装表头 var nameData = new Array('田头价格', '批发价格', '零售价格', '交易量'); for (var i = 0; i < nameData.length; i++) { tdHeads += '<td style="padding: 0 10px">' + nameData[i] + '</td>'; } var table = '<table id="tableExcel_Day" border="1" class="table-bordered table-striped" style="width:100%;text-align:center" ><tbody><tr>' + tdHeads + ' </tr>'; //组装表数据 for (var i = 0, l = axisData.length; i < l; i++) { for (var j = 0; j < series.length ; j++) { var temp = series[j].data[i]; if (temp != null && temp != undefined) { tdBodys += '<td>' + temp.toFixed(2) + '</td>'; } else { tdBodys += '<td></td>'; } } table += '<tr><td style="padding: 0 10px">' + axisData[i] + '</td>' + tdBodys + '</tr>'; tdBodys = ''; } table += '</tbody></table>'; // console.log(table); return table; } }, dataZoom: { show: true, title: { zoom: '区域缩放', back: '区域缩放还原' } }, saveAsImage: { show: true } } },
解释 1、通过id即tableExcel_Day来找到表格。
2、exclude: “.noExl” : 有class = “noExl” 的行不被导出;
第三步:效果图
点击“导出Excel”
存在的问题:点击“生成Excel”按钮后,视图会跳转,因为这是原本是刷新按钮,目前还未解决。
三、jquery.table2excel.js 脚本:
/* * jQuery table2excel - v1.1.1 * jQuery plugin to export an .xls file in browser from an HTML table * https://github.com/rainabba/jquery-table2excel * * Made by rainabba * Under MIT License */ /* * jQuery table2excel - v1.1.1 * jQuery plugin to export an .xls file in browser from an HTML table * https://github.com/rainabba/jquery-table2excel * * Made by rainabba * Under MIT License */ //table2excel.js ;(function ( $, window, document, undefined ) { var pluginName = "table2excel", defaults = { exclude: ".noExl", name: "Table2Excel", filename: "table2excel", fileext: ".xls", exclude_img: true, exclude_links: true, exclude_inputs: true }; // The actual plugin constructor function Plugin ( element, options ) { this.element = element; // jQuery has an extend method which merges the contents of two or // more objects, storing the result in the first object. The first object // is generally empty as we don't want to alter the default options for // future instances of the plugin // this.settings = $.extend( {}, defaults, options ); this._defaults = defaults; this._name = pluginName; this.init(); } Plugin.prototype = { init: function () { var e = this; var utf8Heading = "<meta http-equiv=\"content-type\" content=\"application/vnd.ms-excel; charset=UTF-8\">"; e.template = { head: "<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\">" + utf8Heading + "<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>", sheet: { head: "<x:ExcelWorksheet><x:Name>", tail: "</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>" }, mid: "</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>", table: { head: "<table>", tail: "</table>" }, foot: "</body></html>" }; e.tableRows = []; // get contents of table except for exclude $(e.element).each( function(i,o) { var tempRows = ""; $(o).find("tr").not(e.settings.exclude).each(function (i,p) { tempRows += "<tr>"; $(p).find("td,th").not(e.settings.exclude).each(function (i,q) { // p did not exist, I corrected var rc = { rows: $(this).attr("rowspan"), cols: $(this).attr("colspan"), flag: $(q).find(e.settings.exclude) }; if( rc.flag.length > 0 ) { tempRows += "<td> </td>"; // exclude it!! } else { if( rc.rows & rc.cols ) { tempRows += "<td>" + $(q).html() + "</td>"; } else { tempRows += "<td"; if( rc.rows > 0) { tempRows += " rowspan=\'" + rc.rows + "\' "; } if( rc.cols > 0) { tempRows += " colspan=\'" + rc.cols + "\' "; } tempRows += "/>" + $(q).html() + "</td>"; } } }); tempRows += "</tr>"; // console.log(tempRows); }); // exclude img tags if(e.settings.exclude_img) { tempRows = exclude_img(tempRows); } // exclude link tags if(e.settings.exclude_links) { tempRows = exclude_links(tempRows); } // exclude input tags if(e.settings.exclude_inputs) { tempRows = exclude_inputs(tempRows); } e.tableRows.push(tempRows); }); e.tableToExcel(e.tableRows, e.settings.name, e.settings.sheetName); }, tableToExcel: function (table, name, sheetName) { var e = this, fullTemplate="", i, link, a; e.format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }); }; sheetName = typeof sheetName === "undefined" ? "Sheet" : sheetName; e.ctx = { worksheet: name || "Worksheet", table: table, sheetName: sheetName }; fullTemplate= e.template.head; if ( $.isArray(table) ) { for (i in table) { //fullTemplate += e.template.sheet.head + "{worksheet" + i + "}" + e.template.sheet.tail; fullTemplate += e.template.sheet.head + sheetName + i + e.template.sheet.tail; } } fullTemplate += e.template.mid; if ( $.isArray(table) ) { for (i in table) { fullTemplate += e.template.table.head + "{table" + i + "}" + e.template.table.tail; } } fullTemplate += e.template.foot; for (i in table) { e.ctx["table" + i] = table[i]; } delete e.ctx.table; var isIE = /*@cc_on!@*/false || !!document.documentMode; // this works with IE10 and IE11 both :) //if (typeof msie !== "undefined" && msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // this works ONLY with IE 11!!! if (isIE) { if (typeof Blob !== "undefined") { //use blobs if we can fullTemplate = e.format(fullTemplate, e.ctx); // with this, works with IE fullTemplate = [fullTemplate]; //convert to array var blob1 = new Blob(fullTemplate, { type: "text/html" }); window.navigator.msSaveBlob(blob1, getFileName(e.settings) ); } else { //otherwise use the iframe and save //requires a blank iframe on page called txtArea1 txtArea1.document.open("text/html", "replace"); txtArea1.document.write(e.format(fullTemplate, e.ctx)); txtArea1.document.close(); txtArea1.focus(); sa = txtArea1.document.execCommand("SaveAs", true, getFileName(e.settings) ); } } else { var blob = new Blob([e.format(fullTemplate, e.ctx)], {type: "application/vnd.ms-excel"}); window.URL = window.URL || window.webkitURL; link = window.URL.createObjectURL(blob); a = document.createElement("a"); a.download = getFileName(e.settings); a.href = link; document.body.appendChild(a); a.click(); document.body.removeChild(a); } return true; } }; function getFileName(settings) { return ( settings.filename ? settings.filename : "table2excel" ); } // Removes all img tags function exclude_img(string) { var _patt = /(\s+alt\s*=\s*"([^"]*)"|\s+alt\s*=\s*'([^']*)')/i; return string.replace(/<img[^>]*>/gi, function myFunction(x){ var res = _patt.exec(x); if (res !== null && res.length >=2) { return res[2]; } else { return ""; } }); } // Removes all link tags function exclude_links(string) { return string.replace(/<a[^>]*>|<\/a>/gi, ""); } // Removes input params function exclude_inputs(string) { var _patt = /(\s+value\s*=\s*"([^"]*)"|\s+value\s*=\s*'([^']*)')/i; return string.replace(/<input[^>]*>|<\/input>/gi, function myFunction(x){ var res = _patt.exec(x); if (res !== null && res.length >=2) { return res[2]; } else { return ""; } }); } $.fn[ pluginName ] = function ( options ) { var e = this; e.each(function() { if ( !$.data( e, "plugin_" + pluginName ) ) { $.data( e, "plugin_" + pluginName, new Plugin( this, options ) ); } }); // chain jQuery functions return e; }; })( jQuery, window, document );
参考过的文章:https://blog.csdn.net/wwp231/article/details/51675023