Vue前端導出Excel文件的詳細實現(xiàn)方案
一、技術選型
1.使用 vue-json-excel 插件實現(xiàn)
優(yōu)點:簡單便捷,易上手,開箱即用;
缺點:不支持 excel 表格樣式設置,且支持功能比較單一;
2.基于 sheetJS-xlsx 解析器的 xlsx-style 實現(xiàn)(推薦)
優(yōu)點:支持格式眾多,支持 excel 表格樣式設置,功能強大,可控性高,可讀取和導出excel;
缺點:使用較為復雜,上手成本較大,且高級功能需要收費,但該功能可以借助 xlsx-style 實現(xiàn);
二、技術實現(xiàn)
使用 vue-json-excel 插件實現(xiàn)
1.安裝 vue-json-excel 依賴
npm install -S vue-json-excel
2.注冊插件到 vue 實例
import Vue from "vue";
import JsonExcel from "vue-json-excel";
Vue.component("downloadExcel", JsonExcel);
3.使用方式
在需要觸發(fā)導出事件的外出包裹 download-excel 組件
該組件支持的屬性可參考vue-json-excel 的 github 文檔
<download-excel :data="json_data"> Download Data <img src="download_icon.png" /> </download-excel>
首先需要處理導出到 excel 文件的數(shù)據(jù)內容,分別是以下數(shù)據(jù):
- 表頭名數(shù)據(jù) json_fields:可以選擇要導出的字段,并為字段分配標簽。該數(shù)據(jù)類型為 Object ,key 對應的是標簽,value 對應的是 JSON 字段,將導出與數(shù)據(jù)列表相同字段的數(shù)據(jù)。如果需要自定義導出的數(shù)據(jù),可以定義回調函數(shù)。
- 表格數(shù)據(jù) json_data:該數(shù)據(jù)類型為 Array,存儲了需要導出的數(shù)據(jù)內容;
let json_fields = {
// fieldLabel(表頭名),attributeName(對應字段名)
fieldLabel: attributeName,
// 使用回調自定義導出數(shù)據(jù)
anotherFieldLabel: {
field: anotherAttributeName,
callback: (value) => {
return `formatted value ${value}`;
},
},
};
let json_data = [
{
attributeName: value1,
anotherAttributeName: value2
},
{
attributeName: value3,
anotherAttributeName: value4
}
];
處理完數(shù)據(jù)之后則可以將數(shù)據(jù)傳入 download-excel 組件中,該組件沒有任何樣式,只需要設置內部包裹的元素樣式即可;
<download-excel class="btn btn-default" :data="json_data" :fields="json_fields" worksheet="My Worksheet" name="filename.xls" > Download Excel (you can customize this with html code!) </download-excel>
然而在實際的業(yè)務場景下,導出表格數(shù)據(jù)通常是導出表格的所有數(shù)據(jù),所以在導出的過程中,需要調用請求接口去獲取表格中的所有數(shù)據(jù),而調用接口獲取數(shù)據(jù)是異步執(zhí)行的過程,該插件也針對這個場景提供了解決方案。
相關案例:
<template>
<div id="app">
<downloadexcel
class = "btn"
:fetch = "fetchData"
:fields = "json_fields"
:before-generate = "startDownload"
:before-finish = "finishDownload">
Download Excel
</downloadexcel>
</div>
</template>
<script>
import downloadexcel from "vue-json-excel";
import axios from 'axios';
export default {
name: "App",
components: {
downloadexcel,
},
data(){
return {
json_fields: {
'Complete name': 'name',
'Date': 'date',
},
}
}, //data
methods:{
async fetchData(){
const response = await axios.get(URL);
return response.data.holidays;
},
startDownload(){
alert('show loading');
},
finishDownload(){
alert('hide loading');
}
}
};
</script>
基于 sheetJS-xlsx 解析器的 xlsx-style 實現(xiàn)(推薦)
由于這部分涉及內容較多,后續(xù)有需要會封裝該功能
這里只對封裝的 export2Excel 使用方法進行說明,暫時不對原理進行講解。
該插件不僅支持 excel 文件的導出,也支持文件導入功能,并且導出 excel 文件的不僅支持 json 數(shù)據(jù),也支持 table 導出;
由于 sheetjs-xlsx 提供的工具庫其高級功能是付費項目,如修改表格樣式等功能,因此選用了基于 sheetjs-xlsx 實現(xiàn)的 xlsx-style 插件。
兼容性:

