vue前端導(dǎo)出多級(jí)表頭的excel表的示例代碼
1.安裝npm依賴
npm install xlsx file-saver -S npm install xlsx
2.引入完整的Export2Excel.js
/* eslint-disable */ import { saveAs } from 'file-saver' import XLSX from 'xlsx' function generateArray(table) { var out = []; var rows = table.querySelectorAll('tr'); var ranges = []; for (var R = 0; R < rows.length; ++R) { var outRow = []; var row = rows[R]; var columns = row.querySelectorAll('td'); for (var C = 0; C < columns.length; ++C) { var cell = columns[C]; var colspan = cell.getAttribute('colspan'); var rowspan = cell.getAttribute('rowspan'); var cellValue = cell.innerText; if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; //Skip ranges ranges.forEach(function (range) { if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); } }); //Handle Row Span if (rowspan || colspan) { rowspan = rowspan || 1; colspan = colspan || 1; ranges.push({ s: { r: R, c: outRow.length }, e: { r: R + rowspan - 1, c: outRow.length + colspan - 1 } }); }; //Handle Value outRow.push(cellValue !== "" ? cellValue : null); //Handle Colspan if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null); } out.push(outRow); } return [out, ranges]; }; function datenum(v, date1904) { if (date1904) v += 1462; var epoch = Date.parse(v); return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); } function sheet_from_array_of_arrays(data, opts) { var ws = {}; var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } }; for (var R = 0; R != data.length; ++R) { for (var C = 0; C != data[R].length; ++C) { if (range.s.r > R) range.s.r = R; if (range.s.c > C) range.s.c = C; if (range.e.r < R) range.e.r = R; if (range.e.c < C) range.e.c = C; var cell = { v: data[R][C] }; if (cell.v == null) continue; var cell_ref = XLSX.utils.encode_cell({ c: C, r: R }); if (typeof cell.v === 'number') cell.t = 'n'; else if (typeof cell.v === 'boolean') cell.t = 'b'; else if (cell.v instanceof Date) { cell.t = 'n'; cell.z = XLSX.SSF._table[14]; cell.v = datenum(cell.v); } else cell.t = 's'; ws[cell_ref] = cell; } } if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); return ws; } function Workbook() { if (!(this instanceof Workbook)) return new Workbook(); this.SheetNames = []; this.Sheets = {}; } function s2ab(s) { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } export function export_table_to_excel(id) { var theTable = document.getElementById(id); var oo = generateArray(theTable); var ranges = oo[1]; /* original data */ var data = oo[0]; var ws_name = "SheetJS"; var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); /* add ranges to worksheet */ // ws['!cols'] = ['apple', 'banan']; ws['!merges'] = ranges; /* add worksheet to workbook */ wb.SheetNames.push(ws_name); wb.Sheets[ws_name] = ws; var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' }); saveAs(new Blob([s2ab(wbout)], { type: "application/octet-stream" }), "test.xlsx") } // 對(duì)此方法進(jìn)行修改,如下: export function export_json_to_excel({ multiHeader2 = [], // 第一行表頭 multiHeader = [], // 第二行表頭 header, // 第三行表頭 data, filename, //文件名 merges = [], // 合并 autoWidth = true, bookType = 'xlsx' } = {}) { /* original data */ filename = filename || '列表'; data = [...data] data.unshift(header); for (let i = multiHeader2.length - 1; i > -1; i--) { data.unshift(multiHeader2[i]) } for (let i = multiHeader.length - 1; i > -1; i--) { data.unshift(multiHeader[i]) } var ws_name = "SheetJS"; var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); if (merges.length > 0) { if (!ws['!merges']) ws['!merges'] = []; merges.forEach(item => { ws['!merges'].push(XLSX.utils.decode_range(item)) }) } if (autoWidth) { /*設(shè)置worksheet每列的最大寬度*/ const colWidth = data.map(row => row.map(val => { /*先判斷是否為null/undefined*/ if (val == null) { return { 'wch': 10 }; } /*再判斷是否為中文*/ else if (val.toString().charCodeAt(0) > 255) { return { 'wch': val.toString().length * 2 }; } else { return { 'wch': val.toString().length }; } })) /*以第一行為初始值*/ let result = colWidth[0]; for (let i = 1; i < colWidth.length; i++) { for (let j = 0; j < colWidth[i].length; j++) { if (result[j]['wch'] < colWidth[i][j]['wch']) { result[j]['wch'] = colWidth[i][j]['wch']; } } } ws['!cols'] = result; } /* add worksheet to workbook */ wb.SheetNames.push(ws_name); wb.Sheets[ws_name] = ws; var wbout = XLSX.write(wb, { bookType: bookType, bookSST: false, type: 'binary' }); saveAs(new Blob([s2ab(wbout)], { type: "application/octet-stream" }), `${filename}.${bookType}`); }
3.vue文件中引入
import { export_json_to_excel } from "@/assets/js/Export2Excel";
4.直接上js,其他的布局之類的我就不展示了
data() { return { transforList: [], //表格數(shù)據(jù)源 excelData: [], //表格數(shù)據(jù),這個(gè)是你自己請(qǐng)求的真實(shí)數(shù)據(jù) } } methods: { //重置EXcel數(shù)據(jù) resetExcelData() { this.excelData = []; if (this.transforList.length > 0) { for (let excelItem of this.transforList) { // console.log(excelItem.transformerEntityList); let excelObj = { plantname: excelItem.plantname != null && excelItem.plantname != undefined ? excelItem.plantname : "", transName: excelItem.transName != null && excelItem.transName != undefined ? excelItem.transName : "", ea: excelItem.ea != null && excelItem.ea != undefined ? excelItem.ea : "", sa: excelItem.sa != null && excelItem.sa != undefined ? excelItem.sa : "", //視在功率 pa: excelItem.pa != null && excelItem.pa != undefined ? excelItem.pa : "", //有功功率 fa: excelItem.fa != null && excelItem.fa != undefined ? excelItem.fa : "", //無(wú)功功率 f: excelItem.f != null && excelItem.f != undefined ? excelItem.f : "", //功率因數(shù) az: excelItem.az != null && excelItem.az != undefined ? excelItem.az : "", //A相繞組溫度 bz: excelItem.bz != null && excelItem.bz != undefined ? excelItem.bz : "", //B相繞組溫度 cz: excelItem.cz != null && excelItem.cz != undefined ? excelItem.cz : "", //C相繞組溫度 status: excelItem.status != null && excelItem.status != undefined ? excelItem.status : "", fuhe: "--%", }; this.excelData.push(excelObj); } } }, //json格式化 formatJson(filterVal, jsonData) { jsonData.map((v) => filterVal.map((j) => v[j])); return jsonData.map((v) => filterVal.map((j) => v[j])); }, //導(dǎo)出方法 exportExcel() { this.resetExcelData(); const multiHeader = [ [ "站點(diǎn)名稱", "變壓器名稱", "狀態(tài)", "額定容量(kVA)", "視在功率(kW)", "負(fù)荷率(100%)", "有功功率(kW)", "無(wú)功功率(kVar)", "功率因數(shù)", "三相繞組溫度", "", "", ] ]; //一級(jí)表頭 const tHeader = ["", "", "", "", "", "", "", "", "", "A", "B", "C"]; //二級(jí)表頭 const filterVal = ["plantname","transName","status","ea","sa","fuhe","pa", "fa","f","az","bz","cz"];//表頭所對(duì)應(yīng)后臺(tái)返回的字段 // const data = this.excelData.map(v => filterVal.map(j => v[j]));//這一行和下面得六行代碼是一樣得作用的 let list = []; if (this.excelData == 0) { list = this.excelData; } else { list = this.excelData; } const data = this.formatJson(filterVal, list);//格式化 console.log(data); //這個(gè)得說(shuō)明一下:網(wǎng)上得博客每個(gè)不一樣,你那我的直接用也是沒(méi)啥用得,你的理解這個(gè)合并是怎么寫的:根據(jù)你的多級(jí)表頭,如果沒(méi)有合并得從上往下寫,遇到開(kāi)始合并單元格的,從左往右得單行寫,從上到下,直到寫完整 const merges = [ "A1:A2", "B1:B2", "C1:C2", "D1:D2", "E1:E2", "F1:F2", "G1:G2", "H1:H2", "I1:I2", "J1:L1" ]; export_json_to_excel({ multiHeader, //這里是第一行的表頭 header: tHeader, //這里應(yīng)該是算第二行的表頭 data,//數(shù)據(jù) merges,//合并行 filename: "變壓器狀態(tài)" + "_" + new Date().getTime(), autoWidth: true, bookType: 'xlsx' }); } }
5.效果
總結(jié)
我的這個(gè)是兩級(jí)表頭,那么三級(jí)表頭你應(yīng)該也會(huì)做的,只是merges得細(xì)心找一下!
到此這篇關(guān)于vue前端導(dǎo)出多級(jí)表頭的excel表的示例代碼的文章就介紹到這了,更多相關(guān)vue 導(dǎo)出excel多級(jí)表頭內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ElementUI?$notify通知方法中渲染自定義組件實(shí)現(xiàn)
這篇文章主要為大家介紹了ElementUI?$notify通知方法中渲染自定義組件實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06vue2使用wangeditor實(shí)現(xiàn)手寫輸入功能
這篇文章主要為大家詳細(xì)介紹了vue2如何使用wangeditor實(shí)現(xiàn)手寫輸入功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下2023-12-12vue3解決各場(chǎng)景l(fā)oading過(guò)度的五種方法
這篇文章主要為大家詳細(xì)介紹了vue3中解決各場(chǎng)景l(fā)oading過(guò)度的五種方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-11-11Vue簡(jiǎn)明介紹配置對(duì)象的配置選項(xiàng)
我們知道每一個(gè)vue項(xiàng)目應(yīng)用都是通過(guò)vue的構(gòu)造函數(shù)進(jìn)行創(chuàng)建一個(gè)新的vue項(xiàng)目的。創(chuàng)建vue實(shí)例的配置對(duì)象,可以包括一下屬性選項(xiàng),比如:data、methods、watch、template等等,每一個(gè)選項(xiàng)都有不同的功能,大家可以根據(jù)自己的需求選擇不同的配置2022-08-08