最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3.0導出數(shù)據(jù)為自定義樣式Excel的詳細實例

 更新時間:2023年06月09日 15:31:07   作者:qq_24800489  
在許多的后臺系統(tǒng)中少不了導出Excel表格的功能,下面這篇文章主要給大家介紹了關于Vue3.0導出數(shù)據(jù)為自定義樣式Excel的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

當下開發(fā)web應用系統(tǒng)的時候,我們往往會遇到需要把網(wǎng)頁上面的數(shù)據(jù)導出到excel這樣的需求,真實的企業(yè)項目里對應一些導出財務報表、員工信息、交易記錄、考勤打卡記錄…等等需求,本文將對此做探討。

開始前補充: 網(wǎng)上是有些牛人已經(jīng)把這個功能封裝成組件了,但每個人的封裝邏輯五花八門,組件的功能也很有限,不一定真能完全符合自己的業(yè)務需求,找相應的API也很麻煩,存在不太敢用,不會用等問題,那么本文將教你如何自己封裝,如何自己自定義相關功能,如何自定義Excel的樣式 ,尤其是導出excel后自定義樣式,這在一些現(xiàn)存封裝好的組件是不好實現(xiàn)的,本文可以實現(xiàn)!

本文導出Excel方法的優(yōu)點: 網(wǎng)頁上的table與導出Excel之后的table完全獨立,也就是說你導出Excel之后的內(nèi)容與網(wǎng)頁沒有直接聯(lián)系,這意味著數(shù)據(jù)導出到Excel后:

  • 有非常強的定制性 ,實在不理解這句話也沒關系,本文看完你自然就明白了。
  • 能跨瀏覽器兼容,甚至是某E瀏覽器。
  • 導出非???,不卡頓!

編碼思路

采用HTML字符串拼接的方法,拼接出一個table,即可顯示到Excel;換句話來說使用HTML的語法寫出來的table能展示到excel上面,還能攜帶樣式!請用心看完拼接過程,拼接看懂了,你會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
//這里對應是表格數(shù)據(jù),我們只需要傳過來即可 
// 拼接完全使用thead、tbody、tr、td、th,并且相應的tr、th、td里
// 視情況可以自己寫一些 colspan(合并列) 及 rowspan(合并行)等高級操作
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>"
    // 這里視實際項目情況可以作一些過濾~
    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 文件對象,并下載

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; //這里這個name就是對應的文件名! 
a.click();
a.remove();
callback("success"); /*這里調(diào)用我們自己傳入的回調(diào)方法,這樣導出Excel完成后你就能 在外面知道導出完畢,并且再往下做自己其他的邏輯*/

5、調(diào)用示例

let headerData = ["序號", "姓名", "年齡", "性別", "愛好", "發(fā)量", "薪水"]
let table = [
    {
        index: 1,
        name: '武松',
        age: 18,
        sex: '男',
        hobby: '打虎',
        hair: '滿頭長發(fā)',
        salaried: '每月五十文'
    }
];
let fileName = '測試導出xlsx'
let tabelName = '梁山賊寇調(diào)查表'
transform(headerData, table, fileName, tabelName, (v) => {
    console.log('callback: ', v)
})

至此編碼完畢!上效果:

兼容性問題處理

getExplorer 用于判斷瀏覽器類型,主要針對IE瀏覽器做兼容性處理,這段代碼使用后基本上不會有任何兼容性問題

Cleanup 用于關閉進行IE瀏覽器兼容處理時開啟的定時器

var idTmr; // 定義一個定時器對象
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 {
    // 無需作兼容處理的瀏覽器直接使用上面的打印方法即可
    tableToExcel(tableInnerHTML, name, callback);
}
function Cleanup() {
    window.clearInterval(idTmr);
}

最后導出封裝

可以在項目中創(chuàng)建一個exportExcel.js文件,并在項目中導出方法:export default transform,這樣就可以不用局限于在Vue里使用,哪怕是Jquery、React等其他前端框架,你只需要將封裝好的方法引入即可。

總結

到此這篇關于Vue3.0導出數(shù)據(jù)為自定義樣式Excel的文章就介紹到這了,更多相關Vue3.0導出數(shù)據(jù)為Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue-cli的工程模板與構建工具詳解

    vue-cli的工程模板與構建工具詳解

    vue-cli提供的腳手架只是一個最基礎的,也可以說是Vue團隊認為的工程結構的一種最佳實踐。這篇文章主要介紹了vue-cli的工程模板與構建工具 ,需要的朋友可以參考下
    2018-09-09
  • vue+element-plus上傳圖片及回顯問題及數(shù)量限制

    vue+element-plus上傳圖片及回顯問題及數(shù)量限制

    本文主要介紹了vue+element-plus上傳圖片及回顯問題及數(shù)量限制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Vue組件通信之父傳子與子傳父詳細講解

    Vue組件通信之父傳子與子傳父詳細講解

    這篇文章主要介紹了React中父子組件通信詳解,在父組件中,為子組件添加屬性數(shù)據(jù),即可實現(xiàn)父組件向子組件通信,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-10-10
  • Vue通過getAction的finally來最大程度避免影響主數(shù)據(jù)呈現(xiàn)問題

    Vue通過getAction的finally來最大程度避免影響主數(shù)據(jù)呈現(xiàn)問題

    這篇文章主要介紹了Vue通過getAction的finally來最大程度避免影響主數(shù)據(jù)呈現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • vue中的slot封裝組件彈窗

    vue中的slot封裝組件彈窗

    這篇文章主要介紹了vue中的slot封裝組件彈窗,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 老生常談vue3組件通信方式

    老生常談vue3組件通信方式

    這篇文章主要介紹了vue3組件通信方式,面試題經(jīng)常會問到vue3組件間的通信方式,今天就通過實例代碼給大家詳細介紹下,對vue3組件通信相關知識感興趣的朋友一起看看吧
    2022-08-08
  • Vue彈窗Dialog最佳使用方案實戰(zhàn)

    Vue彈窗Dialog最佳使用方案實戰(zhàn)

    這篇文章主要為大家介紹了極度舒適的Vue彈窗Dialog最佳使用方案實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Vue設置select下拉框的默認選項詳解(select空白bug解決)

    Vue設置select下拉框的默認選項詳解(select空白bug解決)

    最近開始學習vue,在學習的過程中遇到的問題將記錄在這里,下面這篇文章主要給大家介紹了關于Vue設置select下拉框的默認選項(select空白bug解決)的相關資料,需要的朋友可以參考下
    2022-12-12
  • vue3+element?plus實現(xiàn)側邊欄過程

    vue3+element?plus實現(xiàn)側邊欄過程

    這篇文章主要介紹了vue3+element?plus實現(xiàn)側邊欄過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • VUE腳手架的下載和配置步驟詳解

    VUE腳手架的下載和配置步驟詳解

    這篇文章主要介紹了VUE腳手架下載和配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04

最新評論

吴忠市| 乐安县| 昌江| 遵化市| 阳江市| 鲜城| 张家界市| 淮阳县| 邢台县| 淳化县| 鹤壁市| 关岭| 菏泽市| 和硕县| 扬中市| 霍林郭勒市| 怀集县| 若羌县| 马龙县| 亚东县| 隆回县| 图片| 泽库县| 正镶白旗| 黑河市| 宣武区| 曲松县| 开远市| 敦煌市| 嘉峪关市| 太仆寺旗| 图木舒克市| 黑山县| 称多县| 平度市| 顺义区| 瑞丽市| 昔阳县| 荣昌县| 唐海县| 武宣县|