前言:
因为做微信小程序云开发,在云开发导入数据需要json格式的,然鹅我们市场部的小姐姐给我的文档是excel文件,导致我需要去手动录入,后来在网上搜了下。
有通过复制excel文件内容粘贴后生成的:http://www.jsonla.com/excel2json/
有通过上传excel文件后生成的json文件下载却需要付费的:http://www.yzcopen.com/doc/exceljson

搞得那么难受不如自己写一个,效果图如下:

使用地址:https://test-mars.qtshe.com/tool/excelToJson

首先 我们推荐下两个插件,
一个是复制的插件:vue-clipboard2
一个处理xlsx的插件:XLSX

先给它安排上:

 cnpm i xlsx --save-dev

安装后在当前页面引入:

import * as XLSX from 'xlsx';

这里我使用了iview的框架,就是为了好看用,没其他效果。
我们先编写页面布局样式:

<template>
<div><Card title="导入EXCEL"><Row><Upload action="" :before-upload="handleBeforeUpload" accept=".xls, .xlsx"><Button icon="ios-cloud-upload-outline" :loading="uploadLoading" @click="handleUploadFile">上传文件</Button></Upload></Row><Row><div class="ivu-upload-list-file" v-if="file !== null"><Icon type="ios-stats"></Icon>{{ file.name }}<Icon v-show="showRemoveFile" type="ios-close" class="ivu-upload-list-remove" @click.native="handleRemove()"></Icon></div></Row><Row><transition name="fade"><Progress v-if="showProgress" :percent="progressPercent" :stroke-width="2"><div v-if="progressPercent == 100"><Icon type="ios-checkmark-circle"></Icon><span>成功</span></div></Progress></transition></Row></Card><Row class="margin-top-10"><Table :columns="tableTitle" :height="300" :data="tableData" :loading="tableLoading"></Table></Row><Row class="margin-top-10" v-if="content"><Input v-model="content" :rows="10" type="textarea" placeholder="Enter something..." /><Button type="info" style="margin-top: 20px;" @click="copy(content)">复制</Button><Button type="success" style="margin-top: 20px; margin-left: 10px;" @click="saveJSON">点击下载</Button></Row>
</div>
</template>

引入excel.js文件,以下代码为该文件内容
import excel from ‘@/libs/excel’

