js导出Excel

项目中遇到了使用js导出Excel,常规表格(不要求样式、合并单元格)的好做,但是遇到要求携带样式、合并单元格的应该怎么办,我把找到的方法记录了下来:

1、导出常规表格

参考地址:https://blog.csdn.net/hhzzcc_/article/details/80419396,(我使用的是第二种方法)

项目中代码:

 1 // 点击'导出'
 2 This.$box.off('click', '.exportBtn').on('click', '.exportBtn', function() {
 3     //列标题,逗号隔开,每一个逗号就是隔开一个单元格
 4     let str = `考核月份,电厂名称,管理考核,短期考核分,超短期考核分,可用功率考核分,上报率考核分,考核总分
`;
 5     //增加	为了不让表格显示科学计数法或者其他格式
 6     for(let i = 0 ; i < This.resultData.length ; i++ ){
 7         str += `${This.resultData[i].PMONTH},`;
 8         str += `${This.resultData[i].PLANTID},`;
 9         str += `${This.resultData[i].GLMARK},`;
10         str += `${This.resultData[i].KYLSBRATE},`;
11         str += `${This.resultData[i].DQMARK},`;
12         str += `${This.resultData[i].CDQMARK},`;
13         str += `${This.resultData[i].SBZMARK},`;
14         str += `${This.resultData[i].KHMARK},`;
15         str+='
';
16     }
17     //encodeURIComponent解决中文乱码
18     let uri = 'data:text/csv;charset=utf-8,ufeff' + encodeURIComponent(str);
19     //通过创建a标签实现
20     let link = document.createElement("a");
21     link.href = uri;
22     //对下载的文件命名
23     link.download =  "月考核结果.xlsx";
24     document.body.appendChild(link);
25     link.click();
26     document.body.removeChild(link);
27 });
View Code

2、导出合并单元格的(利用插件:jquery.table2excel.js)

参考地址:https://www.jianshu.com/p/980fc3f7c83f

插件地址:https://github.com/rainabba/jquery-table2excel

