js导出execl 兼容ie Chrome Firefox各种主流浏览器(js export execl)

第一种导出table布局的表格

  1 <html>
  2 
  3     <head>
  4         <meta charset="utf-8">
  5         <script type="text/javascript" language="javascript">
  6             var idTmr;
  7 
  8             function getExplorer() {
  9                 var explorer = window.navigator.userAgent;
 10                 //ie 
 11                 if(explorer.indexOf(".NET") >= 0) {
 12                     return 'ie';
 13                 }
 14                 //firefox 
 15                 else if(explorer.indexOf("Firefox") >= 0) {
 16                     return 'Firefox';
 17                 }
 18                 //Chrome
 19                 else if(explorer.indexOf("Chrome") >= 0) {
 20                     return 'Chrome';
 21                 }
 22                 //Opera
 23                 else if(explorer.indexOf("Opera") >= 0) {
 24                     return 'Opera';
 25                 }
 26                 //Safari
 27                 else if(explorer.indexOf("Safari") >= 0) {
 28                     return 'Safari';
 29                 }
 30             }
 31 
 32             function method1(tableid, name, filename) { //整个表格拷贝到EXCEL中
 33                 if(getExplorer() == 'ie') {
 34                     var curTbl = document.getElementById(tableid);
 35                     var oXL = new ActiveXObject("Excel.Application");
 36 
 37                     //创建AX对象excel 
 38                     var oWB = oXL.Workbooks.Add();
 39                     //获取workbook对象 
 40                     var xlsheet = oWB.Worksheets(1);
 41                     //激活当前sheet 
 42                     var sel = document.body.createTextRange();
 43                     sel.moveToElementText(curTbl);
 44                     //把表格中的内容移到TextRange中 
 45                     sel.select();
 46                     //全选TextRange中内容 
 47                     sel.execCommand("Copy");
 48                     //复制TextRange中内容  
 49                     xlsheet.Paste();
 50                     //粘贴到活动的EXCEL中       
 51                     oXL.Visible = true;
 52                     //设置excel可见属性
 53 
 54                     try {
 55                         var fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls");
 56                     } catch(e) {
 57                         print("Nested catch caught " + e);
 58                     } finally {
 59                         oWB.SaveAs(fname);
 60 
 61                         oWB.Close(savechanges = false);
 62                         //xls.visible = false;
 63                         oXL.Quit();
 64                         oXL = null;
 65                         //结束excel进程,退出完成
 66                         //window.setInterval("Cleanup();",1);
 67                         idTmr = window.setInterval("Cleanup();", 1);
 68 
 69                     }
 70 
 71                 } else {
 72                     tableToExcel(tableid, name, filename)
 73                 }
 74             }
 75 
 76             function Cleanup() {
 77                 window.clearInterval(idTmr);
 78                 CollectGarbage();
 79             }
 80             var tableToExcel = (function() {
 81                 var uri = 'data:application/vnd.ms-excel;base64,',
 82                     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><meta charset="UTF-8"><!--[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>',
 83                     base64 = function(s) {
 84                         return window.btoa(unescape(encodeURIComponent(s)))
 85                     },
 86                     format = function(s, c) {
 87                         return s.replace(/{(\w+)}/g,
 88                             function(m, p) {
 89                                 return c[p];
 90                             })
 91                     }
 92                 return function(table, name, filename) {
 93                     if(!table.nodeType) table = document.getElementById(table)
 94                     var ctx = {
 95                             worksheet: name || 'Worksheet',
 96                             table: table.innerHTML
 97                         }
 98                         //window.location.href = uri + base64(format(template, ctx))
 99                         //<a href="/images/logo.png" download="w3clogo">    //参考a链接的下载,更改下载文件名
100                         //<img border="0" src="/images/logo.png" alt="w3cschool.cc" >
101                         //</a>
102                     document.getElementById("dlink").href = uri + base64(format(template, ctx));
103                     document.getElementById("dlink").download = filename; //这里是关键所在,当点击之后,设置a标签的属性,这样就可以更改标签的标题了
104                     document.getElementById("dlink").click();
105                 }
106             })()
107         </script>
108         <style>
109             .bk {
110                 background-color: red;
111                 color: blue;
112                 text-align: center;
113             }
114         </style>
115     </head>
116 
117     <body>
118         <table id="targetTable">
119             <tr align="center" id='th'>
120                 <td>标识</td>
121                 <td>内容</td>
122                 <td>创建时间</td>
123             </tr>
124             <tr id="tr1" class="bk">
125                 <a>
126                     <td>1</td>
127                     <td>excel01</td>
128                     <td>2015-07-22</td>
129                 </a>
130             </tr>
131             <tr align="center" style="background-color: red;color:yellow;">
132                 <td>2</td>
133                 <td>excel02</td>
134                 <td>2015-07-22</td>
135             </tr>
136             <tr align="center" id="tr3">
137                 <a>
138                     <td>1</td>
139                     <td>excel01</td>
140                     <td>2015-07-22</td>
141                 </a>
142             </tr>
143         </table>
144         </br>
145         <span>span</span>
146         <a id="dlink" style="display:none;"></a><!--隐藏链接,设置下载文件名  利用download属性-->
147         <input id="Button1" type="button" value="导出EXCEL" onclick="javascript:method1('targetTable', 'name', 'myfile.xls')" />
148         <script>
149             //导出execl时只有标签上的样式才会影响到导出的execl的样式,通过类渲染的最终样式没用
150             document.getElementById('tr3').style.backgroundColor = "yellow";
151             var th = document.getElementById('th');
152             var a = document.getElementById('tr1');
153             var color = window.getComputedStyle(a).getPropertyValue("background-color"); //获取最终样式,经过class渲染之后的样式
154             //alert(window.getComputedStyle(a).getPropertyValue("color"));
155             th.style.backgroundColor = color;
156         </script>
157     </body>
158 
159 </html>
View Code

在template的head标签中加了<meta charset="UTF-8">(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><meta charset="UTF-8">......),防止中文乱码。

其中利用了a标签的download属性来更改导出的execl名字,而且导出execl时只有标签上的样式才会影响到导出的execl的样式,通过类渲染的最终样式没用

第二种导出div布局的表格

  1 <!DOCTYPE html>
  2 
  3 <html>
  4 
  5     <head>
  6         <meta name="viewport" content="width=device-width" />
  7         <meta charset="utf-8">
  8         <title>项目统计</title>
  9         <link href="css/bootstrap.min.css" rel="stylesheet" />
 10         <link href="css/bootstrap-datepicker3.min.css" rel="stylesheet" />
 11         <link rel="stylesheet" type="text/css" href="css/layout.css" />
 12         <link rel="stylesheet" type="text/css" href="css/style.css" />
 13         <script src="js/jquery.min.js"></script>
 14         <script src="js/layer.js"></script>
 15         <script src="js/bootstrap-datepicker.min.js"></script>
 16         <script src="js/bootstrap-datepicker.zh-cn.min.js"></script>
 17         <script type="text/javascript" language="javascript">
 18             var idTmr;
 19 
 20             function getExplorer() {
 21                 var explorer = window.navigator.userAgent;
 22                 //ie 
 23                 if(explorer.indexOf("MSIE") >= 0) {
 24                     return 'ie';
 25                 }
 26                 //firefox 
 27                 else if(explorer.indexOf("Firefox") >= 0) {
 28                     return 'Firefox';
 29                 }
 30                 //Chrome
 31                 else if(explorer.indexOf("Chrome") >= 0) {
 32                     return 'Chrome';
 33                 }
 34                 //Opera
 35                 else if(explorer.indexOf("Opera") >= 0) {
 36                     return 'Opera';
 37                 }
 38                 //Safari
 39                 else if(explorer.indexOf("Safari") >= 0) {
 40                     return 'Safari';
 41                 }
 42             }
 43 
 44             function method1(tableid,name, filename) { //整个表格拷贝到EXCEL中
 45                 //隐藏a链接是为了设置下载名字
 46                 if($('#dlink').length <= 0) //id为dlink的a不存在则创建一个隐藏的a
 47                 {
 48                     $('body').prepend("<a id='dlink' style='display:none;'>");
 49                 }
 50                 //判断table是不是div布局的table
 51                 if($("#" + tableid).prop("tagName") == "DIV") {
 52                     var table = $("#" + tableid).html(); //是div布局的table则重新建一个table,获取html标签替换
 53                     var tableClass=$("#" + tableid).attr('class');    //获取原来div的class
 54                     tableid = "divTableID222"; //为了第二次导出execl的时候,不与table的id重复
 55                     if($('#' + tableid).length <= 0) //id为tableid的div不存在则创建一个隐藏的div
 56                     {    
 57                         $('body').prepend("</a><div id='" + tableid + "' style='display: none;'></div>");
 58                     }
 59                     $('#' + tableid).html(table); //把需要导出的内容加到这个隐藏的div中
 60                     $("#" + tableid).attr('class',tableClass);    //把原来div的样式复制给隐藏div的样式
 61                     $("#" + tableid+" div[name='exportFilter']").remove();    //删除不要导出的列
 62                     //下面是替换标签
 63                     $('#' + tableid + ' .tr-th').replaceWith(function() {
 64                         return $("<tr />", {
 65                             html: $(this).html(), class:$(this).attr('class'),
 66                             //设置execl样式,必须是style属性上的,通过class渲染的不行
 67                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),    
 68                             align:"center"
 69                         });
 70                     });
 71                     $('#' + tableid + ' .th').replaceWith(function() {
 72                         return $("<th />", {
 73                             html: $(this).html(), class:$(this).attr('class'),
 74                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),
 75                             align:"center"
 76                         });
 77                     });
 78                     $('#' + tableid + ' .tr').replaceWith(function() {
 79                         return $("<tr />", {
 80                             html: $(this).html(), class:$(this).attr('class'),
 81                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),
 82                             align:"center"
 83                         });
 84                     });
 85                     $('#' + tableid + ' .td').replaceWith(function() {
 86                         return $("<td />", {
 87                             html: $(this).html(), class:$(this).attr('class'),
 88                             style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color")
 89                             +";color:"+window.getComputedStyle(this).getPropertyValue("color"),
 90                             align:"center"
 91                         });
 92                     });
 93                 }
 94                 if(getExplorer() == 'ie') {
 95                     var curTbl = document.getElementById(tableid);
 96                     var oXL = new ActiveXObject("Excel.Application");
 97 
 98                     //创建AX对象excel 
 99                     var oWB = oXL.Workbooks.Add();
100                     //获取workbook对象 
101                     var xlsheet = oWB.Worksheets(1);
102                     //激活当前sheet 
103                     var sel = document.body.createTextRange();
104                     sel.moveToElementText(curTbl);
105                     //把表格中的内容移到TextRange中 
106                     sel.select();
107                     //全选TextRange中内容 
108                     sel.execCommand("Copy");
109                     //复制TextRange中内容  
110                     xlsheet.Paste();
111                     //粘贴到活动的EXCEL中       
112                     oXL.Visible = true;
113                     //设置excel可见属性
114 
115                     try {
116                         var fname = oXL.Application.GetSaveAsFilename(filename||'我的execl', "Excel Spreadsheets (*.xls), *.xls");
117                     } catch(e) {
118                         print("Nested catch caught " + e);
119                     } finally {
120                         oWB.SaveAs(fname);
121 
122                         oWB.Close(savechanges = false);
123                         //xls.visible = false;
124                         oXL.Quit();
125                         oXL = null;
126                         //结束excel进程,退出完成
127                         //window.setInterval("Cleanup();",1);
128                         idTmr = window.setInterval("Cleanup();", 1);
129 
130                     }
131 
132                 } else {
133                     tableToExcel(tableid,name, filename)
134                 }
135             }
136 
137             function Cleanup() {
138                 window.clearInterval(idTmr);
139                 CollectGarbage();
140             }
141             var tableToExcel = (function() {
142                 var uri = 'data:application/vnd.ms-excel;base64,',
143                     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><meta charset="UTF-8"><!--[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>',
144                     base64 = function(s) {
145                         return window.btoa(unescape(encodeURIComponent(s)))
146                     },
147                     format = function(s, c) {
148                         return s.replace(/{(\w+)}/g,
149                             function(m, p) {
150                                 return c[p];
151                             })
152                     }
153                 return function(table, name, filename) {
154                     if(!table.nodeType) table = document.getElementById(table)
155                     var ctx = {
156                         worksheet: name || 'Worksheet',
157                         table: table.innerHTML
158                     }
159                     //window.location.href = uri + base64(format(template, ctx))
160                         //<a href="/images/logo.png" download="w3clogo">    //参考a链接的下载,更改下载文件名,可以添加扩展名w3clogo.jpg
161                         //<img border="0" src="/images/logo.png" alt="w3cschool.cc" >
162                         //</a>
163                     document.getElementById("dlink").href = uri + base64(format(template, ctx));
164                     document.getElementById("dlink").download = filename||'我的execl'; //这里是关键所在,当点击之后,设置a标签的属性,这样就可以更改标签的标题了
165                     //没传参数,下载名字默认为‘我的execl’
166                     document.getElementById("dlink").click();
167                 }
168             })()
169         </script>
170     </head>
171 
172     <body>
173         <div class="info-center">
174             <div class="manage-head">
175                 <h6 class="padding-left manage-head-con">
176                 项目统计
177 
178                     <a class="h5 custom-red fr margin-left" href="/ProjectEntering/Index">录入项目</a>
179                 <a class="h5 custom-glay fr margin-left" href="/ProjectStatistics/Index?page=1&keyword=&AID=0&Project_state=&Excel=1'">导出Execl</a>
180 
181                 <select id="SelProject_state" class="h5 custom-glay fr margin-left" style="height: 32px; font-size: 10px; color: #565656; font-weight: normal; border: 1px solid #cecece; padding: 0 10px; margin-top: -5px;">
182                     <option value="">状态</option>
183                     <option value="">全部</option>
184                     <option value="0">进行中</option>
185                     <option value="1">完成</option>
186                 </select>
187                 
188 <input id="Button1" type="button" value="导出EXCEL" onclick="javascript:method1('targetTable','name','导出execl')" />
189                 <a class="h5 custom-glay fr margin-left" href="javascript:void();" id="akeyword" >搜索</a>
190                 <input id="txtkeyword" value="" placeholder="请输入关键字" class="input w20 fr" style="vertical-align: top;" />
191                 <div class="span5 col-md-5 fr" id="sandbox-container" >
192                     <div class="input-daterange input-group" id="datepicker">
193                         <span class="input-group-addon" style="height: 32px; margin-top: -10px; ">时间段</span>
194                         <input id="txtstartTime" type="text" class="input-sm form-control" name="start" readonly>
195                         <span class="input-group-addon"></span>
196                         <input id="txtendTime" type="text" class="input-sm form-control" name="end" readonly>
197                     </div>
198                 </div>
199             </h6>
200             </div>
201             <div id="targetTable" class="offcial-table input-table table-margin clearfix">
202                 <div class="tr-th clearfix">
203                     <div class="th w10">项目编号</div>
204                     <div class="th w10">项目名称</div>
205                     <div class="th w15">项目金额</div>
206                     <div class="th w10">项目负责人</div>
207                     <div class="th w10">创建时间</div>
208                     <div class="th w10">实际总系数值</div>
209                     <div class="th w10">预计总系数值</div>
210                     <div class="th w10">项目状态</div>
211                     <div class="th w15" name='exportFilter'>操作</div>
212                 </div>
213                 <div id="projectInfo58" class="tr clearfix tr-check">
214                     <a href="/ProjectDetail/Index?PID=58">
215                         <div class="td w10">987</div>
216                         <div class="td w10">test2017</div>
217                         <div class="td w15">¥0</div>
218                         <div class="td w10">Katherine </div>
219                         <div class="td w10">2017/1/13 15:02:16</div>
220                         <div class="td w10">28</div>
221                         <div class="td w10" style="color: blue;">20</div>
222                         <div class="td w10">
223                             <span class="text-blue">
224                                             进行中
225                                         </span>
226                         </div>
227                         <div class="td w15" name='exportFilter'>
228                             <a href="/ProjectDetail/Index?PID=58">查看</a>
229                             /
230                             <a href="/ProjectEntering/Index?PID=58">修改</a>
231                             /
232                             <a name="aDeleteProject" data-id="58" href="javascript:viod();">删除</a>
233                         </div>
234                     </a>
235                 </div>
236                 <div id="projectInfo56" class="tr clearfix tr-check">
237                     <a href="/ProjectDetail/Index?PID=56">
238                         <div class="td w10">123456789</div>
239                         <div class="td w10">test20170113</div>
240                         <div class="td w15">¥0</div>
241                         <div class="td w10">Katherine </div>
242                         <div class="td w10">2017/1/13 14:00:28</div>
243                         <div class="td w10">10</div>
244                         <div class="td w10">9.5</div>
245                         <div class="td w10" >
246                             <span class="text-blue">
247                                             进行中
248                                         </span>
249                         </div>
250                         <div class="td w15" name='exportFilter'>
251                             <a href="/ProjectDetail/Index?PID=56">查看</a>
252                             /
253                             <a href="/ProjectEntering/Index?PID=56">修改</a>
254                             /
255                             <a name="aDeleteProject" data-id="56" href="javascript:viod();">删除</a>
256                         </div>
257                     </a>
258                 </div>
259                 <div id="projectInfo53" class="tr clearfix ">
260                     <a href="/ProjectDetail/Index?PID=53">
261                         <div class="td w10">63</div>
262                         <div class="td w10">63</div>
263                         <div class="td w15">¥63</div>
264                         <div class="td w10">admin</div>
265                         <div class="td w10">2017/1/12 17:59:59</div>
266                         <div class="td w10">96</div>
267                         <div class="td w10">111</div>
268                         <div class="td w10">
269                             <span class="text-blue">
270                                             进行中
271                                         </span>
272                         </div>
273                         <div class="td w15" name='exportFilter'>
274                             <a href="/ProjectDetail/Index?PID=53">查看</a>
275                             /
276                             <a href="/ProjectEntering/Index?PID=53">修改</a>
277                             /
278                             <a name="aDeleteProject" data-id="53" href="javascript:viod();">删除</a>
279                         </div>
280                     </a>
281                 </div>
282                 <div id="projectInfo52" class="tr clearfix tr-check">
283                     <a href="/ProjectDetail/Index?PID=52">
284                         <div class="td w10">123-456</div>
285                         <div class="td w10">test0112</div>
286                         <div class="td w15">¥0</div>
287                         <div class="td w10">Katherine </div>
288                         <div class="td w10">2017/1/12 13:46:19</div>
289                         <div class="td w10">56</div>
290                         <div class="td w10">20</div>
291                         <div class="td w10">
292                             <span class="text-blue">
293                                             进行中
294                                         </span>
295                         </div>
296                         <div class="td w15" name='exportFilter'>
297                             <a href="/ProjectDetail/Index?PID=52">查看</a>
298                             /
299                             <a href="/ProjectEntering/Index?PID=52">修改</a>
300                             /
301                             <a name="aDeleteProject" data-id="52" href="javascript:viod();">删除</a>
302                         </div>
303                     </a>
304                 </div>
305                 <div id="projectInfo50" class="tr clearfix ">
306                     <a href="/ProjectDetail/Index?PID=50">
307                         <div class="td w10">16-12257-1</div>
308                         <div class="td w10">CapitaLand-Chengdu</div>
309                         <div class="td w15">¥0</div>
310                         <div class="td w10">Frank Xu</div>
311                         <div class="td w10">2017/1/12 11:26:14</div>
312                         <div class="td w10">0</div>
313                         <div class="td w10">100.2</div>
314                         <div class="td w10">
315                             <span class="text-blue">
316                                             进行中
317                                         </span>
318                         </div>
319                         <div class="td w15" name='exportFilter'>
320                             <a href="/ProjectDetail/Index?PID=50">查看</a>
321                             /
322                             <a href="/ProjectEntering/Index?PID=50">修改</a>
323                             /
324                             <a name="aDeleteProject" data-id="50" href="javascript:viod();">删除</a>
325                         </div>
326                     </a>
327                 </div>
328                 <div id="projectInfo22" class="tr clearfix ">
329                     <a href="/ProjectDetail/Index?PID=22">
330                         <div class="td w10">test</div>
331                         <div class="td w10">test</div>
332                         <div class="td w15">¥2</div>
333                         <div class="td w10">admin</div>
334                         <div class="td w10">2017/1/10 16:12:29</div>
335                         <div class="td w10">4.4</div>
336                         <div class="td w10">10.5</div>
337                         <div class="td w10">
338                             <span class="text-green">完成</span>
339                         </div>
340                         <div class="td w15" name='exportFilter'>
341                             <a href="/ProjectDetail/Index?PID=22">查看</a>
342                         </div>
343                     </a>
344                 </div>
345 
346             </div>
347             <!-------------分页开始-------------->
348             <div class="show-page padding-big-right ">
349 
350                 <div class="page">
351                     <ul class="offcial-page margin-top margin-big-right">
352                         <li><em class="margin-small-left margin-small-right">6</em>条数据</li>
353                         <li>每页显示<em class="margin-small-left margin-small-right">15</em></li>
354                         <li>
355                             <a class="next disable" href="javascript:void();" id="aPre">上一页</a>
356                         </li>
357                         <li>
358                             <a class="next disable">1</a>
359                         </li>
360                         <li>
361                             <a class="next disable" href="javascript:void();" id="aNext">下一页</a>
362                         </li>
363                         <li><span class="fl"><em class="margin-small-left margin-small-right">1</em></span></li>
364                     </ul>
365                 </div>
366             </div>
367             <!-------------分页结束-------------->
368         </div>
369         
370 
371     </body>
372 
373 </html>
View Code

这种方式实际是把div处理了一下,重新创建了一个隐藏的div,把div布局的内容转换成table布局的内容放到隐藏的div中,中间用了jq的标签替换。(有更好的方法欢迎讨论)

$('#' + tableid + ' .tr-th').replaceWith(function() {
                        return $("<tr />", {
                            html: $(this).html(), class:$(this).attr('class'),
                            //设置execl样式,必须是style属性上的,通过class渲染的不行
                            style:"background-color:"+window.getComputedStyle(this).getPropertyValue("background-color"),    
                            align:"center"
                        });
                    });
jq替换标签

里面用到基于bootstrap的时间控件 资源下载

posted @ 2017-01-14 18:14  漫天行  阅读(497)  评论(0编辑  收藏  举报