vue+element項目中導(dǎo)出excel表格

1.首先,先引入三個依賴包,這個是必不可少的

? ? **最好使用cnpm下載,因為我之前試了好久,不使用cnpm,根本無法下載下來

cnpm install file-saver@1.3.3? ?用來保存文件的

cnpm install --save-dev script-loader 由于由于這幾個文件不支持import引入,所以我們需要`script-loader`來將他們掛載到全局環(huán)境下。

cnpm install jszip? ? ?導(dǎo)出為壓縮文件?

cnpm install xlsx? ? excel處理庫


2.創(chuàng)建一個文件夾,名字叫vendor,放在項目的src目錄就可以了,里面放置三個文件,Blog.js,Export2Excel.js,Export2Zip.js,文件的具體內(nèi)容你直接copy我下面寫的就可以了,當然你也可以自行百度這些文件的內(nèi)容,因為我也是直接復(fù)制過來的

Blob.js

/* eslint-disable */

/* Blob.js

* A Blob implementation.

* 2014-05-27

*

* By Eli Grey, http://eligrey.com

* By Devin Samarin, https://github.com/eboyjr

* License: X11/MIT

*? See LICENSE.md

*/

/*global self, unescape */

/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,

plusplus: true */

/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */

(function (view) {

? ? "use strict";

? ? view.URL = view.URL || view.webkitURL;

? ? if (view.Blob && view.URL) {

? ? ? ? try {

? ? ? ? ? ? new Blob;

? ? ? ? ? ? return;

? ? ? ? } catch (e) {}

? ? }

? ? // Internally we use a BlobBuilder implementation to base Blob off of

? ? // in order to support older browsers that only have BlobBuilder

? ? var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {

? ? ? ? ? ? var

? ? ? ? ? ? ? ? get_class = function(object) {

? ? ? ? ? ? ? ? ? ? return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? , FakeBlobBuilder = function BlobBuilder() {

? ? ? ? ? ? ? ? ? ? this.data = [];

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? , FakeBlob = function Blob(data, type, encoding) {

? ? ? ? ? ? ? ? ? ? this.data = data;

? ? ? ? ? ? ? ? ? ? this.size = data.length;

? ? ? ? ? ? ? ? ? ? this.type = type;

? ? ? ? ? ? ? ? ? ? this.encoding = encoding;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? , FBB_proto = FakeBlobBuilder.prototype

? ? ? ? ? ? ? ? , FB_proto = FakeBlob.prototype

? ? ? ? ? ? ? ? , FileReaderSync = view.FileReaderSync

? ? ? ? ? ? ? ? , FileException = function(type) {

? ? ? ? ? ? ? ? ? ? this.code = this[this.name = type];

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? , file_ex_codes = (

? ? ? ? ? ? ? ? ? ? "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "

? ? ? ? ? ? ? ? ? ? + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"

? ? ? ? ? ? ? ? ).split(" ")

? ? ? ? ? ? ? ? , file_ex_code = file_ex_codes.length

? ? ? ? ? ? ? ? , real_URL = view.URL || view.webkitURL || view

? ? ? ? ? ? ? ? , real_create_object_URL = real_URL.createObjectURL

? ? ? ? ? ? ? ? , real_revoke_object_URL = real_URL.revokeObjectURL

? ? ? ? ? ? ? ? , URL = real_URL

? ? ? ? ? ? ? ? , btoa = view.btoa

? ? ? ? ? ? ? ? , atob = view.atob

? ? ? ? ? ? ? ? , ArrayBuffer = view.ArrayBuffer

? ? ? ? ? ? ? ? , Uint8Array = view.Uint8Array

? ? ? ? ? ? ? ? ;

? ? ? ? ? ? FakeBlob.fake = FB_proto.fake = true;

? ? ? ? ? ? while (file_ex_code--) {

? ? ? ? ? ? ? ? FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;

? ? ? ? ? ? }

? ? ? ? ? ? if (!real_URL.createObjectURL) {

? ? ? ? ? ? ? ? URL = view.URL = {};

? ? ? ? ? ? }

? ? ? ? ? ? URL.createObjectURL = function(blob) {

? ? ? ? ? ? ? ? var

? ? ? ? ? ? ? ? ? ? type = blob.type

? ? ? ? ? ? ? ? ? ? , data_URI_header

? ? ? ? ? ? ? ? ? ? ;

? ? ? ? ? ? ? ? if (type === null) {

? ? ? ? ? ? ? ? ? ? type = "application/octet-stream";

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if (blob instanceof FakeBlob) {

? ? ? ? ? ? ? ? ? ? data_URI_header = "data:" + type;

? ? ? ? ? ? ? ? ? ? if (blob.encoding === "base64") {

? ? ? ? ? ? ? ? ? ? ? ? return data_URI_header + ";base64," + blob.data;

? ? ? ? ? ? ? ? ? ? } else if (blob.encoding === "URI") {

? ? ? ? ? ? ? ? ? ? ? ? return data_URI_header + "," + decodeURIComponent(blob.data);

? ? ? ? ? ? ? ? ? ? } if (btoa) {

? ? ? ? ? ? ? ? ? ? ? ? return data_URI_header + ";base64," + btoa(blob.data);

? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ? return data_URI_header + "," + encodeURIComponent(blob.data);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? } else if (real_create_object_URL) {

? ? ? ? ? ? ? ? ? ? return real_create_object_URL.call(real_URL, blob);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? };

? ? ? ? ? ? URL.revokeObjectURL = function(object_URL) {

? ? ? ? ? ? ? ? if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {

? ? ? ? ? ? ? ? ? ? real_revoke_object_URL.call(real_URL, object_URL);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? };

? ? ? ? ? ? FBB_proto.append = function(data/*, endings*/) {

? ? ? ? ? ? ? ? var bb = this.data;

? ? ? ? ? ? ? ? // decode data to a binary string

? ? ? ? ? ? ? ? if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {

? ? ? ? ? ? ? ? ? ? var

? ? ? ? ? ? ? ? ? ? ? ? str = ""

? ? ? ? ? ? ? ? ? ? ? ? , buf = new Uint8Array(data)

? ? ? ? ? ? ? ? ? ? ? ? , i = 0

? ? ? ? ? ? ? ? ? ? ? ? , buf_len = buf.length

? ? ? ? ? ? ? ? ? ? ? ? ;

? ? ? ? ? ? ? ? ? ? for (; i < buf_len; i++) {

? ? ? ? ? ? ? ? ? ? ? ? str += String.fromCharCode(buf[i]);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? bb.push(str);

? ? ? ? ? ? ? ? } else if (get_class(data) === "Blob" || get_class(data) === "File") {

? ? ? ? ? ? ? ? ? ? if (FileReaderSync) {

? ? ? ? ? ? ? ? ? ? ? ? var fr = new FileReaderSync;

? ? ? ? ? ? ? ? ? ? ? ? bb.push(fr.readAsBinaryString(data));

? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ? // async FileReader won't work as BlobBuilder is sync

? ? ? ? ? ? ? ? ? ? ? ? throw new FileException("NOT_READABLE_ERR");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? } else if (data instanceof FakeBlob) {

? ? ? ? ? ? ? ? ? ? if (data.encoding === "base64" && atob) {

? ? ? ? ? ? ? ? ? ? ? ? bb.push(atob(data.data));

? ? ? ? ? ? ? ? ? ? } else if (data.encoding === "URI") {

? ? ? ? ? ? ? ? ? ? ? ? bb.push(decodeURIComponent(data.data));

? ? ? ? ? ? ? ? ? ? } else if (data.encoding === "raw") {

? ? ? ? ? ? ? ? ? ? ? ? bb.push(data.data);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? if (typeof data !== "string") {

? ? ? ? ? ? ? ? ? ? ? ? data += ""; // convert unsupported types to strings

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? // decode UTF-16 to binary string

? ? ? ? ? ? ? ? ? ? bb.push(unescape(encodeURIComponent(data)));

? ? ? ? ? ? ? ? }

? ? ? ? ? ? };

? ? ? ? ? ? FBB_proto.getBlob = function(type) {

? ? ? ? ? ? ? ? if (!arguments.length) {

? ? ? ? ? ? ? ? ? ? type = null;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return new FakeBlob(this.data.join(""), type, "raw");

? ? ? ? ? ? };

? ? ? ? ? ? FBB_proto.toString = function() {

? ? ? ? ? ? ? ? return "[object BlobBuilder]";

? ? ? ? ? ? };

? ? ? ? ? ? FB_proto.slice = function(start, end, type) {

? ? ? ? ? ? ? ? var args = arguments.length;

? ? ? ? ? ? ? ? if (args < 3) {

? ? ? ? ? ? ? ? ? ? type = null;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return new FakeBlob(

? ? ? ? ? ? ? ? ? ? this.data.slice(start, args > 1 ? end : this.data.length)

? ? ? ? ? ? ? ? ? ? , type

? ? ? ? ? ? ? ? ? ? , this.encoding

? ? ? ? ? ? ? ? );

? ? ? ? ? ? };

? ? ? ? ? ? FB_proto.toString = function() {

? ? ? ? ? ? ? ? return "[object Blob]";

? ? ? ? ? ? };

? ? ? ? ? ? FB_proto.close = function() {

? ? ? ? ? ? ? ? this.size = this.data.length = 0;

? ? ? ? ? ? };

? ? ? ? ? ? return FakeBlobBuilder;

? ? ? ? }(view));

? ? view.Blob = function Blob(blobParts, options) {

? ? ? ? var type = options ? (options.type || "") : "";

? ? ? ? var builder = new BlobBuilder();

? ? ? ? if (blobParts) {

? ? ? ? ? ? for (var i = 0, len = blobParts.length; i < len; i++) {

? ? ? ? ? ? ? ? builder.append(blobParts[i]);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return builder.getBlob(type);

? ? };

}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));


Export2Excel.js

/* eslint-disable */

require('script-loader!file-saver');

require('script-loader!@/vendor/Blob');

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")

}

export function export_json_to_excel(th, jsonData, defaultTitle) {

? ? /* original data */

? ? var data = jsonData;

? ? console.log('th',th);

? ? console.log('jsonData',jsonData);

? ? console.log('defaultTitle',defaultTitle)

? ? data.unshift(th);

? ? var ws_name = "SheetJS";

? ? var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);

? ? /*設(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: 'xlsx', bookSST: false, type: 'binary'});

? ? var title = defaultTitle || 'excel-list'

? ? saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")

}


Export2Zip.js

/* eslint-disable */

require('script-loader!file-saver');

import JSZip from 'jszip'

export function export_txt_to_zip(th, jsonData, txtName, zipName) {

? const zip = new JSZip()

? const txt_name = txtName || 'file'

? const zip_name = zipName || 'file'

? const data = jsonData

? let txtData = `${th}\r\n`

? data.forEach((row) => {

? ? let tempStr = ''

? ? tempStr = row.toString()

? ? txtData += `${tempStr}\r\n`

? })

? zip.file(`${txt_name}.txt`, txtData)

? zip.generateAsync({type:"blob"}).then((blob) => {

? ? saveAs(blob, `${zip_name}.zip`)

? }, (err) => {

? ? alert('導(dǎo)出失敗')

? })

}

3.上面的步驟完成之后,接下來就容易多了

????a.在導(dǎo)出文件的按鈕上注冊事件


????b.觸發(fā)事件

圖1

this.countList :數(shù)據(jù)表的內(nèi)容

this.formJson : 把數(shù)據(jù)進行轉(zhuǎn)化,根據(jù)你需要的進行打?。ū热缥疫@邊是后端傳過來的targetType是數(shù)字,我要根據(jù)數(shù)字轉(zhuǎn)換成相應(yīng)的文字)

**這是圖一截圖中的代碼,到時候需要的話直接復(fù)制就可以**

ExportData() {

? ? ? import("@/vendor/Export2Excel").then(excel => {

? ? ? ? //表格的表頭列表

? ? ? ? const tHeader = [ "姓名", "手機號", "角色類型", '結(jié)算類型',"應(yīng)收時間",'發(fā)車次數(shù)','待付總金額(元)','最終金額(元)'];

? ? ? ? //與表頭相對應(yīng)的數(shù)據(jù)里邊的字段

? ? ? ? const filterVal = ['targetName' ,'targetMobile','targetType','settleWayDes' ,'expectDate' ,'amountNumber' , 'amountMoney','amountMoney' ];

? ? ? ? const list = this.countList;

? ? ? ? const data = this.formatJson(filterVal, list);

? ? ? ? //這里還是使用export_json_to_excel方法比較好,方便操作數(shù)據(jù)

? ? ? ? excel.export_json_to_excel(tHeader,data,'合并收款');

? ? ? });

? ? },


c.洗數(shù)據(jù)

這個就需要你根據(jù)業(yè)務(wù)需求進行相應(yīng)的修改

溫馨提示,如果你的數(shù)據(jù)并不需要轉(zhuǎn)換,那你把formatJson里面的if判斷全部刪除,直接使用那個return v[j]就可以

結(jié)束

到這里就完成了導(dǎo)出表格的功能,是不是感覺很簡單,畢竟前人種樹后人乘涼,我當初做這個可是花費了很長時間的,因為別人文檔很多地方都介紹的不是很清楚,自己還是摸索了很久,還有不懂得可以私信問我


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容