以防插件地址出问题,jquery.table2excel.js代码如下:

  1 /*
  2  *  jQuery table2excel - v1.1.2
  3  *  jQuery plugin to export an .xls file in browser from an HTML table
  4  *  https://github.com/rainabba/jquery-table2excel
  5  *
  6  *  Made by rainabba
  7  *  Under MIT License
  8  */
  9 //table2excel.js
 10 (function ( $, window, document, undefined ) {
 11     var pluginName = "table2excel",
 12 
 13     defaults = {
 14         exclude: ".noExl",
 15         name: "Table2Excel",
 16         filename: "table2excel",
 17         fileext: ".xls",
 18         exclude_img: true,
 19         exclude_links: true,
 20         exclude_inputs: true,
 21         preserveColors: false
 22     };
 23 
 24     // The actual plugin constructor
 25     function Plugin ( element, options ) {
 26             this.element = element;
 27             // jQuery has an extend method which merges the contents of two or
 28             // more objects, storing the result in the first object. The first object
 29             // is generally empty as we don't want to alter the default options for
 30             // future instances of the plugin
 31             //
 32             this.settings = $.extend( {}, defaults, options );
 33             this._defaults = defaults;
 34             this._name = pluginName;
 35             this.init();
 36     }
 37 
 38     Plugin.prototype = {
 39         init: function () {
 40             var e = this;
 41 
 42             var utf8Heading = "<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">";
 43             e.template = {
 44                 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>",
 45                 sheet: {
 46                     head: "<x:ExcelWorksheet><x:Name>",
 47                     tail: "</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>"
 48                 },
 49                 mid: "</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>",
 50                 table: {
 51                     head: "<table>",
 52                     tail: "</table>"
 53                 },
 54                 foot: "</body></html>"
 55             };
 56 
 57             e.tableRows = [];
 58     
 59             // Styling variables
 60             var additionalStyles = "";
 61             var compStyle = null;
 62 
 63             // get contents of table except for exclude
 64             $(e.element).each( function(i,o) {
 65                 var tempRows = "";
 66                 $(o).find("tr").not(e.settings.exclude).each(function (i,p) {
 67                     
 68                     // Reset for this row
 69                     additionalStyles = "";
 70                     
 71                     // Preserve background and text colors on the row
 72                     if(e.settings.preserveColors){
 73                         compStyle = getComputedStyle(p);
 74                         additionalStyles += (compStyle && compStyle.backgroundColor ? "background-color: " + compStyle.backgroundColor + ";" : "");
 75                         additionalStyles += (compStyle && compStyle.color ? "color: " + compStyle.color + ";" : "");
 76                     }
 77 
 78                     // Create HTML for Row
 79                     tempRows += "<tr style='" + additionalStyles + "'>";
 80                     
 81                     // Loop through each TH and TD
 82                     $(p).find("td,th").not(e.settings.exclude).each(function (i,q) { // p did not exist, I corrected
 83                         
 84                         // Reset for this column
 85                         additionalStyles = "";
 86                         
 87                         // Preserve background and text colors on the row
 88                         if(e.settings.preserveColors){
 89                             compStyle = getComputedStyle(q);
 90                             additionalStyles += (compStyle && compStyle.backgroundColor ? "background-color: " + compStyle.backgroundColor + ";" : "");
 91                             additionalStyles += (compStyle && compStyle.color ? "color: " + compStyle.color + ";" : "");
 92                         }
 93 
 94                         var rc = {
 95                             rows: $(this).attr("rowspan"),
 96                             cols: $(this).attr("colspan"),
 97                             flag: $(q).find(e.settings.exclude)
 98                         };
 99 
100                         if( rc.flag.length > 0 ) {
101                             tempRows += "<td> </td>"; // exclude it!!
102                         } else {
103                             tempRows += "<td";
104                             if( rc.rows > 0) {
105                                 tempRows += " rowspan='" + rc.rows + "' ";
106                             }
107                             if( rc.cols > 0) {
108                                 tempRows += " colspan='" + rc.cols + "' ";
109                             }
110                             if(additionalStyles){
111                                 tempRows += " style='" + additionalStyles + "'";
112                             }
113                             tempRows += ">" + $(q).html() + "</td>";
114                         }
115                     });
116 
117                     tempRows += "</tr>";
118 
119                 });
120                 // exclude img tags
121                 if(e.settings.exclude_img) {
122                     tempRows = exclude_img(tempRows);
123                 }
124 
125                 // exclude link tags
126                 if(e.settings.exclude_links) {
127                     tempRows = exclude_links(tempRows);
128                 }
129 
130                 // exclude input tags
131                 if(e.settings.exclude_inputs) {
132                     tempRows = exclude_inputs(tempRows);
133                 }
134                 e.tableRows.push(tempRows);
135             });
136 
137             e.tableToExcel(e.tableRows, e.settings.name, e.settings.sheetName);
138         },
139 
140         tableToExcel: function (table, name, sheetName) {
141             var e = this, fullTemplate="", i, link, a;
142 
143             e.format = function (s, c) {
144                 return s.replace(/{(w+)}/g, function (m, p) {
145                     return c[p];
146                 });
147             };
148 
149             sheetName = typeof sheetName === "undefined" ? "Sheet" : sheetName;
150 
151             e.ctx = {
152                 worksheet: name || "Worksheet",
153                 table: table,
154                 sheetName: sheetName
155             };
156 
157             fullTemplate= e.template.head;
158 
159             if ( $.isArray(table) ) {
160                  Object.keys(table).forEach(function(i){
161                       //fullTemplate += e.template.sheet.head + "{worksheet" + i + "}" + e.template.sheet.tail;
162                       fullTemplate += e.template.sheet.head + sheetName + i + e.template.sheet.tail;
163                 });
164             }
165 
166             fullTemplate += e.template.mid;
167 
168             if ( $.isArray(table) ) {
169                  Object.keys(table).forEach(function(i){
170                     fullTemplate += e.template.table.head + "{table" + i + "}" + e.template.table.tail;
171                 });
172             }
173 
174             fullTemplate += e.template.foot;
175 
176             for (i in table) {
177                 e.ctx["table" + i] = table[i];
178             }
179             delete e.ctx.table;
180 
181             var isIE = navigator.appVersion.indexOf("MSIE 10") !== -1 || (navigator.userAgent.indexOf("Trident") !== -1 && navigator.userAgent.indexOf("rv:11") !== -1); // this works with IE10 and IE11 both :)
182             //if (typeof msie !== "undefined" && msie > 0 || !!navigator.userAgent.match(/Trident.*rv:11./))      // this works ONLY with IE 11!!!
183             if (isIE) {
184                 if (typeof Blob !== "undefined") {
185                     //use blobs if we can
186                     fullTemplate = e.format(fullTemplate, e.ctx); // with this, works with IE
187                     fullTemplate = [fullTemplate];
188                     //convert to array
189                     var blob1 = new Blob(fullTemplate, { type: "text/html" });
190                     window.navigator.msSaveBlob(blob1, getFileName(e.settings) );
191                 } else {
192                     //otherwise use the iframe and save
193                     //requires a blank iframe on page called txtArea1
194                     txtArea1.document.open("text/html", "replace");
195                     txtArea1.document.write(e.format(fullTemplate, e.ctx));
196                     txtArea1.document.close();
197                     txtArea1.focus();
198                     sa = txtArea1.document.execCommand("SaveAs", true, getFileName(e.settings) );
199                 }
200 
201             } else {
202                 var blob = new Blob([e.format(fullTemplate, e.ctx)], {type: "application/vnd.ms-excel"});
203                 window.URL = window.URL || window.webkitURL;
204                 link = window.URL.createObjectURL(blob);
205                 a = document.createElement("a");
206                 a.download = getFileName(e.settings);
207                 a.href = link;
208 
209                 document.body.appendChild(a);
210 
211                 a.click();
212 
213                 document.body.removeChild(a);
214             }
215 
216             return true;
217         }
218     };
219 
220     function getFileName(settings) {
221         return ( settings.filename ? settings.filename : "table2excel" );
222     }
223 
224     // Removes all img tags
225     function exclude_img(string) {
226         var _patt = /(s+alts*=s*"([^"]*)"|s+alts*=s*'([^']*)')/i;
227         return string.replace(/<img[^>]*>/gi, function myFunction(x){
228             var res = _patt.exec(x);
229             if (res !== null && res.length >=2) {
230                 return res[2];
231             } else {
232                 return "";
233             }
234         });
235     }
236 
237     // Removes all link tags
238     function exclude_links(string) {
239         return string.replace(/<a[^>]*>|</a>/gi, "");
240     }
241 
242     // Removes input params
243     function exclude_inputs(string) {
244         var _patt = /(s+values*=s*"([^"]*)"|s+values*=s*'([^']*)')/i;
245         return string.replace(/<input[^>]*>|</input>/gi, function myFunction(x){
246             var res = _patt.exec(x);
247             if (res !== null && res.length >=2) {
248                 return res[2];
249             } else {
250                 return "";
251             }
252         });
253     }
254 
255     $.fn[ pluginName ] = function ( options ) {
256         var e = this;
257             e.each(function() {
258                 if ( !$.data( e, "plugin_" + pluginName ) ) {
259                     $.data( e, "plugin_" + pluginName, new Plugin( this, options ) );
260                 }
261             });
262 
263         // chain jQuery functions
264         return e;
265     };
266 
267 })( jQuery, window, document );
View Code

项目中代码:

1 // 点击'导出',通过使用插件:jquery.table2excel.js
2 This.$box.off('click', '.exportBtn').on('click', '.exportBtn', function() {
3     $('#newsTable').table2excel({
4         exclude: ".noExl",
5         filename: "结算汇总情况" + new Date().toISOString().replace(/[-:.]/g, "") + ".xls",
6     });
7 });
View Code
原文地址:https://www.cnblogs.com/carriezhao/p/11164365.html