Vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出導(dǎo)入實(shí)戰(zhàn)案例
前言
項(xiàng)目開發(fā)當(dāng)中,列表數(shù)據(jù)的導(dǎo)出功能基本是每個(gè)業(yè)務(wù)系統(tǒng)必備的功能、另外Excel數(shù)據(jù)批量導(dǎo)入數(shù)據(jù)庫也是比較常見的功能,一般開發(fā)都會(huì)采用POI、EasyExcel等后端框架實(shí)現(xiàn),后端服務(wù)實(shí)現(xiàn)的話,如果涉及業(yè)務(wù)調(diào)整的話,生產(chǎn)環(huán)境需要重啟后端服務(wù)。如果采用前端處理的話,就會(huì)方便很多,今天給大家介紹采用Vue框架集成xlsx組件的方式實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入、導(dǎo)出功能,希望對(duì)大家能有所幫助!
1、創(chuàng)建一個(gè)空白的vue2/vue3項(xiàng)目
可以通過腳手架方式創(chuàng)建一個(gè)vue示例項(xiàng)目。
需要的依賴包如下
"dependencies": { "element-ui": "2.10.1", "export2excel": "0.0.1", "file-saver": "^2.0.5", "vue": "^2.5.2", "vue-router": "^3.0.1", "xlsx": "^0.17.0" },
通過命令安裝
npm install export2excel@0.0.1 --save #導(dǎo)出到excel依賴包 npm install file-saver@2.0.5 --save #文件保存到客戶端 npm install xlsx@0.17.0 --save #操作excel依賴包
2、創(chuàng)建Export.vue 示例文件
主要實(shí)現(xiàn)表格內(nèi)容的導(dǎo)出和文件內(nèi)容導(dǎo)入的頁面的表格當(dāng)中,具體文件內(nèi)容完整內(nèi)容如下:
<template> <div class="hello"> <h1>{{ msg }}</h1> <el-row> <el-button size="small" type="primary" @click="exportTest">導(dǎo)出</el-button> <el-upload action="/" :on-change="importTest" :show-file-list="false" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" :auto-upload="false"> <el-button size="small" icon="el-icon-upload" type="primary">導(dǎo)入數(shù)據(jù)</el-button> </el-upload> </el-row> <el-row> <el-table ref="multipleTable" style="padding-top: 10px;" :data="listData" tooltip-effect="light" highlight-current-row :header-cell-style="{ background: '#E6EAF3', 'font-size': '13px', padding: '0px', height: '40px', }" v-loading="listLoading" :cell-style="{ 'font-size': '13px', padding: '0px', height: '34px' }"> <el-table-column label="序號(hào)" type="index" width="50"></el-table-column> <el-table-column label="姓名" show-overflow-tooltip width="110"> <template slot-scope="scope">{{ scope.row.name }}</template> </el-table-column> <el-table-column label="年齡" show-overflow-tooltip width=""> <template slot-scope="scope">{{ scope.row.age }}</template> </el-table-column> </el-table> </el-row> </div> </template> <script> import { export_json_to_excel } from "@/vendor/Export2Excel"; import Xlsx from 'xlsx' export default { name: 'HelloWorld', data() { return { msg: '導(dǎo)入導(dǎo)出測(cè)試', listData: [ { name: "小明", age: 30 }, { name: "小張", age: 25 }, { name: "小李", age: 29 } ], listLoading: false, xlscTitle: { "姓名": "name", "年齡": "age" }, } }, methods: { exportTest() { const header = [ "姓名", "年齡" ]; const body = [ "name", "age", ]; const data = this.formatJson(body, this.listData); console.log(data); export_json_to_excel({ header: header,// 表頭 data: data, // 數(shù)據(jù)列表 filename: "用戶表",// 保存文件名 }); }, //格式化json數(shù)據(jù)為導(dǎo)出數(shù)據(jù) 過濾掉查詢的數(shù)據(jù)列不在導(dǎo)出的列里面的數(shù)據(jù) formatJson(filterVal, jsonData) { return jsonData.map((a) => filterVal.map((b) => a[b])); }, importTest(file) { let self = this; const types = file.name.split('.')[1]; const fileType = ['xlsx', 'xlc', 'xlm', 'xls', 'xlt', 'xlw', 'csv'].some(item => { return item === types }); if (!fileType) { this.$message.error('文件格式錯(cuò)誤,請(qǐng)重新選擇文件!') } this.file2Xce(file).then(tab => { // 過濾,轉(zhuǎn)化正確的JSON對(duì)象格式 if (tab && tab.length > 0) { tab[0].sheet.forEach(item => { let obj = {}; for (let key in item) { obj[self.xlscTitle[key]] = item[key]; } self.listData.push(obj); }); if (self.listData.length) { this.$message.success('上傳成功') // 獲取數(shù)據(jù)后,下一步操作 } else { this.$message.error('空文件或數(shù)據(jù)缺失,請(qǐng)重新選擇文件!') } } }) }, // 讀取文件 file2Xce(file) { return new Promise(function (resolve, reject) { const reader = new FileReader(); reader.onload = function (e) { const data = e.target.result; //var Xlsx = require("xlsx"); this.wb = Xlsx.read(data, { type: "binary" }); const result = []; this.wb.SheetNames.forEach(sheetName => { result.push({ sheetName: sheetName, sheet: Xlsx.utils.sheet_to_json(this.wb.Sheets[sheetName]) }) }) resolve(result); } reader.readAsBinaryString(file.raw); }) } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> h1, h2 { font-weight: normal; } ul { list-style-type: none; padding: 0; } li { display: inline-block; margin: 0 10px; } a { color: #42b983; } </style>
總結(jié)
到此這篇關(guān)于Vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出導(dǎo)入的文章就介紹到這了,更多相關(guān)Vue數(shù)據(jù)導(dǎo)出導(dǎo)入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue后臺(tái)中優(yōu)雅書寫狀態(tài)標(biāo)簽的方法實(shí)例
在Vue中,我們可以非常便捷地通過標(biāo)簽實(shí)現(xiàn)狀態(tài)的保存,這篇文章主要給大家介紹了關(guān)于Vue后臺(tái)中如何優(yōu)雅的書寫狀態(tài)標(biāo)簽的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08vue3封裝echarts圖表數(shù)據(jù)無法渲染到頁面問題
這篇文章主要介紹了vue3封裝echarts圖表數(shù)據(jù)無法渲染到頁面問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09vue項(xiàng)目如何通過url鏈接引入其他系統(tǒng)頁面
這篇文章主要介紹了vue項(xiàng)目如何通過url鏈接引入其他系統(tǒng)頁面問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03詳解vue-cli中的ESlint配置文件eslintrc.js
本篇文章主要介紹了vue-cli中的ESlint配置文件eslintrc.js詳解 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09vue報(bào)錯(cuò)"vue-cli-service‘不是內(nèi)部或外部命令,也不是...”的解決辦法
這篇文章主要介紹了vue報(bào)錯(cuò)"vue-cli-service‘不是內(nèi)部或外部命令,也不是...”的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01