1.安裝依賴
npm install -S xlsx npm install -S xlsx-style
而 xlsx-style 插件在使用的時候會報錯,官方也對該問題給出了解決方案,就是在根目錄下的vue.config.js配置文件添加如下代碼:
module.exports = {
configureWebpack: {
externals: {
'./cptable': 'var cptable'
}
}
}
還有一種方案是改源代碼,但不推薦使用,就不做說明了。
2.使用方法
這里封裝了導出 excel 文件的方法,其中,文件下載的功能有兩個方案實現(xiàn),分別是:
- 通過 a 標簽的文件下載功能,利用 URL.createObjectURL 方法生成下載鏈接實現(xiàn);(本文使用的方法)
- 通過第三方插件 file-saver 插件實現(xiàn)文件下載功能;
js-xlsx 插件自帶了相關的函數(shù)去方便實現(xiàn)不同數(shù)據(jù)格式的轉換:
- aoa_to_sheet converts an array of arrays of JS data to a worksheet.
- json_to_sheet converts an array of JS objects to a worksheet.
- table_to_sheet converts a DOM TABLE element to a worksheet.
- sheet_add_aoa adds an array of arrays of JS data to an existing worksheet.
- sheet_add_json adds an array of JS objects to an existing worksheet.
下面是封裝的 export2Excel 函數(shù)具體代碼,只需要將代碼復制到創(chuàng)建的 export2Excel.js 文件中即可:
/**
* create by lwj
* @file 導出export插件封裝
*/
import * as styleXLSX from 'xlsx-style'
/**
* 將 String 轉換成 ArrayBuffer
* @method 類型轉換
* @param {String} [s] wordBook內容
* @return {Array} 二進制流數(shù)組
*/
function s2ab (s) {
let buf = null;
if (typeof ArrayBuffer !== 'undefined') {
buf = new ArrayBuffer(s.length);
let view = new Uint8Array(buf);
for (let i = 0; i != s.length; ++i) {
view[i] = s.charCodeAt(i) & 0xFF;
}
return buf;
}
buf = new Array(s.length);
for (let i = 0; i != s.length; ++i) {
// 轉換成二進制流
buf[i] = s.charCodeAt(i) & 0xFF;
}
return buf;
}
/**
* 方案一:利用 URL.createObjectURL 下載 (以下選用)
* 方案二:通過 file-saver 插件實現(xiàn)文件下載
* @method 文件下載
* @param {Object} [obj] 導出內容 Blob 對象
* @param {String} [fileName] 文件名 下載是生成的文件名
* @return {void}
*/
function saveAs (obj, fileName) {
let aLink = document.createElement("a");
if (typeof obj == 'object' && obj instanceof Blob) {
aLink.href = URL.createObjectURL(obj); // 創(chuàng)建blob地址
}
aLink.download = fileName;
aLink.click();
setTimeout(function () {
URL.revokeObjectURL(obj);
}, 100);
}
/**
* @method 數(shù)據(jù)導出excel
* @param {Object} [worksheets] 工作表數(shù)據(jù)內容
* @param {String} [fileName='ExcelFile'] 導出excel文件名
* @param {String} [type='xlsx'] 導出文件類型
*/
export default function export2Excel ({
worksheets,
fileName = 'ExcelFile',
type = 'xlsx'
} = {}) {
let sheetNames = Object.keys(worksheets);
let workbook = {
SheetNames: sheetNames, //保存的工作表名
Sheets: worksheets
};
// excel的配置項
let wopts = {
bookType: type, // 生成的文件類型
bookSST: false, // 是否生成Shared String Table,官方解釋是,如果開啟生成速度會下降,但在低版本IOS設備上有更好的兼容性
type: 'binary'
}
// attempts to write the workbook
let wbout = styleXLSX.write(workbook, wopts);
let wbBlob = new Blob([s2ab(wbout)], {
type: "application/octet-stream"
});
saveAs(wbBlob, fileName + '.' + type);
}
需要注意幾個問題:
- xlsx 和 xlsx-style 的默認導出函數(shù)名都是 XLSX ,如果同時導入的話,需要注意設置別名,避免函數(shù)覆蓋出現(xiàn)問題;
- 如果不想使用 xlsx 插件,只使用 xlsx-style 插件同樣也是可以的,只是要自己將需要導出的數(shù)據(jù)轉換成 worksheet 格式對象,其原理也就是將導出數(shù)據(jù)轉換成 worksheet 規(guī)定的數(shù)據(jù)格式,具體可以查看js-xlsx 文檔說明;(可以自己嘗試實現(xiàn))
然后只需要在需要導出 excel 的地方調用即可,如果對導出表格樣式有要求的情況下,可以去了解如何配置表格樣式,具體配置方法可以去xlsx-style 文檔 中查看。
如果是 json 數(shù)據(jù)導出,需要對表頭名和字段進行映射;
相關案例:
import XLSX from 'xlsx';
import export2Excel from '@/assets/utils/export2Excel';
// json 格式
let jsonTable = [{
"sheet1id": 1,
"表頭1": "數(shù)據(jù)11",
"表頭2": "數(shù)據(jù)12",
"表頭3": "數(shù)據(jù)13",
"表頭4": "數(shù)據(jù)14"
}, {
"sheet1id": 2,
"表頭1": "數(shù)據(jù)21",
"表頭2": "數(shù)據(jù)22",
"表頭3": "數(shù)據(jù)23",
"表頭4": "數(shù)據(jù)24"
}];
// 二維數(shù)組格式
let aoa = [
['sheet2id', '表頭1', '表頭2', '表頭3', '表頭4'],
[1, '數(shù)據(jù)11', '數(shù)據(jù)12', '數(shù)據(jù)13', '數(shù)據(jù)14'],
[2, '數(shù)據(jù)21', '數(shù)據(jù)22', '數(shù)據(jù)23', '數(shù)據(jù)24']
]
function handleExportExcel () {
// 使用 XLSX 內置的工具庫將 json 轉換成 sheet
let worksheet1 = XLSX.utils.json_to_sheet(jsonTable);
// 使用 XLSX 內置的工具庫將 aoa 轉換成 sheet
let worksheet2 = XLSX.utils.aoa_to_sheet(aoa);
// 設置 excel 表格樣式
worksheet1["B1"].s = {
font: {
sz: 14,
bold: true,
color: {
rgb: "FFFFAA00"
}
},
fill: {
bgColor: {
indexed: 64
},
fgColor: {
rgb: "FFFF00"
}
}
};
// 單元格合并
worksheet1["!merges"] = [{
s: { c: 1, r: 0 },
e: { c: 4, r: 0 }
}];
export2Excel({
worksheets: {
sheet1: worksheet1,
sheet2: worksheet2
}, // 導出excel的數(shù)據(jù),key表示工作表名,value表示對應工作表的 sheet 數(shù)據(jù),支持導出多個工作表
fileName: '我的excel', // 導出文件名
type: 'xlsx' // 文件導出類型
});
}
三、參考資料
總結
到此這篇關于Vue前端導出Excel文件的文章就介紹到這了,更多相關Vue導出Excel文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue打包靜態(tài)資源后顯示空白及static文件路徑報錯的解決
這篇文章主要介紹了vue打包靜態(tài)資源后顯示空白及static文件路徑報錯的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
vue-cli 自定義指令directive 添加驗證滑塊示例
本篇文章主要介紹了vue-cli 自定義指令directive 添加驗證滑塊示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
vue+canvas實現(xiàn)數(shù)據(jù)實時從上到下刷新瀑布圖效果(類似QT的)
這篇文章主要介紹了vue+canvas實現(xiàn)數(shù)據(jù)實時從上到下刷新瀑布圖效果(類似QT的),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04
element的el-table自定義最后一行的實現(xiàn)代碼
最后一行要顯示一些其他結果,用的是element? ui 自帶的數(shù)據(jù)總計的屬性;返回一個數(shù)組,會按下標進行展示,這篇文章主要介紹了element的el-table自定義最后一行的實現(xiàn)代碼,需要的朋友可以參考下2024-03-03

