HTML導出Excel文件(相容IE及所有瀏覽器)

来源:https://www.cnblogs.com/wsk198726/archive/2018/09/26/9707029.html
-Advertisement-
Play Games

註意:IE瀏覽器需要以下設置: 打開IE,在常用工具欄中選擇“工具” >Internet選項 >選擇"安全"標簽頁 >選擇"自定義級別" >彈出的視窗中找到ActiveX控制項和插件 >將"ActiveX控制項自動提示""對沒有標記安全的ActiveX控制項進行初始化和腳本運行""下載未簽名的Active ...


註意:IE瀏覽器需要以下設置:

打開IE,在常用工具欄中選擇“工具”--->Internet選項---->選擇"安全"標簽頁--->選擇"自定義級別"--->彈出的視窗中找到ActiveX控制項和插件--->
將"ActiveX控制項自動提示"
"對沒有標記安全的ActiveX控制項進行初始化和腳本運行"
"下載未簽名的ActiveX控制項"
三項 選擇啟用 即可!

HtmlExportToExcel.js 代碼

  1 /*
  2  * HTML導出Excel文件(相容IE及所有瀏覽器)
  3  * @param {any} tableid  table父元素ID
  4  * @param {any} filename 文件名稱
  5  */
  6 function HtmlExportToExcel(tableid, filename) {
  7     if (getExplorer() === 'ie' || getExplorer() === undefined) {
  8         HtmlExportToExcelForIE(tableid, filename);
  9     }
 10     else {
 11         HtmlExportToExcelForEntire(tableid, filename);
 12     }
 13 }
 14 
 15 //IE瀏覽器導出Excel
 16 function HtmlExportToExcelForIE(tableId, filename) {
 17     try {
 18         var oXL = new ActiveXObject("excel.Application");
 19         //oXL.Visible = true;
 20         //oXL.ScreenUpdating = false;
 21     } catch (e1) {
 22         try {
 23             oXL = new ActiveXObject("et.Application");
 24         } catch (e2) {
 25             alert(e2.description + "\n\n\n要使用EXCEL對象,您必須安裝Excel電子錶格軟體\n或者,需要安裝Kingsoft ET軟體\n\n同時瀏覽器須使用“ActiveX 控制項”,您的瀏覽器須允許執行控制項。");
 26             return;
 27         }
 28     }
 29     //創建AX對象excel
 30     var oWB = oXL.Workbooks.Add();
 31     //獲取workbook對象
 32     var xlsheet = oWB.Worksheets(1);
 33 
 34     var elTable = document.getElementById(tableId);
 35 
 36     //替換掉表格td中隱藏的html元素
 37     var tableHtml = ReplaceHtml(elTable.innerHTML);
 38 
 39     var newTable = document.getElementById("newData");
 40     //console.log();
 41     newTable.innerHTML = tableHtml;
 42 
 43     //激活當前sheet
 44     var sel = document.body.createTextRange();
 45     sel.moveToElementText(newTable);
 46     //把表格中的內容移到TextRange中
 47     sel.select;
 48     //全選TextRange中內容
 49     sel.execCommand("Copy");
 50     //複製TextRange中內容
 51     xlsheet.Paste();
 52     //粘貼到活動的EXCEL中
 53     oXL.Visible = true;
 54     //設置excel可見屬性
 55 
 56     newTable.innerHTML = "";
 57 
 58     try {
 59         //設置 sheet 名稱
 60         xlsheet.Name = filename;
 61         var fname = oXL.Application.GetSaveAsFilename(filename + ".xls", "Excel Spreadsheets (*.xls), *.xls");
 62     } catch (e) {
 63         print("Nested catch caught " + e);
 64     } finally {
 65         oWB.SaveAs(fname);
 66         oWB.Close();
 67         //xls.visible = false;
 68         oXL.ScreenUpdating = true;
 69         oXL.Quit();
 70     }
 71 }
 72 
 73 //非IE瀏覽器導出Excel
 74 var HtmlExportToExcelForEntire = (function () {
 75     var uri = 'data:application/vnd.ms-excel;base64,',
 76         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]-->' +
 77             /**********這部分是載入表格的樣式  沒有樣式可以省略 start**********/
 78             '<style type="text/css">' +
 79             '.tablefrom {width: 100%;border-collapse: collapse;}' +
 80             '.tablefrom, .tablefrom td, .tablefrom th {text-align: center;font: 12px Arial, Helvetica, sans-serif;border: 1px solid #fff;}' +
 81             '.tablefrom th{background:#328aa4;color:#fff;}' +
 82             '.tablefrom td{background:#e5f1f4;}' +
 83             '.tablefrom .BlueBgColor td {color: #fff;background-color: #0070c0;}' +
 84             '.tablefrom .LightBlueBgColor td {color: #000000;background-color: #bdd7ee;}' +
 85             '.tablefrom  tr .BlueBgColorTd { color: #fff;background-color: #0070c0;}' +
 86             '.tablefrom tr .LightBlueBgColorTd {color: #000000;background-color: #bdd7ee;}' +
 87             '</style>'
 88             /**********這部分是載入表格的樣式  沒有樣式可以省略 end**********/
 89             + '</head><body>{table}</body></html>',
 90         base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))); },
 91         format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }); };
 92     return function (table, name) {
 93         if (!table.nodeType) { table = document.getElementById(table); }
 94         //替換掉表格td中隱藏的html元素
 95         var strHTML = ReplaceHtml(table.innerHTML);
 96         var ctx = { worksheet: name || 'Worksheet', table: strHTML };
 97         
 98         document.getElementById("dlink").href = uri + base64(format(template, ctx));
 99         document.getElementById("dlink").download = name + ".xls";
100         document.getElementById("dlink").click();
101     };
102 })();
103 
104 //獲取當前使用瀏覽器
105 function getExplorer() {
106     var explorer = window.navigator.userAgent;
107     //ie 
108     if (explorer.indexOf("MSIE") >= 0) {
109         return 'ie';
110     }
111     //firefox 
112     else if (explorer.indexOf("Firefox") >= 0) {
113         return 'Firefox';
114     }
115     //Chrome
116     else if (explorer.indexOf("Chrome") >= 0) {
117         return 'Chrome';
118     }
119     //Opera
120     else if (explorer.indexOf("Opera") >= 0) {
121         return 'Opera';
122     }
123     //Safari
124     else if (explorer.indexOf("Safari") >= 0) {
125         return 'Safari';
126     }
127 }
128 
129 //將隱藏的HTML元素替換掉
130 function ReplaceHtml(tableHtml) {
131     var radioValue = $('input[name="bedStatus"]:checked ').val();
132     if (radioValue === 'yuan') {
133         tableHtml = tableHtml.replace(/<span class="span_wanyuan" [^<>]*?>(.*?)<\/span>/gi, "");
134     }
135     else if (radioValue === 'wanyuan') {
136         tableHtml = tableHtml.replace(/<span class="span_yuan" [^<>]*?>(.*?)<\/span>/gi, "");
137     }
138     return tableHtml;
139 }
View Code

