vue 导入excel并转为json发送给后端

vue 导入excel并转为json发送给后端

可以处理.xlsx , .csv , .xls 格式的文件

  1. 安装插件
# 用于操作excel .xlsx  .xls
npm install xlsx --save    # papaparse用于操作.csv 文件 jschardet编码解析
npm install papaparse --save   
npm install jschardet --save    
  1. 完整代码
<template>
<div><!-- 1. 上传 导入 --><el-upload action accept=".xlsx,.csv,.xls" :auto-upload="false" :on-change="handleImportFile" :show-file-list="false"><el-button icon="el-icon-upload2">导入</el-button></el-upload>
</div>
</template><script>
// 2. 引入插件
// import xlsx from "xlsx";  // 使用这种方式引入时报错了
import * as xlsx from "xlsx";
import Papa from "papaparse";export default {data() {return {// 3.添加属性changeCnToEn: {姓名: "name",年龄: 'age'},};},method: {// 4. 处理选择文件回调async handleImportFile() {// 获取文件类型const fileType = e.name.split(".")[e.name.split(".").length - 1];let excelArr = "";switch (fileType) {case "csv":excelArr = await this.importCsv(e.raw);break;case "CSV":excelArr = await this.importCsv(e.raw);break;case "xlsx":excelArr = await this.importXls(e.raw);break;case "xls":excelArr = await this.importXls(e.raw);break;}console.log(excelArr); // 数组对象 就是Excel里的数据setTimeout(() => {// 发给后端// this.httpUpload(excelArr);}, 500);},// 7.  请求后端接口httpUpload(excelArr) {const params = {xxx: excelArr, // 表格数据}request({url: '',method: 'post',params: leadData}).then(res => {console.log(res, 'res');})},// 5. 解析excel为JSON // 上传xlsx xls文件async importXls(file) {if (!file) return;let data = await this.readFile(file);// type :'binary' 类型为二进制let eleData = xlsx.read(data, {type: "binary"});let eleDataSheet = eleData.Sheets[eleData.SheetNames[0]];eleData = xlsx.utils.sheet_to_json(eleDataSheet); // 将解析出的数据转换为json格式(xlsx自带的方法)// eleData = eleData.length >1? eleData[1] : eleData[0]const arr = [];console.log(Object.keys(this.changeCnToEn));eleData.forEach((item) => {const userInfo = {};Object.keys(item).forEach((key) => {userInfo[this.changeCnToEn[key]] = item[key];});arr.push(userInfo);});return arr;},// 把文件按照二进制方式读取readFile(file) {return new Promise((resolve) => {let reader = new FileReader();reader.readAsBinaryString(file);reader.onload = (ev) => {resolve(ev.target.result);};});},// 6. 解析csv文件为JSON// 上传文件解析csvasync importCsv(file) {return new Promise((resolve) => {let fReader = new FileReader();fReader.readAsDataURL(file);fReader.onload = (evt) => {// 检查编码let encoding = this.checkEncoding(evt.target.result);// 将csv转换成二维数组Papa.parse(file, {encoding,complete: (res) => {// UTF8 \r\n与\n混用时有可能会出问题let data = res.data;if (data[data.length - 1] == "") {//去除最后的空行data.pop();}const dataKeys = Object.values(this.changeCnToEn);let resArr = [];data.forEach((element, index) => {const resInfo = {};if (index > 0) {dataKeys.forEach((item, j) => {resInfo[item] = element[j];});resArr.push(resInfo);}});console.log(resArr);// console.log(data)resolve(resArr);},});};});},// 编码转换checkEncoding(base64Str) {// 这种方式得到的是一种二进制串let str = atob(base64Str.split(";base64,")[1]);// 要用二进制格式const jschardet = require("jschardet");let encoding = jschardet.detect(str);encoding = encoding.encoding;if (encoding === "windows-1252") {encoding = "ANSI";}return encoding;},}};
</script>

抽取工具类

  • excelUtil.js
import * as xlsx from "xlsx";
import Papa from "papaparse";// 使用:
/**
const excelArr = await xlsxToJson(file.raw);
const excelArr = await csvToJson(file.raw);
console.log(excelArr); // 数组对象 就是Excel里的数据*//*** 将xlsx, xls格式excel文件转为json数据* @param {*} file excel文件* @param {*} tableHeadCnToEn excel表头文字和字段的对应  示例: { 姓名: 'name', 年龄: 'age'  }* @returns */
export async function xlsxToJson(file, tableHeadCnToEn) {if (!file) return;// 读取file文件的内容(转换为json格式)let data = await readFile(file);// console.log(data); //解析出的二进制文件// type :'binary' 类型为二进制let eleData = xlsx.read(data, { type: "binary" });let eleDataSheet = eleData.Sheets[eleData.SheetNames[0]];eleData = xlsx.utils.sheet_to_json(eleDataSheet); // 将解析出的数据转换为json格式(xlsx自带的方法)const arr = [];eleData.forEach((item) => {const userInfo = {};Object.keys(item).forEach((key) => {userInfo[tableHeadCnToEn[key]] = item[key];});arr.push(userInfo);});return arr;
}/*** 将csv格式excel文件转为json数据* @param {*} file excel文件* @param {*} tableHeadCnToEn excel表头文字和字段的对应  示例: { 姓名: 'name', 年龄: 'age'  }* @returns */
export async function csvToJson(file, tableHeadCnToEn) {return new Promise((resolve) => {let fReader = new FileReader();fReader.readAsDataURL(file);fReader.onload = (evt) => {// 检查编码let encoding = checkEncoding(evt.target.result);// 将csv转换成二维数组Papa.parse(file, {encoding,complete: (res) => {// UTF8 \r\n与\n混用时有可能会出问题let data = res.data;if (data[data.length - 1] == "") {//去除最后的空行data.pop();}const dataKeys = Object.values(tableHeadCnToEn);let resArr = [];data.forEach((element, index) => {const resInfo = {};if (index > 0) {dataKeys.forEach((item, j) => {resInfo[item] = element[j];});resArr.push(resInfo);}});resolve(resArr);},});};});
}// 把文件按照二进制方式读取
function readFile(file) {return new Promise((resolve) => {let reader = new FileReader();reader.readAsBinaryString(file);reader.onload = (ev) => {resolve(ev.target.result);};});
}// 编码转换
function checkEncoding(base64Str) {// 这种方式得到的是一种二进制串let str = atob(base64Str.split(";base64,")[1]);// 要用二进制格式const jschardet = require("jschardet");let encoding = jschardet.detect(str);encoding = encoding.encoding;if (encoding === "windows-1252") {encoding = "ANSI";}return encoding;
}
  • 使用工具类方式 实现excel文件转json, 完整代码
<template>
<div><!-- 1. 上传 导入 --><el-upload action accept=".xlsx,.csv,.xls" :auto-upload="false" :on-change="handleImportFile" :show-file-list="false"><el-button icon="el-icon-upload2">导入</el-button></el-upload>
</div>
</template><script>
import { xlsxToJson, csvToJson } from "@/utils/excelUtil.js";
export default {data() {return {// 3.添加属性changeCnToEn: {姓名: "name",年龄: 'age'},};},method: {// 4. 处理选择文件回调async handleImportFile() {// 获取文件类型const fileType = e.name.split(".")[e.name.split(".").length - 1];let excelArr = "";switch (fileType) {case "csv":excelArr = await csvToJson(e.raw, this.changeCnToEn);break;case "CSV":excelArr = await csvToJson(e.raw, this.changeCnToEn);break;case "xlsx":excelArr = await xlsxToJson(e.raw, this.changeCnToEn);break;case "xls":excelArr = await xlsxToJson(e.raw, this.changeCnToEn);break;}console.log(excelArr); // 数组对象 就是Excel里的数据setTimeout(() => {// 发给后端// this.httpUpload(excelArr);}, 500);},// 7.  请求后端接口httpUpload(excelArr) {const params = {xxx: excelArr, // 表格数据}request({url: '',method: 'post',params: leadData}).then(res => {console.log(res, 'res');})},}};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp uni-datetime-picker 日期和光标靠右

如果想在uni-datetime-picker组件中将日期和光标靠右&#xff0c;您可以使用自定义样式来实现。首先&#xff0c;您需要在页面的样式文件中定义一个类&#xff0c;用于定制uni-datetime-picker组件的样式。例如&#xff0c;你可以在App.vue或者页面的样式文件中添加以下代码&am…

vi 编辑器入门到高级

vi 编辑器的初级用法vi 编辑器的工作模式1. 命令模式2. 文本输入模式3. 状态行vi 工作模式切换存储缓冲区 vi 编辑器命令1. 启动 vi2. 文本输入3. 退出 vi4. 命令模式下的 光标移动5. 命令模式下的 文本修改6. 从 命令模式 进入 文本输入模式7. 搜索字符串8. vi 在线帮助文档 v…

有血有肉的PPT

1、PPT是Powerpoint缩写 2、引申的含义是Powerpoint Power(力量/能量&#xff09; Point(观点/要点) 3、用PPT做的文档是讲演稿&#xff0c;讲演的内容要有力度&#xff0c;之所以要去演讲是为了能够影响受众 4、其次演讲稿上的内容要列出要点、表明观点&#xff0c;所以一般P…

Docker前置背景:架构演进

"但人类都环绕星球&#xff0c;我更愿追随彗星漂流~" 在正式引入架构演进之前&#xff0c;本小节会对一些比较重要、常见的概念进行介绍。 基本概念: (1)应用(application)/系统(system) 为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比&…

docker使用

Docker学习参考文档&#xff1a;https://yeasy.gitbook.io/docker_practice 一、 Docker基本操作 1.1 Docker安装 1.1.1 Ubuntu安装 卸载旧版本 Docker 的旧版本被称为 docker&#xff0c;docker.io 或 docker-engine 。如果已安装&#xff0c;请卸载它们&#xff1a; $ sudo…

12 | B站视频播放量分析

本次探讨将聚焦于B站视频播放量的深度分析,从不同角度解读播放量背后所蕴含的意义,剖析其受影响因素,并探讨播放量对内容创作者和平台发展的重要意义。让我们一同走进数据的世界,解码播放量的奥秘,探寻数字背后的故事。 # 本案例中大部分绘图使用序列化后数据;相应序列化…

html根据图片变换背景色

html根据图片变换背景色 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.item {width: 50%;height: 80vh;margin: 0 auto;border: 1px solid red;}</style> </head><body>…

spring之AOP简单介绍

1.AOP的概念 AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程&#xff0c;是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的抽象&#xff0c;…

什么?200?跨域?

情景复现 今天我遇到了一件很奇怪的事情就是&#xff0c;当我请求后端网关&#xff0c;然后通过网关去请求相应的服务&#xff0c;都进行了跨域处理 但是&#xff0c;奇怪的是我在请求的时候&#xff0c;回来的响应码是200&#xff0c;但是报错了&#xff0c;报的还是200的同…

UEFI+win7+多系统安装

物理主机先安装的Windows10&#xff0c;同时需要安装Windows7的双系统 1.在https://next.itellyou.cn/下载Windows 7 ISO 2.使用Rufus制作U盘安装盘 注意一定要选择FAT32格式&#xff0c;否则安装过程会卡住 3.由于官方纯净的安装镜像默认不支持UEFI安装&#xff0c;有两种解决…

CountDownLatch 源码解读

来看下CountDownLatch&#xfffd;&#xff0c;主要用于线程间通信&#xff0c;await就是阻塞&#xff0c;等待别人执行countDown把定义的数字减完&#xff0c;就可以继续执行了&#xff0c;那么去看下内部怎么实现的 CountDownLatch countDownLatch new CountDownLatch(1); …

时间管理黑科技:Python中datetime函数助你事半功倍

介绍 在Python中&#xff0c;datetime模块是处理日期和时间的标准库。它提供了一系列功能强大的函数和类&#xff0c;用于处理日期、时间、时间间隔等。本文将深入探讨datetime模块的使用方法&#xff0c;从入门到精通。 目录 导入datetime模块获取当前日期和时间创建自定义…

C++ 混合Python编程 及 Visual Studio配置

文章目录 需求配置环节明确安装的是64位Python安装目录 创建Console C ProjectCpp 调用 Python Demo 参考 需求 接手了一个C应用程序&#xff0c;解析csv和生成csv文件&#xff0c;但是如果要把多个csv文件合并成一个Excel&#xff0c;分布在不同的Sheet中&#xff0c;又想在一…

计算 Nginx 日志的PV和UV

计算 Nginx 日志的 PV&#xff08;页面浏览量&#xff09;和 UV&#xff08;独立访客数&#xff09;&#xff0c;你需要使用一些工具和技术。 PV&#xff08;页面浏览量&#xff09;是指网站的所有页面被访问的总次数&#xff0c;而 UV&#xff08;独立访客数&#xff09;则是指…

代码随想录算法训练营day28 | 93. 复原 IP 地址,78. 子集,90. 子集 II

目录 93. 复原 IP 地址 78. 子集 90. 子集 II 93. 复原 IP 地址 难度&#xff1a;medium 类型&#xff1a;回溯&#xff0c;切割 思路&#xff1a; 切割问题类似于组合问题&#xff1b; 需要注意的事&#xff0c;我们使用count来作为递归终止条件&#xff0c;count统计的事…

TIA博途软件无法搜索到CPU的解决办法汇总

TIA博途软件无法搜索到CPU的解决办法汇总 1. 检查电脑操作系统的兼容性 西门子对每个主要软件都会进行官方的兼容性测试过,其中重要一项是和 Windows 操作系统的兼容性,需要根据软件版本和 Windows 版本核对,如果不匹配,可能会有问题。 每个版本软件的安装条件可以参考以下…

沃罗诺伊图(Voronoi):帝国边界划分问题【2/2】

目录 一、说明 二、帝国边界划分问题 三、voronoi的正规定义 3.1 最简单的voronoi情况 3.2 在距离空间的数学描述 3.3 不同距离空间所得 Voronoi 单元不同 四、代码和库 4.1 算法库 4.2 参数说明 4.3 调用方法 五、后记 一、说明 Voronoi 单元也称为泰森多边形。 …

【LeetCode】1572.矩阵对角线元素的和

题目 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&a…

Mysql 复杂查询丨联表查询

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; JOIN&#xff08;联表查询&#xff09; 联表查询&#xff08;Join&#xff09;是一种在数据库中使用多个表进行关联查询的操作。它通过使用 JOIN 关键字将多个表连接在…

Java 跨平台多媒体处理样例

代码 import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; import ws.schild.jave.Encoder; import ws.schild.jave.Multime…