/* eslint-disable */
import XLSX from 'xlsx';function auto_width(ws, data){/*set worksheet max width per col*/const colWidth = data.map(row => row.map(val => {/*if null/undefined*/if (val == null) {return {'wch': 10};}/*if chinese*/else if (val.toString().charCodeAt(0) > 255) {return {'wch': val.toString().length * 2};} else {return {'wch': val.toString().length};}}))/*start in the first row*/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;
}function json_to_array(key, jsonData){return jsonData.map(v => key.map(j => { return v[j] }));
}// fix data,return string
function fixdata(data) {let o = ''let l = 0const 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
}// get head from excel file,return array
function get_header_row(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 */var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */var hdr = 'UNKNOWN ' + C // <-- replace with your desired defaultif (cell && cell.t) hdr = XLSX.utils.format_cell(cell)headers.push(hdr)}return headers
}export const export_table_to_excel= (id, filename) => {const table = document.getElementById(id);const wb = XLSX.utils.table_to_book(table);XLSX.writeFile(wb, filename);/* the second way */// const table = document.getElementById(id);// const wb = XLSX.utils.book_new();// const ws = XLSX.utils.table_to_sheet(table);// XLSX.utils.book_append_sheet(wb, ws, filename);// XLSX.writeFile(wb, filename);
}export const export_json_to_excel = ({data, key, title, filename, autoWidth}) => {const wb = XLSX.utils.book_new();data.unshift(title);const ws = XLSX.utils.json_to_sheet(data, {header: key, skipHeader: true});if(autoWidth){const arr = json_to_array(key, data);auto_width(ws, arr);}XLSX.utils.book_append_sheet(wb, ws, filename);XLSX.writeFile(wb, filename + '.xlsx');
}export const export_array_to_excel = ({key, data, title, filename, autoWidth}) => {const wb = XLSX.utils.book_new();const arr = json_to_array(key, data);arr.unshift(title);const ws = XLSX.utils.aoa_to_sheet(arr);if(autoWidth){auto_width(ws, arr);}XLSX.utils.book_append_sheet(wb, ws, filename);XLSX.writeFile(wb, filename + '.xlsx');
}export const read = (data, type) => {/* if type == 'base64' must fix data first */// const fixedData = fixdata(data)// const workbook = XLSX.read(btoa(fixedData), { type: 'base64' })const workbook = XLSX.read(data, { type: type });const firstSheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[firstSheetName];const header = get_header_row(worksheet);const results = XLSX.utils.sheet_to_json(worksheet);return {header, results};
}export default {export_table_to_excel,export_array_to_excel,export_json_to_excel,read
}
点击上传前校验下文件格式,如果格式正确则进行转换操作:
handleBeforeUpload(file) {const fileExt = file.name.split('.').pop().toLocaleLowerCase()if (fileExt === 'xlsx' || fileExt === 'xls') {this.readFile(file)this.readExcel(file)this.file = file} else {this.$Notice.warning({title: '文件类型错误',desc: '文件:' + file.name + '不是EXCEL文件,请选择后缀为.xlsx或者.xls的EXCEL文件。'})}return false},
接着咱们开始写点击上传后读取的操作:
// 读取文件readFile(file) {const reader = new FileReader()reader.readAsArrayBuffer(file)reader.onloadstart = e => {this.uploadLoading = truethis.tableLoading = truethis.showProgress = true}reader.onprogress = e => {this.progressPercent = Math.round(e.loaded / e.total * 100)}reader.onerror = e => {this.$Message.error('文件读取出错')}reader.onload = e => {this.$Message.info('文件读取成功')const data = e.target.resultconst {header,results} = excel.read(data, 'array')const tableTitle = header.map(item => {return {title: item,key: item}})this.tableData = resultsthis.tableTitle = tableTitlethis.uploadLoading = falsethis.tableLoading = falsethis.showRemoveFile = true}},readExcel(file) {// 表格导入const fileReader = new FileReader()fileReader.onload = ev => {try {const data = ev.target.resultconst workbook = XLSX.read(data, {type: "binary"})const wsname = workbook.SheetNames[0] // 取第一张表const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]) // 生成json表格内容this.jsonData = wsthis.content = JSON.stringify(ws)} catch (e) {return false}}fileReader.readAsBinaryString(file)},
最后加上复制的操作,以及点击下载生成后的json文件。
copy(content) {this.$copyText(content).then((e) => {this.$Message.success('复制成功')}, function(e) {this.$Message.error('复制失败,请手动复制')})},saveJSON() {if (!this.jsonData) {alert('data is null')return}let filename = 'data.json'if (typeof this.jsonData === 'object') {this.jsonData = JSON.stringify(this.jsonData, undefined, 4)}var blob = new Blob([this.jsonData], {type: 'text/json'})var e = document.createEvent('MouseEvents')var a = document.createElement('a')a.download = filenamea.href = window.URL.createObjectURL(blob)a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)a.dispatchEvent(e)}

以上就是一个完整的在vue里实现excel转json文件的方案,如有不懂的可以下面留言。
完整代码地址如下:
https://github.com/minchangyong/excelToJSON

