安装插件 js-xlsx

npm install xlsx --save

js-xlsx
使用js-xlsx时,前端可以将后端返回的json数据拼接成自己需要导出的格式,下载到电脑中,完全不依赖后端。导入只需像平时一样选择文件,然后解析excel表格数据,转换成json格式。

<template>
<div class="index" v-loading.fullscreen.lock="fullscreenLoading" element-loading-text="拼命加载中..."><inputtype="file"@change="importFile(this)"id="imFile"style="display: none"accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"/><a id="downlink"></a>
<el-button class="button" @click="uploadFile()">导入</el-button><el-button class="button" @click="downloadFile(excelData)">导出</el-button><!--错误信息提示--><el-dialog title="提示" v-model="errorDialog" size="tiny"><span>{{errorMsg}}</span><span slot="footer" class="dialog-footer"><el-button type="primary" @click="errorDialog=false">确认</el-button></span></el-dialog><!--展示导入信息--><el-table :data="excelData" tooltip-effect="dark"><el-table-column label="名称" prop="name" show-overflow-tooltip></el-table-column><el-table-column label="分量" prop="size" show-overflow-tooltip></el-table-column><el-table-column label="口味" prop="taste" show-overflow-tooltip></el-table-column><el-table-column label="单价(元)" prop="price" show-overflow-tooltip></el-table-column><el-table-column label="剩余(份)" prop="remain" show-overflow-tooltip></el-table-column></el-table></div>
</template>
<script>
// 引入xlsx
var XLSX = require('xlsx')
export default {name: 'Index',data () {return {fullscreenLoading: false, // 加载中imFile: '', // 导入文件eloutFile: '', // 导出文件elerrorDialog: false, // 错误信息弹窗errorMsg: '', // 错误信息内容excelData: [ // 测试数据{name: '泡芙', size: '500g', taste: '酸奶', price: '30', remain: '56'}, {name: '蛋挞', size: '500g', taste: '原味', price: '34', remain: '32'},  {name: '冰淇淋', size: '500g',taste: '抹茶', price: '45', remain: '21'},  {name: '榴莲酥', size: '500g', taste: '榴莲', price: '25', remain: '26'}]}},mounted () {this.imFile = document.getElementById('imFile')this.outFile = document.getElementById('downlink')},methods: {uploadFile: function () { // 点击导入按钮this.imFile.click()},downloadFile: function (rs) { // 点击导出按钮let data = [{}]for (let k in rs[0]) {data[0][k] = k}data = data.concat(rs)this.downloadExl(data, '菜单')},importFile: function () { // 导入excelthis.fullscreenLoading = truelet obj = this.imFileif (!obj.files) {this.fullscreenLoading = falsereturn}var f = obj.files[0]var reader = new FileReader()let _this = thisreader.onload = function (e) {var data = e.target.resultif (_this.rABS) {_this.wb = XLSX.read(btoa(this.fixdata(data)), { // 手动转化type: 'base64'})} else {_this.wb = XLSX.read(data, {type: 'binary'})}let json = XLSX.utils.sheet_to_json(_this.wb.Sheets[_this.wb.SheetNames[0]])console.log(typeof json)_this.dealFile(_this.analyzeData(json)) // analyzeData: 解析导入数据}if (this.rABS) {reader.readAsArrayBuffer(f)} else {reader.readAsBinaryString(f)}},downloadExl: function (json, downName, type) { // 导出到excellet keyMap = [] // 获取键for (let k in json[0]) {keyMap.push(k)}console.info('keyMap', keyMap, json)let tmpdata = [] // 用来保存转换好的jsonjson.map((v, i) => keyMap.map((k, j) => Object.assign({}, {v: v[k],position: (j > 25 ? this.getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)}))).reduce((prev, next) => prev.concat(next)).forEach(function (v) {tmpdata[v.position] = {v: v.v}})let outputPos = Object.keys(tmpdata) // 设置区域,比如表格从A1到D10let tmpWB = {SheetNames: ['mySheet'], // 保存的表标题Sheets: {'mySheet': Object.assign({},tmpdata, // 内容{'!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] // 设置填充区域})}}let tmpDown = new Blob([this.s2ab(XLSX.write(tmpWB,{bookType: (type === undefined ? 'xlsx' : type), bookSST: false, type: 'binary'} // 这里的数据是用来定义导出的格式类型))], {type: ''}) // 创建二进制对象写入转换好的字节流var href = URL.createObjectURL(tmpDown) // 创建对象超链接this.outFile.download = downName + '.xlsx' // 下载名称this.outFile.href = href // 绑定a标签this.outFile.click() // 模拟点击实现下载setTimeout(function () { // 延时释放URL.revokeObjectURL(tmpDown) // 用URL.revokeObjectURL()来释放这个object URL}, 100)},analyzeData: function (data) { // 此处可以解析导入数据return data},dealFile: function (data) { // 处理导入的数据console.log(data[0], '处理导入的数据')this.imFile.value = ''this.fullscreenLoading = falseif (data.length <= 0) {this.errorDialog = truethis.errorMsg = '请导入正确信息'} else {this.excelData = data.map(item => {const arrItem = {name: '',size: '',taste: '',price: '',remain: ''}//将excel文件的标题名称转换,将数据格式转换成数组显示格式for (let key in item) {if (key === '名称') {arrItem.name = item[key]} else if (key === '分量') {arrItem.size = item[key]} else if (key === '口味') {arrItem.taste = item[key]} else if (key === '单价(元)') {arrItem.price = item[key]} else if (key === '剩余(份)') {arrItem.remain = item[key]}}return arrItem})}},s2ab: function (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},getCharCol: function (n) { // 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。let s = ''let m = 0while (n > 0) {m = n % 26 + 1s = String.fromCharCode(m + 64) + sn = (n - m) / 26}return s},fixdata: function (data) { // 文件流转BinaryStringvar o = ''var l = 0var w = 10240for (; l < data.byteLength / w; ++l) {o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))}o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))return o}}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
.el-table th>.cell {text-align: center}.button {margin-bottom: 20px}
</style>

实现导入功能图片:


js-xlsx的使用

纯前端导入excel表格数据相关推荐

  1. vue3.0 + xlsx 实现纯前端生成excel表格

    vue3.0 + xlsx 实现纯前端生成excel表格 1.安装依赖 npm install xlsx --save 2.导入依赖 import * as XLSX from 'xlsx' // V ...

  2. vue下载excel表格模板和导入excel表格数据

    vue下载excel表格模板和导入excel表格数据 vue制作excel表格模板给前端下载 vue制作excel表格模板给前端下载 最近有个需求,需要导入excel表格,并且还需要制作模板给用户下载 ...

  3. php导入excel表格数据,php页面导入excel表格数据-php导入excel 怎么获取excel表格数据...

    PHP如何导出当前页面中的表格至Excel 常用的用PHP读取EXCEL的方法有以下三种,各自有各自的优缺点.个人推荐用第三种方法,因为它可以跨平台使用. 1. 以.csv格式读取 将.xls转换成. ...

  4. php excel导入数据库显示乱码,php修改excel表格数据库数据格式-使用phpexcel导入excel表格数据到MYSQL,乱码怎么解决...

    PHP 用PHPExcel往数据库导入大量数据 估计0是null,所以不显示了,可以换个思路,让他显示为字符串 $number = 0; echo ''.$number 原生PHP代码实现excel导 ...

  5. html5生成excel,H5纯前端生成Excel表格

    H5纯前端生成Excel表格方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 var arr = [ 14 { 15 "姓名":"喵喵喵" ...

  6. 导入Excel表格数据(一)

    开发工具与关键技术:VS+导入Excel表格 作者: 李伙 撰写时间: 2019年6月3日 在学习MVC过程中,如果我们需要录入某条数据时可以利用新增的方法把我们的数据录入进去,而录入的数据比较多的时 ...

  7. java操作mysql导表_Java实现批量导入excel表格数据到数据库中的方法

    本文实例讲述了Java实现批量导入excel表格数据到数据库中的方法.分享给大家供大家参考,具体如下: 1.创建导入抽象类 package com.gcloud.common.excel; impor ...

  8. 纯前端实现excel表格导入导出

    前言 github: https://github.com/stardew516... 以往做excel表格下载功能的时候,都是后端生成好表格后,存储在某个地方,然后给前端一个链接,前端使用a标签加d ...

  9. 如何在ex表格导入php_怎么使用php把表格中的数据导入到excel中,php如何快速导入excel表格数据...

    php怎么导入大量数据的excel php导出数据的Excel: PHP从数据库分多次读取100万行记录,和分将100万入文本文件都没问题 Excel可以支100万行记录,Excel 2003最大支持 ...

最新文章

  1. Exchange服务器系列课程之四--管理Exchange收件人
  2. python之父叫什么-Python之父谈Python的未来形式
  3. centos 并发请求数_Linux Shell多进程并发以及并发数控制
  4. happy card 完全背包dp
  5. 10 个常见的 Linux 终端仿真器
  6. java.io,PrintWriter可以用来创建一个文件并向本文文件写入数据
  7. PowerDesigner怎样才能在修改表的字段Name的时候Code不自动跟着变
  8. python3的安装_python3快速安装
  9. ext2文件系统之ext2_lookup函数源代码分析
  10. 计算机组成原理中CPI、MIPS、CPU执行时间、主频等计算
  11. Virtual Private Network(虚拟专用网络)详解
  12. 视频后期剪辑,怎样在视频画面上添加滚动字幕
  13. linux c python,Python 不是 C
  14. 解决filebeat 报错 Failed to publish events
  15. 在Winform中上传文件的工具类-ResourceMgr
  16. jqgrid中treegrid记录属性lft和rgt的计算
  17. 管家婆软件批量导入商品信息教程
  18. EVC实现WIN CE下截屏
  19. matlab autocorr说明,matlab中的xcorr和autocorr_matlab培训
  20. 增值电信业务都有哪些种类

热门文章

  1. NLG评估指标chrF、chrF++介绍
  2. WaitForSingleObject -- setevent 讲解与编程示例
  3. Linux 网络适配,ping命令,更改自己的IP地址
  4. 2020神舟几号发射_中国宇宙飞船发射到神州几号了
  5. 宗镜录略讲——南怀瑾老师——系列2
  6. 1089 烽火传递(单调队列优化)
  7. 【DCT】基于simulink的dual clutch Transmission双离合器变速器系统仿真系统详细解析
  8. 清华张钹院士专刊文章:迈向第三代人工智能(全文收录)
  9. TSINGSEE青犀视频RTMP推流摄像头焦距与监控距离存在什么关系?
  10. 运动目标检测ViBe算法的armadillo实现