Vue3.0導(dǎo)出數(shù)據(jù)為自定義樣式Excel的詳細(xì)實(shí)例
前言
當(dāng)下開(kāi)發(fā)web應(yīng)用系統(tǒng)的時(shí)候,我們往往會(huì)遇到需要把網(wǎng)頁(yè)上面的數(shù)據(jù)導(dǎo)出到excel這樣的需求,真實(shí)的企業(yè)項(xiàng)目里對(duì)應(yīng)一些導(dǎo)出財(cái)務(wù)報(bào)表、員工信息、交易記錄、考勤打卡記錄…等等需求,本文將對(duì)此做探討。
開(kāi)始前補(bǔ)充: 網(wǎng)上是有些牛人已經(jīng)把這個(gè)功能封裝成組件了,但每個(gè)人的封裝邏輯五花八門(mén),組件的功能也很有限,不一定真能完全符合自己的業(yè)務(wù)需求,找相應(yīng)的API也很麻煩,存在不太敢用,不會(huì)用等問(wèn)題,那么本文將教你如何自己封裝,如何自己自定義相關(guān)功能,如何自定義Excel的樣式 ,尤其是導(dǎo)出excel后自定義樣式,這在一些現(xiàn)存封裝好的組件是不好實(shí)現(xiàn)的,本文可以實(shí)現(xiàn)!
本文導(dǎo)出Excel方法的優(yōu)點(diǎn): 網(wǎng)頁(yè)上的table與導(dǎo)出Excel之后的table完全獨(dú)立,也就是說(shuō)你導(dǎo)出Excel之后的內(nèi)容與網(wǎng)頁(yè)沒(méi)有直接聯(lián)系,這意味著數(shù)據(jù)導(dǎo)出到Excel后:
- 有非常強(qiáng)的定制性 ,實(shí)在不理解這句話也沒(méi)關(guān)系,本文看完你自然就明白了。
- 能跨瀏覽器兼容,甚至是某E瀏覽器。
- 導(dǎo)出非???,不卡頓!
編碼思路
采用HTML字符串拼接的方法,拼接出一個(gè)table,即可顯示到Excel;換句話來(lái)說(shuō)使用HTML的語(yǔ)法寫(xiě)出來(lái)的table能展示到excel上面,還能攜帶樣式!請(qǐng)用心看完拼接過(guò)程,拼接看懂了,你會(huì)90%了!
1、定義拼接函數(shù)
/** * * @param {表頭集合} header * @param {表格數(shù)據(jù)} table * @param {文件名} name * @param {表格名} tname * @param {回調(diào)方法} callback */ function transform(header, table, name, tname, callback) { ... }
2、表格模板字符串拼接
// 定義表格模板字符串 let tableInnerHTML = "" let headerData = header let bodyData = table //這里對(duì)應(yīng)是表格數(shù)據(jù),我們只需要傳過(guò)來(lái)即可 // 拼接完全使用thead、tbody、tr、td、th,并且相應(yīng)的tr、th、td里 // 視情況可以自己寫(xiě)一些 colspan(合并列) 及 rowspan(合并行)等高級(jí)操作 tableInnerHTML += "<thead><tr>"; // 表頭拼接--start tableInnerHTML += `<th colspan=${headerData.length} style="background:#CCFFFF;border:solid;">` + tname + "</th></tr>" tableInnerHTML += "<tr>" headerData.forEach(item => { tableInnerHTML += `<th rowspan="1" style="background:#FFFFCC; border:solid">${item}</th>` }) tableInnerHTML += "</tr></thead>"; // 表頭拼接--end tableInnerHTML += "<tbody>" // tbody拼接--start bodyData.forEach(item => { tableInnerHTML += "<tr>" // 這里視實(shí)際項(xiàng)目情況可以作一些過(guò)濾~ for (let key in item) { tableInnerHTML += `<td align="center" style="border:solid">${item[key]}</td>` } tableInnerHTML += "</tr>" }) tableInnerHTML += "</tbody>"; // tbody拼接--end
3、定義打印函數(shù)
/** * * @param {表格模板字符串} table * @param {文件名} name * @param {回調(diào)方法} callback */ function tableToExcel (table, name, callback) { ... }
4、生成 Blob 文件對(duì)象,并下載
let template = `<html><head><meta charset="UTF-8"></head><body><table>${table}</table></body></html>`; let format = function (s, c) { return s.replace(/{(w+)}/g, function (m, p) { return c[p]; }); }; let ctx = { worksheet: name || "Worksheet", table: table }; let blob = new Blob([format(template, ctx)]); let a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = name; //這里這個(gè)name就是對(duì)應(yīng)的文件名! a.click(); a.remove(); callback("success"); /*這里調(diào)用我們自己傳入的回調(diào)方法,這樣導(dǎo)出Excel完成后你就能 在外面知道導(dǎo)出完畢,并且再往下做自己其他的邏輯*/
5、調(diào)用示例
let headerData = ["序號(hào)", "姓名", "年齡", "性別", "愛(ài)好", "發(fā)量", "薪水"] let table = [ { index: 1, name: '武松', age: 18, sex: '男', hobby: '打虎', hair: '滿頭長(zhǎng)發(fā)', salaried: '每月五十文' } ]; let fileName = '測(cè)試導(dǎo)出xlsx' let tabelName = '梁山賊寇調(diào)查表' transform(headerData, table, fileName, tabelName, (v) => { console.log('callback: ', v) })
至此編碼完畢!上效果:
兼容性問(wèn)題處理
getExplorer 用于判斷瀏覽器類(lèi)型,主要針對(duì)IE瀏覽器做兼容性處理,這段代碼使用后基本上不會(huì)有任何兼容性問(wèn)題
Cleanup 用于關(guān)閉進(jìn)行IE瀏覽器兼容處理時(shí)開(kāi)啟的定時(shí)器
var idTmr; // 定義一個(gè)定時(shí)器對(duì)象 function getExplorer() { var explorer = window.navigator.userAgent; if (explorer.indexOf("MSIE") >= 0) { return "ie"; // ie } else if (explorer.indexOf("Firefox") >= 0) { return "Firefox"; // firefox } else if (explorer.indexOf("Chrome") >= 0) { return "Chrome"; // Chrome } else if (explorer.indexOf("Opera") >= 0) { return "Opera"; // Opera } else if (explorer.indexOf("Safari") >= 0) { return "Safari"; // Safari }; }; if (getExplorer() !== "Safari" && name.substr(-1, 4) !== ".xls") { name += ".xls"; } if (getExplorer() === "ie") { var curTbl = table; var oXL = new ActiveXObject("Excel.Application"); var oWB = oXL.Workbooks.Add(); var xlsheet = oWB.Worksheets(1); var sel = document.body.createTextRange(); sel.moveToElementText(curTbl); sel.select(); sel.execCommand("Copy"); xlsheet.Paste(); oXL.Visible = true; try { var fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls"); } catch (e) { print("Nested catch caught " + e); } finally { oWB.SaveAs(fname); // oWB.Close(savechanges = false); oXL.Quit(); oXL = null; idTmr = setInterval(Cleanup(), 1); } } else { // 無(wú)需作兼容處理的瀏覽器直接使用上面的打印方法即可 tableToExcel(tableInnerHTML, name, callback); } function Cleanup() { window.clearInterval(idTmr); }
最后導(dǎo)出封裝
可以在項(xiàng)目中創(chuàng)建一個(gè)exportExcel.js文件,并在項(xiàng)目中導(dǎo)出方法:export default transform,這樣就可以不用局限于在Vue里使用,哪怕是Jquery、React等其他前端框架,你只需要將封裝好的方法引入即可。
總結(jié)
到此這篇關(guān)于Vue3.0導(dǎo)出數(shù)據(jù)為自定義樣式Excel的文章就介紹到這了,更多相關(guān)Vue3.0導(dǎo)出數(shù)據(jù)為Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了用Vue制作的簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02多個(gè)vue項(xiàng)目實(shí)現(xiàn)共用一個(gè)node-modules文件夾
這篇文章主要介紹了多個(gè)vue項(xiàng)目實(shí)現(xiàn)共用一個(gè)node-modules文件夾,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Vue的事件響應(yīng)式進(jìn)度條組件實(shí)例詳解
這篇文章主要介紹了Vue的事件響應(yīng)式進(jìn)度條組件的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02Element-Plus表格實(shí)現(xiàn)Table自定義合并行數(shù)據(jù)
在開(kāi)發(fā)項(xiàng)目中,我們時(shí)常會(huì)用到表格,許多需求可能會(huì)要求自定義特定的行或列,下面就跟隨小編一起來(lái)學(xué)習(xí)一下在實(shí)際開(kāi)發(fā)中如何實(shí)現(xiàn)這一要求吧2024-12-12openlayers6之地圖覆蓋物overlay三種常用用法(popup彈窗marker標(biāo)注text文本)
這篇文章主要介紹了openlayers6之地圖覆蓋物overlay三種常用用法(popup彈窗marker標(biāo)注text文本),主要講overlay三種最常用的案例,感興趣的朋友一起看看吧2021-09-09詳解如何使用Vue-PDF在應(yīng)用中嵌入PDF文檔
在現(xiàn)代Web應(yīng)用中,PDF文檔的使用非常普遍,因?yàn)樗梢栽诟鞣N設(shè)備和操作系統(tǒng)上保持一致的外觀和格式,本文我們就來(lái)探討一下如何在Vue.js應(yīng)用中使用vue-pdf庫(kù)嵌入PDF文檔吧2023-08-08