vue之Excel导出和导入

  • vue之Excel导出和导入
    • Excel导入
    • Excel导出
    • Excel多级表头导出

vue之Excel导出和导入

Excel导入

注意:多级表头的Excel导出排版出现错乱

1、封装导入Excel组件

<template><div><inputtype="file"class="upFile"ref="fileExcel"accept=".xlsx, .xls"@change="uploadFile"/><el-button type="primary" @click="handleClick">导入</el-button></div>
</template><script>
import XLSX from 'xlsx'
export default {props: {breforeUpload: Function,onSuccess: Function},data() {return {excelList: {header: null,results: null}}},methods: {handleClick() {this.$refs.fileExcel.click()},generateData({ header, results }) {this.excelList.header = headerthis.excelList.results = resultsthis.onSuccess && this.onSuccess(this.excelList)},uploadFile(e) {const file = e.target.files[0]this.$refs.fileExcel.value = nullthis.readData(file)},readData(file) {return new Promise(resolve => {const readfile = new FileReader()readfile.onload = e => {const data = e.target.resultconst workbook = XLSX.read(data, { type: 'array' })const firstSheetName = workbook.SheetNames[0]const worksheet = workbook.Sheets[firstSheetName]const header = this.getHeaderRow(worksheet)const results = XLSX.utils.sheet_to_json(worksheet)this.generateData({ header, results })resolve()}readfile.readAsArrayBuffer(file)})},getHeaderRow(sheet) {const headers = []const range = XLSX.utils.decode_range(sheet['!ref'])let Cconst R = range.s.r/* start in the first row */for (C = range.s.c; C <= range.e.c; ++C) {/* walk every column in the range */const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]/* find the cell in the first row */let hdr = 'UNKNOWN ' + C // <-- replace with your desired defaultif (cell && cell.t) hdr = XLSX.utils.format_cell(cell)headers.push(hdr)}return headers}}
}
</script>
<style lang="scss" scoped>
.upFile {display: none;
}
</style>

2、页面中使用

<template><div class="excelIn"><el-card><div slot="header"><span>导入表格</span></div><upload-excel :on-success="generateData"></upload-excel><el-table:data="tabList"borderstripestyle="width: 100%;margin-top: 30px;"><el-table-columnv-for="item in tabHeader":prop="item":key="item":label="item"></el-table-column></el-table></el-card></div>
</template><script>
import UploadExcel from '@/components/UploadExcel'
export default {data() {return {tabList: [],tabHeader: []}},methods: {generateData({ header, results }) {this.tabHeader = headerthis.tabList = results}},components: {UploadExcel}
}
</script>
<style></style>

3、效果如下

Excel导出

<template><div class="excelOut"><el-card><div slot="header"><span>导出表格</span></div><el-inputtype="text"v-model="filename"placeholder="输入导出的文件名称"clearableclass="wid300 mtrt20"></el-input><el-button type="primary" @click="excelDow" class="btnStyle1">导出</el-button><el-table:data="tabList"borderstripestyle="width: 100%;margin-top: 30px;"><el-table-column prop="id" label="序号" width="80"> </el-table-column><el-table-column prop="date" label="出生日期"> </el-table-column><el-table-column prop="name" label="姓名"> </el-table-column><el-table-column prop="sex" label="性别"> </el-table-column><el-table-column prop="position" label="职业"> </el-table-column><el-table-column prop="address" label="地址"> </el-table-column></el-table></el-card></div>
</template><script>
export default {name: 'excel-out',data() {return {tabList: [{id: 1,date: '1992-05-02',name: '王小虎',sex: '男',position: '医生',address: '上海市普陀区金沙江路 1518 弄'},{id: 2,date: '1999-05-04',name: '小明',sex: '男',position: '老师',address: '北京市朝阳区'},{id: 3,date: '1980-05-01',name: '小敏',sex: '女',position: '护士',address: '上海市浦东区 1519 弄'},{id: 4,date: '2016-05-03',name: '小黑',sex: '男',position: '学者',address: '上海市普陀区金沙江路 1516 弄'},{id: 5,date: '2016-05-03',name: '小虎',sex: '男',position: '运动员',address: '上海市普陀区金沙江路 1516 弄'},{id: 6,date: '2016-05-03',name: '小白',sex: '男',position: 'Java开发',address: '上海市普陀区金沙江路 1516 弄'},{id: 7,date: '2016-05-03',name: '小牛',sex: '男',position: '前端开发',address: '上海市普陀区金沙江路 1516 弄'},{id: 8,date: '2016-05-03',name: '小辉',sex: '男',position: '大数据开发',address: '上海市普陀区金沙江路 1516 弄'},{id: 9,date: '2016-05-03',name: '小龙',sex: '男',position: '全栈开发',address: '上海市普陀区金沙江路 1516 弄'},{id: 10,date: '2016-05-03',name: '小敏',sex: '女',position: '前台指导',address: '上海市普陀区金沙江路 1516 弄'}],autoWidth: true,bookType: 'xlsx',filename: ''}},methods: {excelDow() {import('@/vendor/Export2Excel.js').then(moudle => {const tHeader = ['序号', '日期', '姓名', '性别', '职业', '地址']const filterVal = ['id', 'date', 'name', 'sex', 'position', 'address']const list = this.tabListconst data = this.formatJson(filterVal, list)moudle.export_json_to_excel({header: tHeader,data,filename: this.filename === '' ? 'filename' : this.filename,autoWidth: this.autoWidth,bookType: this.bookType})})},formatJson(filterVal, jsonData) {return jsonData.map(v => filterVal.map(j => v[j]))}}
}
</script>

引入文件 vendor / Export2Excel.js

安装必要的包

npm install -S file-saver
npm install -S xlsx
npm install -D script-loader
/* eslint-disable */
require('script-loader!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.innerTextif (cellValue !== '' && cellValue == +cellValue) cellValue = +cellValue//Skip rangesranges.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 Spanif (rowspan || colspan) {rowspan = rowspan || 1colspan = colspan || 1ranges.push({s: {r: R,c: outRow.length},e: {r: R + rowspan - 1,c: outRow.length + colspan - 1}})}//Handle ValueoutRow.push(cellValue !== '' ? cellValue : null)//Handle Colspanif (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 += 1462var 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 = Rif (range.s.c > C) range.s.c = Cif (range.e.r < R) range.e.r = Rif (range.e.c < C) range.e.c = Cvar cell = {v: data[R][C]}if (cell.v == null) continuevar 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) & 0xffreturn 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] = wsvar 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({multiHeader = [],header,data,filename,merges = [],autoWidth = true,bookType = 'xlsx'
} = {}) {/* original data */filename = filename || 'excel-list'data = [...data]data.unshift(header)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) {/*设置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] = wsvar wbout = XLSX.write(wb, {bookType: bookType,bookSST: false,type: 'binary'})saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}),`${filename}.${bookType}`)
}

Excel多级表头导出

<template><div class="excelOut"><el-card><div slot="header"><span>导出表格</span></div><el-inputtype="text"v-model="filename"placeholder="输入导出的文件名称"clearableclass="wid300 mtrt20"></el-input><el-button type="primary" @click="excelDow" class="btnStyle1">导出</el-button><el-table:data="tabList"borderstripestyle="width: 100%;margin-top: 30px;"><el-table-column prop="id" label="序号" width="80"></el-table-column><el-table-column label="配送信息"><el-table-column prop="name" label="姓名"> </el-table-column><el-table-column label="地址"><el-table-column prop="province" label="省份"> </el-table-column><el-table-column prop="city" label="市区"> </el-table-column><el-table-column prop="address" label="地址"> </el-table-column><el-table-column prop="zip" label="邮编"> </el-table-column></el-table-column></el-table-column><el-table-column prop="date" label="日期"> </el-table-column></el-table></el-card></div>
</template><script>
export default {data() {return {tabList: [{id: 1,date: '2019-06-14',name: '王小虎',province: '上海',city: '普陀区',address: '上海市普陀区金沙江路 1518 弄',zip: 200333},{id: 2,date: '2020-06-16',name: '小明',province: '北京',city: '朝阳区',address: '西坝河小区',zip: 200334},{id: 3,date: '1999-11-17',name: '小敏',province: '广东',city: '广州市',address: '天河区',zip: 9528012},{id: 4,date: '2021-06-16',name: '小黑',province: '广东',city: '深圳市',address: '南山区',zip: 9527012},{id: 5,date: '2021-06-16',name: '小虎',province: '重庆',city: '重庆市',address: '那个区',zip: 500567},{id: 6,date: '2021-06-16',name: '小牛',province: '河南',city: '商丘市',address: '睢阳区',zip: 411423},{id: 7,date: '2021-06-16',name: '小谭',province: '山东',city: '德州市',address: '德诚区',zip: 5115789},{id: 8,date: '2021-06-16',name: '小白',province: '云南',city: '大理市',address: '那个湾',zip: 985211}],autoWidth: true,bookType: 'xlsx',filename: ''}},methods: {excelDow() {import('@/vendor/Export2Excel.js').then(moudle => {const multiHeader = [['序号', '配送信息', '', '', '', '', '日期'],['', '姓名', '地址', '', '', '', '']]const tHeader = ['', '', '省份', '市区', '地址', '邮编', '']const filterVal = ['id','name','province','city','address','zip','date']const list = this.tabListconst data = this.formatJson(filterVal, list)const merges = ['A1:A3', 'B1:F1', 'G1:G3', 'B2:B3', 'C2:F2']moudle.export_json_to_excel({multiHeader,header: tHeader,data,merges,filename: this.filename === '' ? 'filename' : this.filename,autoWidth: this.autoWidth,bookType: this.bookType})})},formatJson(filterVal, jsonData) {return jsonData.map(v => filterVal.map(j => v[j]))}}
}
</script>

效果如下

vue之Excel导出和导入相关推荐

  1. vue 实现Excel 导出

    前言 数据表格的导出,是实际开发的常见功能,前后端都可以实现表格导出,讲解自己在用的一种. 获取数据源,可以通过后端接口实现,也可以利用分页查询的表格接口来实现. 处理数据,对excel表格的表头(最 ...

  2. 基于vue 实现 excel导出导入功能

    第一步下包 excel导入导出功能需要我们下载哪些包? 在vue-element-admin中有着详细的文档查看: Excel 导出 Excel 的导入导出都是依赖于js-xlsx来实现的. 在 js ...

  3. Vue 项目excel导出功能

    一.思路 前端主导(工作大量在前端) 二.新建文件夹及文件 新建src/vendor/export2Excel.js 示例代码:示例地址 /* eslint-disable */ import { s ...

  4. SpringMVC + JDBC + POI Excel导出与导入 +下载 资源

    最近用 POI 做了个 导入 导出,所以自己就搭了个 SpringMVC + JDBC + POI 的简单框架,把过程 记录一下,方便回忆 demo框架: SpringMVC + JDBC  数据库: ...

  5. vue中excel导出功能

    将vue-element-admin中的src/vendor/export2Excel复制到本项目中,直接使用 插件包位于src/vendor/export2Excel中,采用的是按需引入的方式 什么 ...

  6. vue实现excel文件的导入和读取

    1.效果展示 上传数据前 上传数据后 或者 2.下载 npm install xlsx@0.17.0 如果一直报关于xlsx的read的错误,这里是因为xlsx的0.18.0版本已经没有read属性了 ...

  7. vue+element-ui文件导出模板及导入xlsx文件

    vue文件的导出与导入 前言 一.导出模板和导入xlsx文件 二.导出JS方法,单独写示例 1.接口方法 2.页面调用导出方法 三.导入表格JS代码 前言 当我们做后台管理的时候,不免会遇到导出模版, ...

  8. vue合并表格excel导出_Vue实现导出excel表格功能

    引言: 最近使用vue在做一个后台系统,技术栈 vue + iView ,在页面中生成表格后, iView可以实现表格的导出,不过只能导出csv格式的,并不适合项目需求. 如果想要导出Excel 在s ...

  9. 动态表头excel导出(java)

    动态表头excel导出 1. 导入依赖并设置实体 首先配置poi版本相关的maven属性 <properties><poi.version>4.1.2</poi.vers ...

最新文章

  1. dubbo原理_dubbo实现原理介绍
  2. js里的null 与undefined
  3. HBase性能优化总结
  4. MySQL数据库之互联网常用架构方案(全)
  5. 多种问题袭来:崩溃在边缘的“直播赚钱路”
  6. 拓端tecdat|R语言多分类logistic逻辑回归模型在混合分布模拟个人风险损失值评估的应用
  7. hexo 环境变量_优雅的博客框架,快速、简洁、高效且主题丰富——Hexo
  8. E路航LH950N更换电池全程图解
  9. DWORD winapi java_DWORD WINAPI?stdcall?
  10. 有什么软件可以测试游戏视频数据,免费录制游戏视频软件有哪些?看完你就知道了...
  11. 软件系统设计-1-软件设计原则
  12. 如何查看系统开关机时间
  13. 安装JAVA SE 安装包
  14. 基本共射放大电路的动态分析以及放大电路Q点的稳定
  15. matlab 毕业答辩,MATLAB的答辩.ppt
  16. ‘DatePicker.RangePicker‘ cannot be used as a JSX component.
  17. 细数参加区块链技术及应用峰会(BTA)·中国的六大理由
  18. linux开发环境工具
  19. 【干货】Java实习面试经验汇总
  20. 点击iPhone/iPad上的加密相册或保险箱提示“无法安装加密相册或保险箱,App Store已不提供此应用”解决方案

热门文章

  1. 上海浦东新区计算机专科学校,上海|专科
  2. php先乘除还是先加减,加减乘除运算法则是什么?
  3. intersect mysql,MySQL不支持INTERSECT和MINUS及其替代方法
  4. 2-12 输出华氏-摄氏温度转换表 (15 分)
  5. npm install 报错没有匹配版本:No matching version found for
  6. 国产麒麟(Kylin)系统编译Openldap
  7. fedora如何隐藏顶部状态栏_桌面便签如何始终保持显示,便签如何在桌面显示
  8. NOIP提高组初赛模拟赛赛后感想
  9. 公司内部打印机自动安装批处理文件
  10. 方大九钢携手图扑软件:数字孪生“高精尖”智慧钢厂