摘要:由于項目臨時加入導(dǎo)出功能,后臺童靴沒有多余時間來處理,想前端來處理導(dǎo)出。查詢了前端導(dǎo)出方法,大部分是利用來做處理,按照來導(dǎo)出時是沒有樣式處理的。利用數(shù)據(jù)導(dǎo)出拿到后端數(shù)據(jù),先要對數(shù)據(jù)進行組裝才能導(dǎo)出我們想要的文件格式。
由于項目臨時加入導(dǎo)出Excel功能,后臺童靴沒有多余時間來處理,想前端來處理導(dǎo)出。
查詢了前端導(dǎo)出方法,大部分是利用js-xlsx來做處理,按照js-xlsx來導(dǎo)出excel時是沒有樣式處理的。需要我們來利用該庫的專業(yè)版本才能設(shè)置樣式。
這里就需要xlsx-style來處理,給我們的excel文件來添加樣式。
利用數(shù)據(jù)導(dǎo)出拿到后端數(shù)據(jù),先要對數(shù)據(jù)進行組裝才能導(dǎo)出我們想要的文件格式。如果想文件有樣式只能利用xlsx-style;
npm install xlsx-style
拷貝下載下來的文件目錄dist里的xlsx.core.min.js,引入文件
這里借鑒這位博主主要代碼,整理了下,可以實現(xiàn)表頭與導(dǎo)出文件名稱。
具體調(diào)用可以查看DEMO
/** * @param {Array} header 表格頭部 * @param {Array} body 表格數(shù)據(jù) * @param {String} title 表格導(dǎo)出名稱 * @param {Boolean} hasTitle 是否需要表格標(biāo)題 */ function ExportsEXCL() { this.downLoad = ({ header = [], body = [], title = "excel", hasTitle = false, }) => { const styleCell = this.setBorderStyle(); const _headers = header .map((v, i) => { let key = Object.keys(v); return Object.assign( {}, { v: `${v[key[0]]}利用DOM導(dǎo)出${key[0]}`, position: String.fromCharCode(65 + i) + (hasTitle ? 1 : 0) } ); }) .reduce( (prev, next) => Object.assign({}, prev, { [next.position]: { v: next.v, s: styleCell } }), {} ); const _body = body .map((v, i) => header.map((k, j) => { let key = Object.keys(k); return Object.assign( {}, { v: v[key[0]], position: String.fromCharCode(65 + j) + (i + (hasTitle ? 2 : 1)) } ); }) ) .reduce((prev, next) => prev.concat(next)) .reduce( (prev, next) => Object.assign({}, prev, { [next.position]: { v: next.v, s: styleCell } }), {} ); const mergeThead = this.setMergeThead(_headers, hasTitle, title); const _merges = this.setTableMerges(header, _headers, hasTitle); const _thead = this.setTableThead(mergeThead); const output = Object.assign({}, _thead, _body); const outputPos = Object.keys(output).sort(); const ref = outputPos[0] + ":" + outputPos[outputPos.length - 1]; const wb = { SheetNames: ["mySheet"], Sheets: { mySheet: Object.assign({}, output, { "!ref": ref, "!merges": _merges }) } }; this.save(wb, `${title}.xlsx`); }; this.setTableThead = wb => { for (let key in wb) { let i = wb[key].v.indexOf(" "); if (wb[key].v.includes(" ")) { wb[key].v = wb[key].v.substr(0, i); } } return wb; }; // 設(shè)置合并表頭 this.setTableMerges = (header, wb, hasTitle) => { let _merges = []; let len = header.length - 1; if (hasTitle) { let o = { s: { c: 0, r: 0 }, e: { c: len, r: 0 } }; _merges.push(o); } return [..._merges]; }; // 設(shè)置表頭 this.setMergeThead = (wb, merge, hasTitle, title) => { const borderAll = { top: { style: "thin" }, bottom: { style: "thin" }, left: { style: "thin" }, right: { style: "thin" } }; if (hasTitle) { wb["A1"] = { v: `${title}`, s: { border: borderAll, font: { sz: 18, bold: true }, alignment: { horizontal: "center" } } }; } return wb; }; this.setBorderStyle = () => { const borderAll = { top: { style: "thin" }, bottom: { style: "thin" }, left: { style: "thin" }, right: { style: "thin" } }; return { border: borderAll }; }; this.save = (wb, fileName) => { let wopts = { bookType: "xlsx", bookSST: false, type: "binary" }; let xw = XLSX.write(wb, wopts); let obj = new Blob([this.s2ab(xw)], { type: "" }); let elem = document.createElement("a"); elem.download = fileName || "下載"; elem.href = URL.createObjectURL(obj); elem.click(); setTimeout(function() { URL.revokeObjectURL(obj); }, 100); }; this.s2ab = s => { if (typeof ArrayBuffer !== "undefined") { 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; } else { var buf = new Array(s.length); for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xff; return buf; } }; // 根據(jù)val查詢Object key this.findKey = (val, obj) => { return Object.keys(obj).find(v => obj[v] === val); }; }
js-xlsx提供了一個直接導(dǎo)出HTML上的DOM表格方法XLSX.utils.table_to_book,但是導(dǎo)出的excel文件時沒有任何樣式,利用xlsx-style中的xlsx.full.min.js來導(dǎo)出時,沒有上面這個方法,后面取了巧。
把xlsx-style中的full文件導(dǎo)出來的XLSX改成了STYLEXLSX;
引用如下:
利用js-xlsx來導(dǎo)出表格數(shù)據(jù),用STYLEXLSX.write來寫入數(shù)據(jù)。
STYLEXLSX.write( wb, { bookType: type == undefined ? "xlsx" : type, bookSST: false, type: "binary" } )
具體主要代碼:
/** * * @param {Object} dom table的dom元素 * @param {Object} name 導(dǎo)出的表名 * @param {Object} type 導(dǎo)出的類型 * */ function exportExl(dom, name = "導(dǎo)出數(shù)據(jù)", type) { var wb = XLSX.utils.table_to_book(dom, {sheet: "Sheet JS"}); var wopts = { bookType: "xlsx", bookSST: true, type: "binary", cellStyles: true }; setExlStyle(wb["Sheets"]["Sheet JS"]); let tmpDown = new Blob( [ this.s2ab( STYLEXLSX.write( wb, { bookType: type == undefined ? "xlsx" : type, bookSST: false, type: "binary" } //這里的數(shù)據(jù)是用來定義導(dǎo)出的格式類型 ) ) ], { type: "" } ); saveAs( tmpDown, `${name}` + "." + (wopts.bookType == "biff2" ? "xls" : wopts.bookType) ); } function saveAs(obj, fileName) { let tmpa = document.createElement("a"); tmpa.download = fileName || "下載"; tmpa.href = URL.createObjectURL(obj); tmpa.click(); setTimeout(function() { URL.revokeObjectURL(obj); }, 100); } function s2ab (s){ if (typeof ArrayBuffer !== "undefined") { 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; } else { var buf = new Array(s.length); for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xff; return buf; } }; function setExlStyle (data) { let borderAll = { //單元格外側(cè)框線 top: { style: "thin" }, bottom: { style: "thin" }, left: { style: "thin" }, right: { style: "thin" } }; data["!cols"] = []; for (let key in data) { if (data[key] instanceof Object) { data[key].s = { border: borderAll, alignment: { horizontal: "center" //水平居中對其 }, numFmt: 0 } data["!cols"].push({wpx: 170}); } } return data; }缺陷
如果用數(shù)據(jù)來控制我們的導(dǎo)出,發(fā)現(xiàn)配置多級表頭時會好復(fù)雜,所以沒去深究了,用DOM來導(dǎo)出,又發(fā)現(xiàn)如果要導(dǎo)出分頁表格時只能導(dǎo)出當(dāng)前頁的數(shù)據(jù)。
而且現(xiàn)在所有的表格都可能不是規(guī)范的表格,每個表格結(jié)構(gòu)可能都不相同,只能多帶帶處理。
當(dāng)前所有代碼查看
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99098.html
摘要:簡介是前端操作以及類似的二維表的最佳選擇之一而是它的社區(qū)版本將注意力集中到了數(shù)據(jù)轉(zhuǎn)換和導(dǎo)出上所以它支持相當(dāng)多種類的數(shù)據(jù)解析和導(dǎo)出不僅僅局限于支持格式支持的導(dǎo)入格式支持的導(dǎo)出格式它可以解析符合格式的數(shù)據(jù)導(dǎo)出符合格式的數(shù)據(jù)利用中間層操作數(shù)據(jù) 簡介 SheetJS是前端操作Excel以及類似的二維表的最佳選擇之一,而js-xlsx是它的社區(qū)版本. js-xlsx將注意力集中到了數(shù)據(jù)轉(zhuǎn)換和導(dǎo)出...
摘要:使用時,前端可以將后端返回的數(shù)據(jù)拼接成自己需要導(dǎo)出的格式,下載到電腦中,完全不依賴后端。 前言 github: https://github.com/stardew516... 以往做excel表格下載功能的時候,都是后端生成好表格后,存儲在某個地方,然后給前端一個鏈接,前端使用a標(biāo)簽加download下載,或者使用node。其實純前端也是可以做表格下載的,有一個很好用的javascr...
摘要:介紹最近項目中讓實現(xiàn)一個導(dǎo)入導(dǎo)出的功能,查找了一些插件后發(fā)現(xiàn)這個插件,所以就嘗試使用了一下,這里將使用方法和遇到的問題簡單記錄一下。 介紹 最近項目中讓實現(xiàn)一個導(dǎo)入導(dǎo)出Excel的功能,查找了一些插件后發(fā)現(xiàn)js-xlsx這個插件,所以就嘗試使用了一下,這里將使用方法和遇到的問題簡單記錄一下。 SheetJS js-xlsx 是一款能夠讀寫多種格式表格的插件,瀏覽器支持良好,并且能在多個...
閱讀 2595·2021-09-23 11:21
閱讀 1891·2021-09-22 15:15
閱讀 982·2021-09-10 11:27
閱讀 3449·2019-08-30 15:54
閱讀 661·2019-08-30 15:52
閱讀 1342·2019-08-30 15:44
閱讀 2356·2019-08-29 15:06
閱讀 2981·2019-08-28 18:21