Vue里如何实现excel转json的功能相关推荐

  1. Untiy编辑器——Excel转Json工具

    Unity编辑器扩展--Excel转Json工具 功能:将选中的Excel文件转换为JSON/CSV/XML格式,(转JSON)可自定义变量所在行数,变量类型所在行数,数据起始行数和输出路径. 当前只 ...

  2. Vue实现在线编辑excel、导入、导出

    文章目录 概要 整体架构流程 小结 概要 Vue实现在线编辑excel.导入.导出 整体架构流程 luckysheet文档地址 exceljs文档地址 1.npm安装依赖 npm i exceljs ...

  3. Excel转Json工具(支持GUI模式和命令行模式)

    刚出来工作,进了一家公司.发现公司游戏里所有数据都是通过策划配表,然后程序读表的形式来实现的. 所以想在自己写的框架上用上,所以去找了一下Excel转Json的工具. 找到一个很强大的工具,但是我有个 ...

  4. Vue 里,多级菜单要如何设计才显得专业?

    老生常谈了! 虽然我们是 Java 猿,但是写起来前端代码也不含糊!今天我想来和大家聊聊这个前端的动态菜单,要如何设计才显得专业!还是以我们的 TienChin 项目为例,大家一起来看看. 先来一张截 ...

  5. Excel转Json

    参考: Excel2JSON Excel转JSON Excel另存为JSON的技巧  (office的插件) excel2json 游戏程序员的自我修养 (其他人写的工具) Excel转JSON格式- ...

  6. 一个基于C#开发的Excel转Json工具

    Json在程序开发中是非常常用的数据格式,对于程序员来说,阅读和编辑Json都没有什么问题,但其他人就不是那么方便了.比如配置游戏数据:游戏角色.技能.道具的名称,策划书往往都是通过Excel配置,这 ...

  7. 强大易用的网页在线excel转json工具,值得一看

    亲测可用,若有疑问请私信 强大易用的网页在线excel转json工具,值得一看 很多游戏公司或者软件公司,客户端里一般无法读取策划写的excel配置表,需要先转成可以用的格式,例如json,xml格式 ...

  8. 在Unity上编写一个小工具--Excel导出Json

    这是个Excel导出Json的工具类,需要放进Editor文件夹里,之后就可以在菜单上点击导出了 这个工具运行需要一个插件----NPOI,这个是用来读取excel文件的,这个插件的dll文件可以去网 ...

  9. excel 读取json中指定字段值

    excel 读取json中指定字段值 FIND语法 FIND(find_text, within_text, [start_num]) FIND实例一 FIND实例二 MID语法 MID(text, ...

最新文章

  1. 2020年数据科学领域4个最热门的趋势
  2. linux tcpdump monitor模式 抓不到包 解决办法
  3. 配置数据库引擎BDE(Borland DataBase Engine)
  4. IO:同步,异步,阻塞,非阻塞
  5. C语言程序练习-L1-003 个位数统计 (15分)
  6. linux搜索指定文件夹里文件是否存在,Linux文件操作之文件查询与搜索命令详解...
  7. python pprint_【Python】输入和输出
  8. 随想录(关于ucore)
  9. 【leecode】小练习(简单8题)
  10. 华为鸿蒙os升级怎么升,华为鸿蒙OS2.0系统怎么升级
  11. 中兴智能视觉大数据报道:人脸识别画上浓妆也不耽误识别
  12. 【Storm总结-6】Twitter Storm: DRPC简介
  13. 史上最全的Nokia3230参数大全
  14. python--图像分割GraphCut
  15. 同济大学计算机直博生条件,同济大学攻读博士学位研究生培养工作规定(2016年修订).doc...
  16. 金融衍生品软件产品设计必备知识——外汇相关知识
  17. 人的一生,到底在追求什么呢?
  18. 穿越派·派盘 + 思源笔记 = 私人笔记本
  19. 解决Windows 10控制面板里原本的索引选项变成Indexing Option Control Panel (32-bit)及空白图标的问题
  20. Unity Application Block 1.2 学习笔记(zhuan)

热门文章

  1. ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程(LWIP WEB有惊喜)
  2. 【分享】在集简云如何查看我的应用授权是否过期?
  3. jquery中添加属性和删除属性--------------------
  4. 【C++程序设计教程(第三版)钱能】 学习笔记 上半部/C++过程化语言基础
  5. 专访简书刘英滕 | 未来,以「产品设计」定位自己的设计师会越来越多
  6. 运维部知识库管理办法V1版
  7. autoit对于web中flash控件的操作
  8. poj 1264 hdu 1616 SCUD Busters 凸包+面积计算
  9. 体力劳动?脑力劳动?
  10. 电脑上office2010安装包下载安装教程