另外,我的功能需要替換掉td中隱藏的html元素,所以需要將新的table複製到另一個隱藏的div中。

頁面html代碼:

 1 <div id="divData">
 2     <table class="tablefrom" id="tbData" style="width: 100%; border-collapse: collapse;" border="0" cellspacing="0">
 3         <tbody>
 4             <tr>
 5                 <th rowspan="2" colspan="2" scope="col">序號</th>
 6                 <th style="min-width: 70px;" rowspan="2" scope="col">項目</th>
 7                 <th style="min-width: 50px;" rowspan="2" scope="col">維度</th>
 8                 <th style="min-width: 50px;" rowspan="2" scope="col">本月資金</th>
 9                 <th rowspan="2" colspan="1" scope="col">某部門</th>
10                 <th colspan="2" scope="col">支付</th>
11             </tr>
12             <tr>
13                 <th style="min-width: 50px;" scope="col">執行</th>
14                 <th style="min-width: 50px;" scope="col">餘額</th>
15             </tr>
16             <tr>
17                 <td style="color: rgb(0, 0, 0); font-weight: bold; background-color: rgb(189, 215, 238);" rowspan="163" scope="col">經營費用類</td>
18                 <td style="min-width: 50px;" rowspan="3" scope="col">1</td>
19                 <td rowspan="3" scope="col">銷售退款</td>
20                 <td scope="col">實際</td>
21                 <td style="color: rgb(0, 0, 0); background-color: rgb(189, 215, 238);" scope="col"><span class="span_yuan">100000</span><span class="span_wanyuan" style="display: none;">10</span></td>
22                 <td scope="col"><span class="span_yuan">100000</span><span class="span_wanyuan" style="display: none;">10</span></td>
23                 <td scope="col"><span class="span_yuan">100000</span><span class="span_wanyuan" style="display: none;">10</span></td>
24                 <td scope="col"><span class="span_yuan">900000</span><span class="span_wanyuan" style="display: none;">90</span></td>
25             </tr>
26             <tr>
27                 <td scope="col">計劃</td>
28                 <td style="color: rgb(0, 0, 0); background-color: rgb(189, 215, 238);" scope="col"><span class="span_yuan">1000000</span><span class="span_wanyuan" style="display: none;">100</span></td>
29                 <td scope="col"><span class="span_yuan">1000000</span><span class="span_wanyuan" style="display: none;">100</span></td>
30                 <td scope="col">-</td>
31                 <td scope="col">-</td>
32             </tr>
33             <tr>
34                 <td scope="col">差額</td>
35                 <td style="color: rgb(0, 0, 0); background-color: rgb(189, 215, 238);" scope="col"><span class="span_yuan">900000</span><span class="span_wanyuan" style="display: none;">90</span></td>
36                 <td scope="col"><span class="span_yuan">900000</span><span class="span_wanyuan" style="display: none;">90</span></td>
37                 <td scope="col">-</td>
38                 <td scope="col">-</td>
39             </tr>
40         </tbody>
41     </table>
42 </div>
43 <div id="newData" style="display: none;"></div>
View Code
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Jquery簡介 Jquery是一個優秀的Javascrīpt框架。它是輕量級的js庫(壓縮後只有21k) ,它相容CSS3,還相容各種瀏覽器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 Jquery應用到我們的項目中能夠使程式員從設計和書寫繁雜的J ...
  • position定位與表單 一、position 1、Position細說 Position:relative; Left:100px; Top:100px; Position:absolute; Left:100px; Top:100px; Position:relative;如果設置值了,相對原 ...
  • 原文鏈接(點擊跳轉) 第一:not defined 演示代碼: <span style="font-size:12px;"><span style="font-family:Microsoft YaHei;"><script type="text/javascript"> <span style=" ...
  • 接上一篇: 九丶偽數組 arguments arguments代表的是實參.有個講究的地方是:arguments只在函數中使用 (1)返回函數實參的個數:arguments.length (2)之所以說arguments是偽數組,是因為:arguments可以修改元素,但不能改變數組的長短, 清空數 ...
  • 問題: 為所有顯示樓盤的頁面添加一個載入失敗的預設圖片. 基本思路: img標簽中有個onerror屬性,專門用來處理載入失敗的事件.所以可以用jquery添加onerror屬性,在onerror中載入預設圖片. 註意:在頁面載入的時候添加,並且添加完成後清空onerror,否則會一直迴圈請求. ...
  • 場景描述: 在我們平時的開發過程中,經常會遇到這樣的情況。在搜索功能中進行模糊搜索或者聯想關聯。 這就要我們每次對輸入框中的數據進行改動時,都要發送一次請求。當在短時間內多次操作改動時,問題就出現了。 每次操作的請求都會返回數據,有時,返回的數據需要時間長,有時返回的數據需要時間短。大家都知道,aj ...
  • HTML: JavaScript: PHP介面(版本7.1.16): ...
  • 一、img的屬性:alt/title alt屬性是替換名字,是給搜索引擎抓取使用,當圖片顯示不出來時,就會顯示出alt的內容; title 屬性是提示文字,當滑鼠移到圖片上的時候會顯示出來,大部分的標簽都會有這個屬性 *******************************alt和title屬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...